现在的位置: 首页 > 综合 > 正文

poj-2777 Count Color *

2012年06月23日 ⁄ 综合 ⁄ 共 1266字 ⁄ 字号 评论关闭
//蛮水的线段树

//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;
}

抱歉!评论已关闭.