标签:school 更新 into make ring lap str nes middle
Description
Input
Output
Sample Input
5 10 P 1 2 3 P 2 3 4 Q 2 3 Q 1 3 P 3 5 4 P 1 2 7 Q 1 3 Q 3 4 P 5 5 8 Q 1 5 0 0
Sample Output
4 3 4 4 7 4 4 7 8
题意:给出点[1,n]和更新查询次数m,P是对区间[a,b]上的点染色成c,Q是查询区间[a,b]中有哪些颜色,从小到大输出。
思路:建树,用ins对区间进行更新并进行懒惰标记,然后用sea进行查询。由于颜色有30种,所以可以用int的二进制进行储存。
注意:当建树较小时会TLE而不是MLE或RE,让我纠结了好久
AC代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<queue> 6 #include<vector> 7 #include<map> 8 #define ll long long 9 using namespace std; 10 const int maxn=1000000+10; 11 struct note 12 { 13 int l,r,ans; 14 bool t; 15 } a[maxn<<2];//注意:maxn<<2 16 int build(int l,int r,int k) 17 { 18 a[k].l=l,a[k].r=r,a[k].ans=1<<2,a[k].t=0; 19 if(l==r) 20 { 21 return 0; 22 } 23 int mid=(l+r)>>1; 24 build(l,mid,k<<1); 25 build(mid+1,r,k<<1|1); 26 return 0; 27 } 28 int pushdown(int k) 29 { 30 a[k<<1].ans=a[k<<1|1].ans=a[k].ans; 31 a[k].t=0; 32 a[k<<1].t=a[k<<1|1].t=1; 33 return 0; 34 } 35 int ins(int l,int r,int k,int d) 36 { 37 if(a[k].l==l&&a[k].r==r) 38 { 39 a[k].t=1; 40 a[k].ans=1<<d; 41 return 0; 42 } 43 if(a[k].t) pushdown(k); 44 int mid=(a[k].l+a[k].r)>>1; 45 if(a[k<<1].r>=r) ins(l,r,k<<1,d); 46 else if(a[k<<1|1].l<=l) ins(l,r,k<<1|1,d); 47 else 48 { 49 ins(l,mid,k<<1,d); 50 ins(mid+1,r,k<<1|1,d); 51 } 52 a[k].ans=a[k<<1].ans|a[k<<1|1].ans; 53 return 0; 54 } 55 int sea(int l,int r,int k) 56 { 57 if(l==a[k].l&&r==a[k].r) 58 { 59 return a[k].ans; 60 } 61 if(a[k].t) pushdown(k); 62 int mid=(a[k].l+a[k].r)>>1,ans; 63 if(a[k<<1].r>=r) ans=sea(l,r,k<<1); 64 else if(a[k<<1|1].l<=l) ans=sea(l,r,k<<1|1); 65 else 66 { 67 ans=sea(l,mid,k<<1)|sea(mid+1,r,k<<1|1); 68 } 69 return ans; 70 } 71 int main() 72 { 73 int n,m,a,b,c; 74 char s[10]; 75 while(~scanf("%d%d",&n,&m)) 76 { 77 if(n==0&&m==0) 78 break; 79 build(1,n,1); 80 while(m--) 81 { 82 scanf("%s",s); 83 if(s[0]==‘P‘) 84 { 85 scanf("%d%d%d",&a,&b,&c); 86 ins(a,b,1,c); 87 } 88 else 89 { 90 int ans,i; 91 scanf("%d%d",&a,&b); 92 ans=sea(a,b,1); 93 for(i=1; i<=30; i++)//注意:i<=30 94 if((ans>>i)&1) 95 { 96 printf("%d",i); 97 break; 98 } 99 for(i++;i<=30;i++) 100 if((ans>>i)&1) 101 printf(" %d",i); 102 printf("\n"); 103 } 104 } 105 } 106 return 0; 107 }
hdu--5023 A Corrupt Mayor's Performance Art(线段树+区间更新+位运算)
标签:school 更新 into make ring lap str nes middle
原文地址:http://www.cnblogs.com/wang-ya-wei/p/6033302.html