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;
}
//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;
}
相关文章推荐
- Count Color POJ--2777
- Count Color POJ 2777
- Count Color POJ - 2777 线段树
- Count Color+POJ+线段树区间更新+位运算(lazy标志的运用)
- poj 2777 Count 线段树区间覆盖
- POJ Count Color 线段树
- poj&nbsp;2777&nbsp;:&nbsp;Count&nbsp;Color&nbsp;(线…
- poj 2777 Count Color
- POJ 2154 Color
- poj 2777 Count Color
- POJ 2777--Count Color(线段树)
- poj 1046 Color Me Less 解题报告
- poj 2777(线段树+区间染色)
- poj 2777 Count Color【线段树段更新】
- POJ 2054 贪心 !!! Color a Tree
- poj 2154 Color【polya定理+欧拉函数】
- POJ 1016 Numbers That Count
- 线段树染色模板,用于颜色较少的情况。 POJ 2777
- POJ 2777 Count Color (线段树+位运算)
- POJ 2777 Count Color (线段树成段更新+二进制思维)