您的位置:首页 > 其它

POJ 2777 Count Color

2011-04-07 20:41 330 查看
经典的染色问题,很明显的体现了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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: