POJ 2777 Count Color 线段树一些容易遗漏的东西……
2010-11-17 00:43
302 查看
成段更新,区间统计,
把query里的传递给子节点的步骤,切记!!
向大牛学习……http://www.notonlysuccess.com/?p=59
把query里的传递给子节点的步骤,切记!!
向大牛学习……http://www.notonlysuccess.com/?p=59
#include<iostream> using namespace std; int countbit(unsigned int n) { int count=0; while(n!=0) { n &= n-1; count++; } return count; } int two(int n) { return 1<<n; } struct seg_tree { int left; int right; int col; bool cover; int calmid() { return (left+right)>>1; } }; struct seg_tree tree[100000*3]; void build(int left,int right,int idx) { tree[idx].left = left; tree[idx].right = right; tree[idx].cover=1; tree[idx].col=two(1); if(left == right) return; int mid=tree[idx].calmid(); build(left,mid,idx<<1); build(mid+1,right,idx<<1|1); } int query(int left,int right,int idx) { if(left == tree[idx].left && right==tree[idx].right) { return tree[idx].col; } if(tree[idx].cover) { tree[idx<<1].col=tree[idx<<1|1].col=tree[idx].col; tree[idx<<1].cover=tree[idx<<1|1].cover=1; tree[idx].cover=0; } int mid=tree[idx].calmid(); if(right<=mid) return query(left,right,idx<<1); else if(left>mid) return query(left,right,idx<<1|1); else return query(left,mid,idx<<1) | query(mid+1,right,idx<<1|1); } void update(int left,int right,int val,int idx) { if(left <= tree[idx].left && right >= tree[idx].right ) { tree[idx].col=two(val); tree[idx].cover=1; return; } if(tree[idx].cover) { tree[idx<<1].col=tree[idx<<1|1].col=tree[idx].col; tree[idx<<1].cover=tree[idx<<1|1].cover=1; tree[idx].cover=0; } int mid=tree[idx].calmid(); if(left<=mid) update(left,right,val,idx<<1); if(right>mid) update(left,right,val,idx<<1|1); tree[idx].col=tree[idx<<1].col | tree[idx<<1|1].col; } int main() { freopen("in.txt","r",stdin); int n,m,p; cin>>n>>m>>p; build(1,n,1); while(p--) { char c; getchar(); scanf("%c",&c); if(c=='C') { int x,y,color; scanf("%d%d%d",&x,&y,&color); if(x>y) swap(x,y); update(x,y,color,1); } else if(c=='P') { int a,b; scanf("%d%d",&a,&b); if(a>b) swap(a,b); printf("%d/n",countbit(query(a,b,1))); } } return 0; }
相关文章推荐
- 测试人员容易遗漏一些隐藏的缺陷
- 容易遗漏一些隐藏的缺陷
- 【C/C++】C语言中一些容易被人忽略的东西 之五 【预编译中的未知数】
- sql 语句 容易忘记的一些东西
- Java编写中容易搞错的一些东西
- 一些总是记不住又容易搞混淆的东西(不断更新)
- 测试人员容易遗漏一些隐藏的缺陷
- 【C/C++】C语言中一些容易被人忽略的东西 之一 【内存的分配与释放】
- [转] 测试人员容易遗漏一些隐藏的缺陷
- jquery中一些容易让人困惑的东西总结[转载]
- 【C/C++】C++中一些容易被人忽略的东西 之一 【寥寥代码,让您分清引用和指针】
- poj中一些对我来说不错的东西(每天不同的加入,要保持)
- php的一些容易混淆的东西
- 【C/C++】C语言中一些容易被人忽略的东西 之二 【typedef 与函数的姻缘】
- 测试人员容易遗漏一些隐藏的缺陷
- Java中容易搞错的一些东西
- 有一些珍贵的东西总容易被忽视
- 【C/C++】C语言中一些容易被人忽略的东西 之三 【共用体、联合、union】
- 测试人员容易遗漏一些隐藏的缺陷
- 测试人员容易遗漏一些隐藏的缺陷