CodeVS 数轴染色

#include<cstdio>
#include<algorithm>
using namespace std;

#define lson rt<<1
#define rson rt<<1|1
const int maxn=200010;
int xd[maxn*4],tag[maxn*4],all,n;

void pushdown(int l,int r,int rt)
{
	if(tag[rt]==1)
	{
		xd[lson]=xd[rson]=1;
		tag[lson]=tag[rson]=1;
		tag[rt]=0;
	}
}

void update(int l,int r,int rt,int a,int b)
{
	int mid=(l+r)>>1;
	if(a<=l && b>=r)
	{
		if(xd[rt]==0)
		{
			xd[rt]=1;
			all-=r-l+1;
			tag[rt]=1;
		}
		else if(xd[rt]==1)
		{
			return;
		}
		else
		{
			xd[rt]=1;
			update(l,mid,lson,a,b);
			update(mid+1,r,rson,a,b);
		}
		return;
	}

	pushdown(l,r,rt);

	if(a<=mid){ update(l,mid,lson,a,b);}
	if(b>=mid+1) {update(mid+1,r,rson,a,b);}
	if(xd[lson]==1 && xd[rson]==1)
	{
		xd[rt]=1;
	}
	else if(xd[lson]==0 && xd[rson]==0)
	{
		xd[rt]=0;
	}
	else
	{
		xd[rt]=-1;
	}
}

int main()
{
	scanf("%d%d",&all,&n);
	int nn=all;
	for(int i=1,a,b;i<=n;i++)
	{
		scanf("%d%d",&a,&b);
		update(1,nn,1,a,b);
		printf("%d\n",all);
	}
        return 0;
}

  

时间: 2024-10-13 03:43:21

CodeVS 数轴染色的相关文章

codevs 1191 数轴染色

1191 数轴染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输

【codevs1191】数轴染色 线段树 区间修改+固定区间查询

[codevs1191]数轴染色 2014年2月15日4317 题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 Sample Input 10 33 3

1191 数轴染色

1191 数轴染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 S

codevs 1191 数轴染色 区间更新加延迟标记

题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 Sample Input 10 33 35 72 8 样例输出 Sample Output 963 数据

【数轴染色+并查集路径压缩+加速】

http://codevs.cn/problem/1191/ [思路] 每次我们染了一个区间,下一次如果还要染这个区间或者它的子区间的话,我们就不用处理了.这样我们可以把每一个区间抽象成一个点,用并查集来维护.合并时将[L,R]区间全部合并,[L,R]区间的每个点的父节点都通过路径合并变成L-1,然后n–.这样每个点只会被合并一次,复杂度O(nα(n)) ,跑得很快. 如 3 3 fa[3]=2,操作一次 5 7, fa[7]=fa[6]=fa[5]=4,操作三次 2 8: fa[8]=fa[7

【CODEVS1191】数轴染色

题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 Sample Input 10 33 35 72 8 样例输出 Sample Output 963 数据

CODEVS1191|数轴染色|线段树

题目描述 Description在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数.输入描述 Input Description输入一行为N和M.下面M行每行两个数Li.Ri输出描述 Output Description输出M行,为每次操作后剩余黑色点的个数.样例输入 Sample Input10 33 35 72 8样例输出 Sample Output963数据范围及提示 Data

【codevs1191】数轴染色 序列分块

题目大意: 长度为n的序列,开始时全都是黑色的,m次操作,每次把[l,r]变成白色,求每次操作后剩下的黑点数. 分块直接做. 设rest[i]表示第i块剩下的个数,p为每个点的装填. 对于[l,r],找到l,r所处的块lblock,rblock. 把lblock+1到rblock-1的块的rest赋为0,O(√n). 然后判断一下rest[lblock]是否空,如果不空则直接扫描更新rest和p,rblock同理. 注意这里要判断一下rest,因为整体赋值的时候p没有更新. 小结:对于分块,块数

数轴染色(我个渣渣)

#include<iostream>#include<cstdio>using namespace std;struct data{    int l,r,sum;     bool tag;}tr[8500001];int n,m;void build(int k,int s,int t){    tr[k].l=s;    tr[k].r=t;    if(s==t)    {          tr[k].sum=1;          return;    }int mid