zoukankan      html  css  js  c++  java
  • wikioi1191 数轴染色


    在一条数轴上有N个点,分别是1~N。一开始所有的点都被染成黑色。接着
    我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色。请输出每个操作执行后
    剩余黑色点的个数。

    输入一行为N和M。下面M行每行两个数Li、Ri

    输出M行,为每次操作后剩余黑色点的个数。

    10 3
    3 3
    5 7
    2 8

    9
    6
    3

    数据限制
    对30%的数据有1<=N<=2000,1<=M<=2000
    对100%数据有1<=Li<=Ri<=N<=200000,1<=M<=200000

    为了明天省冬数据结构不会挂的太惨,随便找一题线段树打打

    我发现我是傻X,因为ask函数写到一半才醒悟过来只要输出tree[1].sum……毕竟我智商低

    #include<cstdio>
    struct trees{
    	int l,r,ls,rs,sum;
    	bool tag;
    }tree[1000001];
    int n,m,ll,rr,treesize;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void update(int x)
    {
    	tree[x].sum=tree[tree[x].ls].sum+tree[tree[x].rs].sum;
    	tree[x].tag=tree[tree[x].ls].tag&&tree[tree[x].rs].tag;
    }
    inline void buildtree(int l,int r)
    {
    	if (r<l) return;
    	int now=++treesize;
    	tree[now].l=l;tree[now].r=r;
    	if(l==r)
    	{
    	  tree[now].sum=1;
    	  return;
    	}
    	int mid=(l+r)>>1;
    	tree[now].ls=treesize+1;
    	buildtree(l,mid);
    	tree[now].rs=treesize+1;
    	buildtree(mid+1,r);
    	update(now);
    }
    inline void mark(int now,int x,int y)
    {
    	if (tree[now].tag) return;
    	int l=tree[now].l,r=tree[now].r;
    	if(l==r)
    	{
    		tree[now].sum=0;
    		tree[now].tag=1;
    		return;
    	}
    	int mid=(l+r)>>1;
    	if (mid>=y) mark(tree[now].ls,x,y);
    	else if (mid<x) mark(tree[now].rs,x,y);
    	else
    	{
    		mark(tree[now].ls,x,mid);
    		mark(tree[now].rs,mid+1,y);
    	}
    	update(now);
    }
    int main()
    {
    	n=read();m=read();
    	buildtree(1,n);
    	for (int i=1;i<=m;i++)
    	{
    		ll=read();rr=read();
    		mark(1,ll,rr);
    		printf("%d
    ",tree[1].sum);
    	}
    }



    ——by zhber,转载请注明来源
  • 相关阅读:
    洛谷 P1908 逆序对(树状数组解法)
    洛谷 P1908 逆序对(归并排序解法)
    洛谷 P3368 【模板】树状数组 2(区间修改点查询)
    POJ 2833 The Average(优先队列)
    POJ 2255 Tree Recoveryw(二叉树)
    洛谷 P1540 机器翻译(队列)
    POJ 1686 Lazy Math Instructor(栈)
    队列中取最大值操作
    相邻元素差的绝对值都是1,在这样的数组中找目标元素
    双栈队列实现快速获取队列最大值最小值
  • 原文地址:https://www.cnblogs.com/zhber/p/4036060.html
Copyright © 2011-2022 走看看