题目大概:
在一个单行表格上,对他们进行区间涂色,最后查询区间的颜色数。
思路:
线段树,区间查询,根据别人ac代码写的。
代码:
#include
#include
#include
using namespace std;
struct poin
{
int l,r,id,v;
}a[101000<<2];
void build(int L,int R,int rt)
{
a[rt].l=L;
a[rt].r=R;
if(L==R)return;
int m=(L+R)>>1;
build(L,m,rt<<1);
build(m+1,R,rt<<1|1);
}
void update(int L,int R,int v,int rt)
{
if(L==a[rt].l&&R==a[rt].r)
{
a[rt].id=1;
a[rt].v=1<<(v-1);
return;
}
if(a[rt].id)
{
a[rt].id=0;
a[rt<<1].id=a[rt<<1|1].id=1;
a[rt<<1].v=a[rt<<1|1].v=a[rt].v;
}
int m=(a[rt].l+a[rt].r)>>1;
if(R<=m)
{
update(L,R,v,rt<<1);
}
else if(L>m)
{
update(L,R,v,rt<<1|1);
}
else
{
update(L,m,v,rt<<1);
update(m+1,R,v,rt<<1|1);
}
a[rt].v=(a[rt<<1].v|a[rt<<1|1].v);
if(a[rt<<1].id&&a[rt<<1|1].id&&a[rt<<1].v==a[rt<<1|1].v)
a[rt].id=1;
}
int quert(int L,int R,int rt)
{
if(a[rt].l==L&&a[rt].r==R)
{
return a[rt].v;
}
if(a[rt].id)
{
return a[rt].v;
}
int m=(a[rt].l+a[rt].r)>>1;
if(R<=m)
{
return quert(L,R,rt<<1);
}
else if(L>m)
{
return quert(L,R,rt<<1|1);
}
else
{
return quert(L,m,rt<<1)|quert(m,R,rt<<1|1);
}
}
int main()
{
int l,k,n;
while(~scanf("%d%d%d\n",&l,&k,&n))
{
build(1,l,1);
a[1].v=1;
a[1].id=1;
while(n--)
{
char q[2];
scanf("%s",q);
if(q[0]=='C')
{
int w,e,r;
scanf("%d%d%d",&w,&e,&r);
update(w,e,r,1);
}
else
{
int w,e;
scanf("%d%d",&w,&e);
int sum=quert(w,e,1);
int su=0;
for(int j=0;j