您的位置:首页 > 其它

poj-2777 Count Color *

2011-07-11 15:06 232 查看
//蛮水的线段树

//2777
//用scanf() 用位运算

#include <cstdio>
#include <cstring>
using namespace std;

const int MAXL = 100000 + 5;
const int MAXT = 30 + 5;
int L, T, O, a, b, c, ans;
bool vis[MAXT * 3];
char cmd;
struct node{
int l, r;
int c;
};
node tree[MAXL * 3];

void build(int i, int l, int r){
tree[i].l = l; tree[i].r = r;
tree[i].c = (i==1? 1 : 0); //注意题意:起始时刻颜色为1!

if(tree[i].l == tree[i].r) return;
int mid = (l + r) >> 1;
build(i<<1, l, mid);
build(i<<1 | 1, mid+1, r);
}

void insert(int i, int l, int r, int c){
if(tree[i].l == l && tree[i].r == r){
tree[i].c = c;
return;
}

if(tree[i].l == tree[i].r) return;

if(tree[i].c > 0 && tree[i].c != c){
tree[i<<1].c = tree[i].c;
tree[i<<1|1].c = tree[i].c;
tree[i].c = 0;
}
int mid = (tree[i].l + tree[i].r) >> 1; //开始居然写成(l+r)>>1!!WA了n次
if(r <= tree[i<<1].r){
insert(i<<1, l, r, c);
}
else if(l >= tree[i<<1|1].l){
insert(i<<1|1, l, r, c);
}
else{
insert(i<<1, l, mid, c);
insert(i<<1|1, mid+1, r, c);
}
}

void cal(int i, int l, int r){
if(tree[i].r < l || tree[i].l > r) return;
if(tree[i].c > 0){
if(!vis[tree[i].c]){
vis[tree[i].c] = 1;
ans++;
}
return;
}
cal(i<<1, l, r);
cal(i<<1 | 1, l, r);
}

int main(){
scanf("%d%d%d", &L, &T, &O);
build(1, 1, L);

for(int i=0; i<O; i++){
scanf("%c", &cmd);
scanf("%c", &cmd);

if(cmd == 'C'){
scanf("%d%d%d", &a, &b, &c);
if(a <= b)
insert(1, a, b, c);

else{
insert(1, b, a, c); //a>b 则从b到a (题意没表述清)
}
}
else{
scanf("%d%d", &a, &b);
ans = 0;
memset(vis, 0, sizeof(vis));
if(a <= b)
cal(1, a, b);
else{
cal(1, b, a);
}
printf("%d\n", ans);

}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: