/*
poj2777,线段1~L,初始时涂颜色1.//这个没看仔细,wa了好多次。
依旧是参考别人的代码才写出来的,,o(︶︿︶)o唉
*/
#include <stdio.h>
#include <string.h>
#define MAX 100000
void Swap(int &a,int &b){int t=a;a=b;b=t;}
struct TNode {
int l , r;
int col;
}segtree[4*MAX+5];
bool Many [32];
void build(int n,int l,int r)
{
int mid = (l+r)/2;
segtree[n].col = 0;
segtree[n].l = l;
segtree[n].r = r;
if(l!=r)
{
build(2*n,l,mid);
build(2*n+1,mid+1,r);
}
}
void insert(int n,int l,int r,int c)
{
int mid=(segtree[n].l+segtree[n].r)/2;
if(l==segtree[n].l && r==segtree[n].r)
{
segtree[n].col=c;
return;
}
if(segtree[n].col)
{
segtree[2*n].col=segtree[n].col;
segtree[2*n+1].col=segtree[n].col;
segtree[n].col=0;
}
if(r<=mid)
{
insert(2*n,l,r,c);
return;
}
if(l>mid)
{
insert(2*n+1,l,r,c);
return;
}
insert(2*n,l,mid,c);
insert(2*n+1,mid+1,r,c);
}
int search(int l,int r,int n)
{
int sum = 0;
if(segtree[n].col){
if(Many[segtree[n].col]==false){
sum++;
Many[segtree[n].col]=true;
}
return sum;
}
int mid=(segtree[n].l+segtree[n].r)/2;
if(r<=mid)
sum += search(l,r,n*2);
else if(l>mid)
sum += search(l,r,n*2+1);
else{
sum += search(l,mid,n*2);
sum += search(mid+1,r,n*2+1);
}
if(sum==30)//just for this problem
return sum;
return sum;
}
int main()
{
int L,T,O,x1,x2,c;
char ch;
scanf("%d%d%d",&L,&T,&O);
build(1,1,L);
segtree[1].col=1;
while(O--)
{
getchar();//读回车
scanf("%c",&ch);
if(ch=='C')
{
scanf("%d%d%d",&x1,&x2,&c);
if(x1>x2)Swap(x1,x2);
insert(1,x1,x2,c);
}
else
{
scanf("%d%d",&x1,&x2);
if(x1>x2)Swap(x1,x2);
memset(Many,false,sizeof(Many));
printf("%d\n",search(x1,x2,1));
}
}
return 0;
}
poj2777-线段树应用(线段覆盖)
最新推荐文章于 2020-06-23 15:38:07 发布