Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 26788 | Accepted: 8003 |
Description
Input
Output
Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
Source
//问一个区间有几种颜色
//先成段涂色 统计时遇到纯色就统计下
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 100003
#define lson l,m,k<<1
#define rson m+1,r,k<<1|1
using namespace std;
int st[N<<2];
bool T[31];
void build(int l,int r,int k)
{
st[k]=1;
if(l==r)
return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void down(int &k)
{
st[k<<1]=st[k<<1|1]=st[k];
st[k]=0;
}
int cover;
void update(int &L,int &R,int l,int r,int k)
{
if(L<=l&&R>=r)
{
st[k]=cover;
return ;
}
if(st[k])
down(k);
int m=(l+r)>>1;
if(L<=m) update(L,R,lson);
if(R>m) update(L,R,rson);
}
void query(int &L,int &R,int l,int r,int k)
{ if(T[st[k]]) return ;//开始没加这句,TLE
if(L<=l&&R>=r&&st[k])
{
T[st[k]]=1;
return ;
}
if(st[k])
down(k);
int m=(l+r)>>1;
if(L<=m) query(L,R,lson);
if(R>m) query(L,R,rson);
}
int main()
{
int L,t,O;
char op;
int a,b;
int c,i;
while(scanf("%d%d%d",&L,&t,&O)!=EOF)
{
build(1,L,1);
while(O--)
{
getchar();
scanf("%c",&op);
if(op=='C')
{
scanf("%d%d%d",&a,&b,&cover);
if(a>b) swap(a,b);//这个开始也忘记加了 WA
update(a,b,1,L,1);
}
else
{
memset(T,0,sizeof(T));
scanf("%d%d",&a,&b);
if(a>b) swap(a,b);
query(a,b,1,L,1);
for(c=0,i=1;i<=t;i++)
if(T[i])
c++;
printf("%d\n",c);
}
}
}
return 0;
}