codevs 1191 数轴染色

Posted on 2016-01-22 22:23  ziliuziliu  阅读(194)  评论(0编辑  收藏  举报

线段树,数据水。。。

成段更新区间,然后每次dfs整棵线段树。

#include<iostream>
#include<cstdio>
#define maxn 1000005
using namespace std;
struct tree
{
int left,right;
int value;
}node[maxn];
int father[maxn],n,m,l,r,ans=0;
void build(int i,int left,int right)
{
node[i].left=left;
node[i].right=right;
node[i].value=0;
if (left==right)
{
father[left]=i;
return;
}
int mid=(left+right)>>1;
i=i<<1;
build(i,left,mid);
build(i+1,mid+1,right);
}
void modify(int i,int l,int r)
{
int left=node[i].left,right=node[i].right;
if ((l==left) && (r==right))
{
node[i].value=1;
return;
}
int mid=(left+right)>>1;
if (r<=mid) modify(i<<1,l,r);
else if (l>=mid+1) modify((i<<1)+1,l,r);
else
{
modify(i<<1,l,mid);
modify((i<<1)+1,mid+1,r);
}
}
void ask(int i)
{
int left=node[i].left,right=node[i].right;
if (node[i].value==1)
{
ans=ans+right-left+1;
return;
}
if (left==right) return;
else
{
ask(i<<1);
ask((i<<1)+1);
}
}
int main()
{
scanf("%d%d",&n,&m);
build(1,1,n);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
modify(1,l,r);
ask(1);
printf("%d\n",n-ans);
ans=0;
}
return 0;
}