标签:
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
利用二进制表示颜色。T只有30种,所以妥妥的。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #include <stack> #include <map> using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const double pi= acos(-1.0); #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int MAXN=100010; int sum[MAXN<<3]; int lazy[MAXN<<3]; void PushUp(int rt) { sum[rt]=sum[rt<<1]|sum[rt<<1|1]; } void PushDown(int rt) { if(lazy[rt]) { lazy[rt<<1]=lazy[rt]; lazy[rt<<1|1]=lazy[rt]; sum[rt<<1]=lazy[rt]; sum[rt<<1|1]=lazy[rt]; lazy[rt]=0; } } void Update(int ll, int rr, int x, int l, int r, int rt) { if(ll<=l&&rr>=r) { sum[rt]=x; lazy[rt]=x; return ; } PushDown(rt); int mid=l+r>>1; if(ll<=mid) Update(ll,rr,x,lson); if(rr>mid) Update(ll,rr,x,rson); PushUp(rt); } int Query(int ll, int rr, int l, int r, int rt) { if(ll<=l&&rr>=r) { return sum[rt]; } PushDown(rt); int ans=0; int mid=l+r>>1; if(ll<=mid) ans=ans|Query(ll,rr,lson); if(rr>mid) ans=ans|Query(ll,rr,rson); return ans; } int get(int x) { int ans=0; int y; while(x) { y=x%2; if(y) ans++; x/=2; } return ans; } int main() { int n, i,t, q; int a,b,c; char ch; scanf("%d %d %d",&n,&t,&q); memset(lazy,0,sizeof(lazy)); for(i=1; i<=4*n; i++) { sum[i]=1; } while(q--) { getchar(); scanf("%c",&ch); if(ch=='C') { scanf("%d %d %d",&a,&b,&c); if(a>b) swap(a,b); Update(a,b,1<<(c-1),1,n,1); } else { scanf("%d %d",&a,&b); if(a>b) swap(a,b); int ans=get(Query(a,b,1,n,1)); printf("%d\n",ans); } } return 0; }
POJ 2777-Count Color(线段树_区间染色)
标签:
原文地址:http://blog.csdn.net/u013486414/article/details/45095863