POJ2777

一开始总是TLE。。。偶然看到discuss里面有人说用cin就会TLE。然后我用

char cp;

scanf("%c",&cp);

不知道为什么while(O--)的次数有问题了,再没有输入'C'或'P'时也会有循环。后来仿照网上的解法,用

char cp[10];

scanf("%s", cp);

具体原因有待研究。。。

还有一个疑惑就是为什么要开4倍大小的空间?


View Code
  1 #include <iostream>
2 using namespace std;
3 #define maxn 100010
4
5 struct node
6 {
7 int l,r;
8 int c;
9 int lazy;
10 }T[maxn*4];
11
12 void construct(int l,int r,int k)
13 {
14 if(l==r)
15 {
16 T[k].l=l;
17 T[k].r=r;
18 return;
19 }
20
21 else
22 {
23 T[k].l=l;
24 T[k].r=r;
25 int m=(l+r)>>1;
26 construct(l,m,2*k);
27 construct(m+1,r,2*k+1);
28 }
29 }
30
31 void update(int l,int r,int k,int c)
32 {
33 if(l<=T[k].l && r>=T[k].r)
34 {
35 T[k].c=c;
36 T[k].lazy=1;
37 return;
38 }
39 if(T[k].lazy==1)
40 {
41 if(T[k].c==c)
42 return;
43
44 T[k].lazy=0;
45 T[k<<1].c=T[k].c;
46 T[k<<1|1].c=T[k].c;
47 T[k<<1].lazy=1;
48 T[k<<1|1].lazy=1;
49 }
50
51 int m=(T[k].l+T[k].r)>>1;
52 if(r<=m)
53 update(l,r,k<<1,c);
54 else if(l>m)
55 update(l,r,k<<1|1,c);
56 else
57 {
58 update(l,m,k<<1,c);
59 update(m+1,r,k<<1|1,c);
60 }
61
62 T[k].c=T[2*k].c|T[2*k+1].c;
63 }
64
65 int search(int l,int r,int k)
66 {
67 if(T[k].lazy==1)
68 return T[k].c;
69
70 if(l==T[k].l && r==T[k].r)
71 return T[k].c;
72
73 int m=(T[k].l+T[k].r)>>1;
74
75 if(r<=m)
76 return search(l,r,k<<1);
77 else if(l>m)
78 return search(l,r,k<<1|1);
79 else
80 {
81 int i=search(l,m,k<<1);
82 i=i|search(m+1,r,k<<1|1);
83 return i;
84 }
85 }
86
87 void swap(int &x,int &y)
88 {
89 int temp=x;
90 x=y;
91 y=temp;
92 }
93
94 int calculate_1(int x)
95 {
96 int cal=0;
97 while(x)
98 {
99 cal+=x&1;
100 x>>=1;
101 }
102 return cal;
103 }
104
105 int main()
106 {
107 int L,MaxC,O;
108 scanf("%d%d%d",&L,&MaxC,&O);
109
110 construct(1,L,1);
111 T[1].c=1;
112 T[1].lazy=1;
113
114 while(O--)
115 {
116 /*char cp;
117 scanf("%c",&cp);*/
118 char cp[10];
119 scanf("%s", cp);
120 int a1,a2,a3,color;
121
122 if(!strcmp(cp,"C"))
123 {
124 scanf("%d%d%d",&a1,&a2,&a3);
125 if(a1>a2)
126 swap(a1,a2);
127
128 color=1<<(a3-1);
129
130 update(a1,a2,1,color);
131 }
132
133 if(!strcmp(cp,"P"))
134 {
135 scanf("%d%d",&a1,&a2);
136 a3=0;
137 if(a1>a2)
138 swap(a1,a2);
139 int result=search(a1,a2,1);
140 cout<<calculate_1(result)<<endl;
141 }
142 }
143 return 0;
144 }



 


posted @ 2012-02-15 12:23  ITfresh  阅读(177)  评论(0编辑  收藏  举报