标签:des color os io strong ar div amp
解题报告
题意:
对线段染色,询问线段区间的颜色种数。
思路:
本来直接在线段树上染色,lz标记颜色。每次查询的话访问线段树,求出颜色种数。结果超时了,最坏的情况下,染色可以染到叶子节点。
换成存下区间的颜色种数,这样每次查询就不用找到叶子节点了,用按位或来处理颜色种数。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int sum[500000],lz[500000],ans; void push_down(int rt,int l,int r) { if(lz[rt]) { lz[rt<<1]=lz[rt<<1|1]=lz[rt]; sum[rt<<1]=lz[rt]; sum[rt<<1|1]=lz[rt]; lz[rt]=0; } } void push_up(int rt,int l,int r) { sum[rt]=sum[rt<<1]|sum[rt<<1|1]; } void cbtree(int rt,int l,int r) { if(l==r) { sum[rt]=1; return ; } int mid=(l+r)>>1; cbtree(rt<<1,l,mid); cbtree(rt<<1|1,mid+1,r); push_up(rt,l,r); } void update(int rt,int l,int r,int ql,int qr,int v) { if(ql>r||qr<l)return ; if(ql<=l&&r<=qr) { lz[rt]=v; sum[rt]=v; return ; } int mid=(l+r)>>1; push_down(rt,l,r); update(rt<<1,l,mid,ql,qr,v); update(rt<<1|1,mid+1,r,ql,qr,v); push_up(rt,l,r); } int _q(int rt,int l,int r,int ql,int qr) { if(ql>r||qr<l)return 0; if(ql<=l&&r<=qr) { return sum[rt]; } push_down(rt,l,r); int mid=(l+r)>>1; return _q(rt<<1,l,mid,ql,qr) | _q(rt<<1|1,mid+1,r,ql,qr); } int main() { int n,t,q,ql,qr,i,j,a,k; char str[10]; scanf("%d%d%d",&n,&t,&q); cbtree(1,1,n); while(q--) { scanf("%s",str); if(str[0]=='C') { scanf("%d%d%d",&ql,&qr,&a); if(ql>qr)swap(ql,qr); update(1,1,n,ql,qr,1<<(a-1)); } else { scanf("%d%d",&ql,&qr); if(ql>qr)swap(ql,qr); ans=_q(1,1,n,ql,qr); int cnt=0; while(ans) { if(ans%2) cnt++; ans/=2; } printf("%d\n",cnt); } } return 0; }
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 35143 | Accepted: 10591 |
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
POJ训练计划2777_Count Color(线段树/成段更新/区间染色),布布扣,bubuko.com
POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
标签:des color os io strong ar div amp
原文地址:http://blog.csdn.net/juncoder/article/details/38519677