poj2777 线段树状态压缩

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<cstring>
 5 #define ls (x<<1)
 6 #define rs (x<<1|1)
 7 using namespace std;
 8 const int N=1e5+5;
 9 int sum[N<<2],tag[N<<2];
10 int n,m,t;
11 void update(int x){sum[x]=sum[ls]|sum[rs];}
12 void down(int l,int r,int x)
13 {
14     if(tag[x])
15     {
16         tag[ls]=tag[rs]=tag[x];
17         sum[ls]=1<<tag[x];
18         sum[rs]=1<<tag[x];
19         tag[x]=0;
20     }
21 }
22 void build(int l,int r,int x)
23 {
24     if(l==r)
25     {
26         sum[x]=2;
27         return;
28     }
29     int mid=(l+r)>>1;
30     build(l,mid,ls);
31     build(mid+1,r,rs);
32     update(x);
33 }
34 void modify(int A,int B,int l,int r,int v,int x)
35 {
36     if(A<=l&&B>=r)
37     {
38         tag[x]=v;
39         sum[x]=1<<v;
40         return;
41     }
42     down(l,r,x);
43     int mid=(l+r)>>1;
44     if(A<=mid)modify(A,B,l,mid,v,ls);
45     if(B>mid)modify(A,B,mid+1,r,v,rs);
46     update(x);
47 }
48 int query(int A,int B,int l,int r,int x)
49 {
50     if(A<=l&&B>=r)return sum[x];
51     down(l,r,x);
52     int mid=(l+r)>>1,ans=0;
53     if(A<=mid)ans|=query(A,B,l,mid,ls);
54     if(B>mid)ans|=query(A,B,mid+1,r,rs);
55     return ans;
56 }
57 
58 int main()
59 {
60     scanf("%d%d%d",&n,&t,&m);
61     build(1,n,1);
62     char op[2];
63     for(int i=1;i<=m;i++)
64     {
65         
66         scanf("%s",op);
67         if(op[0]=='C')
68         {
69             int l,r,v;
70             scanf("%d%d%d",&l,&r,&v); 
71             if(l>r)swap(l,r);
72             modify(l,r,1,n,v,1);
73         }
74         else
75         {
76             int l,r;
77             scanf("%d%d",&l,&r);
78             if(l>r)swap(l,r);
79             int ans=query(l,r,1,n,1),cnt=0;
80             for(int i=31;i>=0;i--)if(ans>>i&1)cnt++;
81             printf("%d\n",cnt);    
82         }
83     }
84     return 0;
85 }

 

上一篇:mysql优化方案


下一篇:Phoenix各个参数的含义及默认值