标签:des style class blog code color
Description
Input
Output
Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
一道简单的线段树区间更新,区间查询的题目,当然是要用mark标记,网上好多人说这是laxy标记,其实这不是lazy,而是更好的方法,主要是30种颜色怎么表示,当然好表示了,2的30次放也是整形数据嘛,用集合的交并就可以了
#include<map> #include<set> #include<queue> #include<cmath> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define inf 0x0f0f0f0f using namespace std; const int maxn=100000+10; struct node { int left,right,sum,mark; }tree[maxn*8]; int get_sum(int s) { int ans=0; while(s) { if (s%2) ans++; s=s/2; } return ans; } void build(int c,int x,int y) { tree[c].left=x; tree[c].right=y; tree[c].sum=1; tree[c].mark=0; if (x==y) return; int mid=x+(y-x)/2; build(c*2,x,mid); build(c*2+1,mid+1,y); } void update(int c,int x,int y,int v) { if (tree[c].left==x && tree[c].right==y) { tree[c].sum=1<<v; tree[c].mark=v+1; return; } if (tree[c].mark) { tree[c*2].sum=1<<(tree[c].mark-1); tree[c*2].mark=tree[c].mark; tree[c*2+1].sum=1<<(tree[c].mark-1); tree[c*2+1].mark=tree[c].mark; tree[c].mark=0; } int mid=tree[c].left+(tree[c].right-tree[c].left)/2; if (y<=mid) update(c*2,x,y,v); else if (x>mid) update(c*2+1,x,y,v); else { update(c*2,x,mid,v); update(c*2+1,mid+1,y,v); } tree[c].sum=tree[c*2].sum | tree[c*2+1].sum; } int reseach(int c,int x,int y) { if (tree[c].left==x && tree[c].right==y) return tree[c].sum; if (tree[c].mark) { tree[c*2].sum=1<<(tree[c].mark-1); tree[c*2].mark=tree[c].mark; tree[c*2+1].sum=1<<(tree[c].mark-1); tree[c*2+1].mark=tree[c].mark; tree[c].mark=0; } int mid=tree[c].left+(tree[c].right-tree[c].left)/2; if (y<=mid) return reseach(c*2,x,y); else if (x>mid) return reseach(c*2+1,x,y); else { return (reseach(c*2,x,mid) | reseach(c*2+1,mid+1,y)); } } int main() { int n,t,m,x,y,v; char str[3]; while(scanf("%d%d%d",&n,&t,&m)!=EOF) { build(1,1,n); while(m--) { scanf("%s",str); if (str[0]==‘C‘) { scanf("%d%d%d",&x,&y,&v); if (x>=y) swap(x,y); update(1,x,y,v-1); } else { scanf("%d%d",&x,&y); if (x>=y) swap(x,y); int temp=reseach(1,x,y); int ans=get_sum(temp); printf("%d\n",ans); } } } return 0; }
作者 chensunrise
poj 2777 Count Color,布布扣,bubuko.com
标签:des style class blog code color
原文地址:http://www.cnblogs.com/chensunrise/p/3799153.html