POJ 2777 Count Color

经典的染色问题,很明显的体现了lazy——tag思想...

/*
用cin超时...
*/

#include
<stdio.h>
#include
<string.h>
#include
<iostream>
#include
<algorithm>
#define L(t) ((t) << 1)
#define R(t) ((t) << 1 | 1)
using namespace std;

const int MAXN = 1000002;
bool used[33];
struct SegTree
{
int l, r;
int color; //-1多种颜色 否则为单一颜色
int getMid(){
return (l + r) >> 1;
}
};
SegTree tree[MAXN
<< 2];
int l, t, o; //l长度 t种颜色 o次操作

void bulid(int left, int right, int t){
tree[t].l
= left;
tree[t].r
= right;
tree[t].color
= 1;
if(right == left)
return;
int mid = tree[t].getMid();
bulid(left,mid,L(t));
bulid(mid
+ 1, right, R(t));
}

void insert(int left, int right, int c, int t){
if(left <= tree[t].l && right >= tree[t].r){
tree[t].color
= c;
return;
}
if(tree[t].color != -1){ //第二类信息 自上向下传递
tree[L(t)].color
= tree[R(t)].color = tree[t].color;
tree[t].color
= -1;
}
int mid = tree[t].getMid();
if(right <= mid){
insert(left, right, c, L(t));
}
else if(left > mid){
insert(left, right, c, R(t));
}
else {
insert(left, mid, c, L(t));
insert(mid
+ 1, right, c, R(t));
}
}
void query(int left, int right, int t){
if(tree[t].color > 0){
used[tree[t].color]
= true;
return;
}
int mid = tree[t].getMid();
if(right <= mid){
query(left, right, L(t));
}
else if( left > mid){
query(left, right, R(t));
}
else {
query(left, mid, L(t));
query(mid
+ 1, right, R(t));
}
}

int main(){
char cmd[2];
int a, b, c;
//cin >> l >> t >> o;
scanf(
"%d%d%d",&l,&t,&o);
bulid(
1, l, 1);
for(int i = 0; i < o; ++i){
//cin >> cmd;
scanf(
"%s",cmd);
if(cmd[0] == 'C'){
// cin >> a >> b >> c;
scanf(
"%d%d%d",&a, &b, &c);
if(a > b)
a
^= b ^= a ^= b;
insert(a, b, c,
1);
}
else {
// cin >> a >> b;
scanf(
"%d%d",&a, &b);
if(a > b)
a
^= b ^= a ^= b;
memset(used,
false, sizeof(used));
query(a, b,
1);
int cnt = 0;
for(int i = 0; i <= t; i++)
if(used[i]){
cnt
++;
}
// cout << cnt << endl;
printf(
"%d\n",cnt);
}
}
return 0;
}
posted @ 2011-04-07 20:41  L..  阅读(206)  评论(0编辑  收藏  举报