Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=3397

4小时AC 我要崩溃了

View Code
  1 //HDU 3397
2 #include <cstdio>
3 using namespace std;
4 const int N=100010;
5 struct segtree
6 {
7 int l,r,c,s0,ls0,rs0,s1,ls1,rs1,cnt;
8 int m() {return (r+l)/2;}
9 int len() {return r-l+1;}
10 void set(int x)
11 {
12 switch (x)
13 {
14 case 0:
15 cnt=s1=ls1=rs1=0;
16 s0=ls0=rs0=len();
17 c=x;
18 break;
19 case 1:
20 cnt=s1=ls1=rs1=len();
21 s0=ls0=rs0=0;
22 c=x;
23 break;
24 case 2:
25 cnt=len()-cnt;
26 int t=s1; s1=s0; s0=t;
27 t=ls1; ls1=ls0; ls0=t;
28 t=rs1; rs1=rs0; rs0=t;
29 if (c==-1) c=x;
30 else if (c==2) c=-1;
31 else c=!c;
32 break;
33 }
34 }
35 }st[N*4];
36 int max(int x,int y,int z)
37 {
38 int t=x>y?x:y;
39 if (z>t) t=z;
40 return t;
41 }
42 void pushup(int rt)
43 {
44 int lrt=rt*2,rrt=rt*2+1;
45 st[rt].cnt=st[lrt].cnt+st[rrt].cnt;
46 st[rt].s0=max(st[lrt].s0,st[rrt].s0,st[lrt].rs0+st[rrt].ls0);
47 st[rt].ls0=st[lrt].ls0;
48 if (st[lrt].ls0==st[lrt].len()) st[rt].ls0+=st[rrt].ls0;
49 st[rt].rs0=st[rrt].rs0;
50 if (st[rrt].rs0==st[rrt].len()) st[rt].rs0+=st[lrt].rs0;
51 st[rt].s1=max(st[lrt].s1,st[rrt].s1,st[lrt].rs1+st[rrt].ls1);
52 st[rt].ls1=st[lrt].ls1;
53 if (st[lrt].ls1==st[lrt].len()) st[rt].ls1+=st[rrt].ls1;
54 st[rt].rs1=st[rrt].rs1;
55 if (st[rrt].rs1==st[rrt].len()) st[rt].rs1+=st[lrt].rs1;
56 }
57 void pushdown(int rt)
58 {
59 if (st[rt].c==-1) return;
60 int lrt=rt*2,rrt=rt*2+1;
61 st[lrt].set(st[rt].c);
62 st[rrt].set(st[rt].c);
63 st[rt].c=-1;
64 }
65 void build(int l,int r,int rt)
66 {
67 st[rt].l=l; st[rt].r=r;
68 if (l==r)
69 {
70 int t;
71 scanf("%d",&t);
72 st[rt].set(t);
73 st[rt].c=-1;
74 return;
75 }
76 st[rt].c=-1;
77 int m=st[rt].m();
78 build(l,m,rt*2);
79 build(m+1,r,rt*2+1);
80 pushup(rt);
81 }
82 void update(int L,int R,int x,int rt)
83 {
84 int l=st[rt].l,r=st[rt].r;
85 if (L<=l && r<=R)
86 {
87 st[rt].set(x);
88 return;
89 }
90 pushdown(rt);
91 int m=st[rt].m();
92 if (L<=m) update(L,R,x,rt*2);
93 if (R>m) update(L,R,x,rt*2+1);
94 pushup(rt);
95 }
96 int query1(int L,int R,int rt)
97 {
98 int l=st[rt].l,r=st[rt].r;
99 if (L<=l && r<=R) return st[rt].cnt;
100 pushdown(rt);
101 int s=0;
102 int m=st[rt].m();
103 if (L<=m) s+=query1(L,R,rt*2);
104 if (R>m) s+=query1(L,R,rt*2+1);
105 return s;
106 }
107 int query2(int L,int R,int rt)
108 {
109 int l=st[rt].l,r=st[rt].r;
110 if (L<=l && r<=R) return st[rt].s1;
111 pushdown(rt);
112 int m=st[rt].m();
113 int s1=0,s2=0,lrt=rt*2,rrt=rt*2+1;;
114 if (L<=m) s1=query2(L,R,lrt);
115 if (R>m) s2=query2(L,R,rrt);
116 int s=s1>s2?s1:s2;
117 s1=m-L+1<st[lrt].rs1?m-L+1:st[lrt].rs1;
118 s2=R-m<st[rrt].ls1?R-m:st[rrt].ls1;
119 if (s1+s2>s) s=s1+s2;
120 return s;
121 }
122 int main()
123 {
124 int T;
125 scanf("%d",&T);
126 int n,m;
127 while (T--)
128 {
129 scanf("%d%d",&n,&m);
130 build(0,n-1,1);
131 int op,a,b;
132 while (m--)
133 {
134 scanf("%d%d%d",&op,&a,&b);
135 switch (op)
136 {
137 case 0: case 1: case 2:
138 update(a,b,op,1);
139 break;
140 case 3:
141 printf("%d\n",query1(a,b,1));
142 break;
143 case 4:
144 printf("%d\n",query2(a,b,1));
145 break;
146 }
147 }
148 }
149 return 0;
150 }

 

posted on 2012-02-29 16:26  Qiuqiqiu  阅读(186)  评论(0编辑  收藏  举报