比赛 [不是Rapiz出的]农场主钦定NOIP模拟赛1 评测结果 TTTTTTTTTT
题目名称 Color the Axis 最终得分 0
用户昵称 Bravo ChaoS 运行时间 10.022 s
代码语言 C++ 内存使用 12.52 MiB
提交时间 2016-11-08 20:19:20
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
//#include<ctime>
using namespace std;

class input
{
public:
    input& operator >> (int& x)
    {
        char c=' ';x=0;
        while(c<'0' || c>'9') c=getchar();
        while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
        return *this;
    }
}in;

const int maxn=200010;

int n,m,t;

struct Node
{
    int l,r,wt;
    bool vis;
    Node(int l,int r,int wt,bool vis): l(l),r(r),wt(wt),vis(vis){}
    Node(){}
}node[maxn<<2];

void built(int x,int l,int r)
{
    node[x]=Node(l,r,0,0);
//    cout<<x<<' '<<l<<' '<<r<<endl;
    if(l==r) return;
    int mid=l+(r-l>>1);
    built(x<<1,l,mid);
    built(x<<1|1,mid+1,r);
}

int modify(int x,int l,int r)//return wt
{
    int sum=0;
    Node& nd=node[x];
    if(nd.vis) {return 0;}
    if(nd.l==nd.r)
    {
        nd.vis=1;nd.wt=1;
        return 1;
    }
    if(nd.l==l && nd.r==r)
    {
        t=nd.wt;
        nd.wt=nd.r-nd.l+1;nd.vis=1;
        return nd.wt-t;
    }
    int mid=nd.l+(nd.r-nd.l>>1);
    if(mid<l) sum=modify(x<<1|1,l,r);
    else if(mid+1>r) sum=modify(x<<1,l,r);
    else sum=modify(x<<1,l,mid)+modify(x<<1|1,mid+1,r);
    nd.wt+=sum;
    if(nd.r-nd.l+1<=nd.wt) nd.vis=1;
//        cout<<x<<' '<<nd.l<<' '<<nd.r<<' '<<nd.wt<<endl;
    return sum;
}

int main()
{
//    int a=clock();
    freopen("Axis.in","r",stdin);
    freopen("Axis.out","w",stdout);
    in>>n>>m;
    built(1,1,n);
//    cout<<"================"<<endl;
    for(int l,r;m--;)
    {
        in>>l>>r;modify(1,l,r);
        printf("%d\n",n-node[1].wt);
    }
//    int b=clock();
//    cout<<"time:  "<<b-a<<endl;
    
    return 0;
}