感觉自己好菜啊,考得一次不如一次了。。。压力好大,++滚粗感。
模拟88。
T1,sbt,发现离散化后数据范围变为6000,直接跑暴力即可。%%%机房众神斜率优化。
T2,大模拟,考场上只会乱搞骗分。本人菜鸡,只会大力分类讨论。。。

1 #include<bits/stdc++.h>
2 using namespace std;
3 const double eps=5e-5;
4 double f[100][100],f1[100][100],f2[100][100];
5 double dp[110][10][10][10][10];
6 double ans[6][10];
7 int a[6][10],tt[10];
8 int n;
9 char s1[20],s2[20],s3[20];
10 double gg;
11 inline void prans(int id)
12 {
13 double gg=1.0;
14 memset(ans,0,sizeof(ans));
15 for(int j=1;j<=8;++j)
16 for(int k=1;k<=8;++k)
17 for(int o=1;o<=8;++o)
18 for(int l=1;l<=8;++l)
19 {
20 gg-=dp[id][j][k][o][l];
21 ans[1][a[1][j]]+=dp[id][j][k][o][l];
22 ans[2][a[2][k]]+=dp[id][j][k][o][l];
23 ans[3][a[3][o]]+=dp[id][j][k][o][l];
24 ans[4][a[4][l]]+=dp[id][j][k][o][l];
25 }
26 printf("%.2lf\n",gg*100);
27 for(int i=1;i<=4;++i)
28 {
29 for(int j=1;j<=8;++j)
30 {
31 printf("%.2lf ",ans[i][j]*100);
32 }
33 puts("");
34 }
35 }
36 inline void init()
37 {
38 f[1][0]=f[1][1]=f[1][2]=1.0/3;
39 for(int i=1;i<=80;++i){
40 for(int j=0;j<=80;++j){
41 if(j)f1[i][j]=f1[i][j-1];
42 f1[i][j]+=f[i][j];
43 f[i+1][j]+=f[i][j]*f[1][0];
44 f[i+1][j+1]+=f[i][j]*f[1][1];
45 f[i+1][j+2]+=f[i][j]*f[1][2];
46 }
47 for(int j=80;~j;--j)f2[i][j]=f2[i][j+1]+f[i][j];
48 }
49 }
50 void work1(int m,int i,int num,int isw,double g=1.0,int fj=1,int fk=1,int fo=1,int fl=1,int jj=8,int kk=8,int oo=8,int ll=8)
51 {
52 if(m==1)
53 {
54 if(isw)
55 {
56 for(int j=fj;j<=jj;++j)
57 for(int k=fk;k<=kk;++k)
58 for(int o=fo;o<=oo;++o)
59 for(int l=fl;l<=ll;++l)
60 for(int t=0;t<=2*num;++t)
61 dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[num][t]*g;
62 }
63 else
64 {
65 for(int j=fj;j<=jj;++j)
66 for(int k=fk;k<=kk;++k)
67 for(int o=fo;o<=oo;++o)
68 for(int l=fl;l<=ll;++l)
69 dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*g;
70 }
71 }
72 else if(m==2)
73 {
74 if(isw)
75 {
76 for(int j=fj;j<=jj;++j)
77 for(int k=fk;k<=kk;++k)
78 for(int o=fo;o<=oo;++o)
79 for(int l=fl;l<=ll;++l)
80 for(int t=0;t<=2*num;++t)
81 dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[num][t]*g;
82 }
83 else
84 {
85 for(int j=fj;j<=jj;++j)
86 for(int k=fk;k<=kk;++k)
87 for(int o=fo;o<=oo;++o)
88 for(int l=fl;l<=ll;++l)
89 dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*g;
90 }
91 }
92 else if(m==3)
93 {
94 if(isw)
95 {
96 for(int j=fj;j<=jj;++j)
97 for(int k=fk;k<=kk;++k)
98 for(int o=fo;o<=oo;++o)
99 for(int l=fl;l<=ll;++l)
100 for(int t=0;t<=2*num;++t)
101 dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[num][t]*g;
102 }
103 else
104 {
105 for(int j=fj;j<=jj;++j)
106 for(int k=fk;k<=kk;++k)
107 for(int o=fo;o<=oo;++o)
108 for(int l=fl;l<=ll;++l)
109 dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*g;
110 }
111 }
112 else
113 {
114 if(isw)
115 {
116 for(int j=fj;j<=jj;++j)
117 for(int k=fk;k<=kk;++k)
118 for(int o=fo;o<=oo;++o)
119 for(int l=fl;l<=ll;++l)
120 for(int t=0;t<=2*num;++t)
121 dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[num][t]*g;
122 }
123 else
124 {
125 for(int j=fj;j<=jj;++j)
126 for(int k=fk;k<=kk;++k)
127 for(int o=fo;o<=oo;++o)
128 for(int l=fl;l<=ll;++l)
129 dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*g;
130 }
131 }
132 }
133 //////////////////////////////////////////////////分界线work1&2///////////////////////////////////////////////////////////////
134 void work2(int m,int i,int num,int isw,double g=1.0,int fj=1,int fk=1,int fo=1,int fl=1,int jj=8,int kk=8,int oo=8,int ll=8)
135 {
136 if(m==1)
137 {
138 if(isw)
139 {
140 for(int j=fj;j<=jj;++j)
141 for(int k=fk;k<=kk;++k)
142 for(int o=fo;o<=oo;++o)
143 for(int l=fl;l<=ll;++l)
144 for(int t=0;t<=2*num;++t)
145 dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[num][t]*g;
146 }
147 else
148 {
149 for(int j=fj;j<=jj;++j)
150 for(int k=fk;k<=kk;++k)
151 for(int o=fo;o<=oo;++o)
152 for(int l=fl;l<=ll;++l)
153 dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*g;
154 }
155 }
156 else if(m==2)
157 {
158 if(isw)
159 {
160 for(int j=fj;j<=jj;++j)
161 for(int k=fk;k<=kk;++k)
162 for(int o=fo;o<=oo;++o)
163 for(int l=fl;l<=ll;++l)
164 for(int t=0;t<=2*num;++t)
165 dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[num][t]*g;
166 }
167 else
168 {
169 for(int j=fj;j<=jj;++j)
170 for(int k=fk;k<=kk;++k)
171 for(int o=fo;o<=oo;++o)
172 for(int l=fl;l<=ll;++l)
173 dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*g;
174 }
175 }
176 else if(m==3)
177 {
178 if(isw)
179 {
180 for(int j=fj;j<=jj;++j)
181 for(int k=fk;k<=kk;++k)
182 for(int o=fo;o<=oo;++o)
183 for(int l=fl;l<=ll;++l)
184 for(int t=0;t<=2*num;++t)
185 dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[num][t]*g;
186 }
187 else
188 {
189 for(int j=fj;j<=jj;++j)
190 for(int k=fk;k<=kk;++k)
191 for(int o=fo;o<=oo;++o)
192 for(int l=fl;l<=ll;++l)
193 dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*g;
194 }
195 }
196 else
197 {
198 if(isw)
199 {
200 for(int j=fj;j<=jj;++j)
201 for(int k=fk;k<=kk;++k)
202 for(int o=fo;o<=oo;++o)
203 for(int l=fl;l<=ll;++l)
204 for(int t=0;t<=2*num;++t)
205 dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[num][t]*g;
206 }
207 else
208 {
209 for(int j=fj;j<=jj;++j)
210 for(int k=fk;k<=kk;++k)
211 for(int o=fo;o<=oo;++o)
212 for(int l=fl;l<=ll;++l)
213 dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*g;
214 }
215 }
216 }
217
218 int main()
219 {
220 // freopen("da.in","r",stdin);
221 init();
222 for(int i=1,x;i<=4;++i){
223 scanf("%d%d",&a[i][8],&tt[i]);
224 for(int j=8;j;--j){a[i][j-1]=a[i][j]/10;a[i][j]%=10;}
225 }
226 dp[1][tt[1]][tt[2]][tt[3]][tt[4]]=1.0;
227 scanf("%d",&n);
228 /*
229 t1:当前处理点
230 t2:受影响点
231 i:当前处理的操作
232 l2:数字串长度,对?处理
233 tag:标记是否有问号
234 tg2:标记是否有=
235 */
236 for(int i=1,t1,t2,l2,num,tag,tg2;i<=n;++i)//work2(int m,int i,int num,int isw)
237 {
238 // if(i==5)prans(i);
239 t1=l2=tag=num=tg2=0;
240 scanf("%s%s",s1,s2+1);
241 l2=strlen(s2+1);
242 if(s1[1]=='i')t1=1;
243 else if(s1[1]=='p')t1=2;
244 else if(s1[1]=='a')t1=3;
245 else t1=4;
246 switch(s2[1])
247 {
248 case '<':
249 {
250 scanf("%d",&tg2);
251 if(l2==2)++tg2;
252 scanf("%s%s",s1,s2+1);
253 if(s1[1]=='i')t2=1;
254 else if(s1[1]=='p')t2=2;
255 else if(s1[1]=='a')t2=3;
256 else t2=4;
257
258 l2=strlen(s2+1);
259 for(int j=2;j<l2;++j)num=num*10+s2[j]-'0';
260 if(s2[l2]=='?')tag=1;
261 else num=num*10+s2[l2]-'0';
262 for(int j=1;j<=8;++j)
263 for(int k=1;k<=8;++k)
264 for(int o=1;o<=8;++o)
265 for(int l=1;l<=8;++l){
266 if(t1==1)
267 {
268 for(int tmd=0;tmd<=2*a[1][j];++tmd)
269 {
270 if(tmd>=tg2)
271 {
272 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
273 continue;
274 }
275 if(t2==1)
276 {
277 if(tag){
278 for(int t=0;t<=num*2;++t){
279 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
280 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
281 }
282 }
283 else
284 {
285 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
286 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
287 }
288 }
289 else if(t2==2)
290 {
291 if(tag){
292 for(int t=0;t<=num*2;++t){
293 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
294 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
295 }
296 }
297 else
298 {
299 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
300 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
301 }
302 }
303 else if(t2==3)
304 {
305 if(tag){
306 for(int t=0;t<=num*2;++t){
307 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
308 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
309 }
310 }
311 else
312 {
313 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
314 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
315 }
316 }
317 else
318 {
319 if(tag){
320 for(int t=0;t<=num*2;++t){
321 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
322 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
323 }
324 }
325 else
326 {
327 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
328 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
329 }
330 }
331 }
332 }
333 else if(t1==2)
334 {
335 for(int tmd=0;tmd<=2*a[2][k];++tmd)
336 {
337 if(tmd>=tg2)
338 {
339 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
340 continue;
341 }
342 if(t2==1)
343 {
344 if(tag){
345 for(int t=0;t<=num*2;++t){
346 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
347 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
348 }
349 }
350 else
351 {
352 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
353 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
354 }
355 }
356 else if(t2==2)
357 {
358 if(tag){
359 for(int t=0;t<=num*2;++t){
360 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
361 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
362 }
363 }
364 else
365 {
366 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
367 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
368 }
369 }
370 else if(t2==3)
371 {
372 if(tag){
373 for(int t=0;t<=num*2;++t){
374 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
375 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
376 }
377 }
378 else
379 {
380 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
381 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
382 }
383 }
384 else
385 {
386 if(tag){
387 for(int t=0;t<=num*2;++t){
388 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
389 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
390 }
391 }
392 else
393 {
394 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
395 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
396 }
397 }
398 }
399 }
400 else if(t1==3)
401 {
402 for(int tmd=0;tmd<=2*a[3][o];++tmd)
403 {
404 if(tmd>=tg2)
405 {
406 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
407 continue;
408 }
409 if(t2==1)
410 {
411 if(tag){
412 for(int t=0;t<=num*2;++t){
413 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
414 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
415 }
416 }
417 else
418 {
419 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
420 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
421 }
422 }
423 else if(t2==2)
424 {
425 if(tag){
426 for(int t=0;t<=num*2;++t){
427 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
428 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
429 }
430 }
431 else
432 {
433 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
434 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
435 }
436 }
437 else if(t2==3)
438 {
439 if(tag){
440 for(int t=0;t<=num*2;++t){
441 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
442 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
443 }
444 }
445 else
446 {
447 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
448 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
449 }
450 }
451 else/////////////////////////////////////////////////////////////////here
452 {
453 if(tag){
454 for(int t=0;t<=num*2;++t){
455 // cout<<t<<endl;
456 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
457 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
458 }
459 }
460 else
461 {
462 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
463 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
464 }
465 }
466 }
467 }
468 else
469 {
470 for(int tmd=0;tmd<=2*a[4][l];++tmd)
471 {
472 if(tmd>=tg2)
473 {
474 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
475 continue;
476 }
477 if(t2==1)
478 {
479 if(tag){
480 for(int t=0;t<=num*2;++t){
481 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
482 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
483 }
484 }
485 else
486 {
487 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
488 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
489 }
490 }
491 else if(t2==2)
492 {
493 if(tag){
494 for(int t=0;t<=num*2;++t){
495 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
496 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
497 }
498 }
499 else
500 {
501 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
502 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
503 }
504 }
505 else if(t2==3)
506 {
507 if(tag){
508 for(int t=0;t<=num*2;++t){
509 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
510 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
511 }
512 }
513 else
514 {
515 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
516 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
517 }
518 }
519 else
520 {
521 if(tag){
522 for(int t=0;t<=num*2;++t){
523 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
524 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
525 }
526 }
527 else
528 {
529 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
530 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
531 }
532 }
533 }
534 }
535 }
536 break;
537 }
538 case '>':
539 {
540 scanf("%d",&tg2);
541 if(l2==2)--tg2;
542 scanf("%s%s",s1,s2+1);
543 if(s1[1]=='i')t2=1;
544 else if(s1[1]=='p')t2=2;
545 else if(s1[1]=='a')t2=3;
546 else t2=4;
547
548 l2=strlen(s2+1);
549 for(int j=2;j<l2;++j)num=num*10+s2[j]-'0';
550 if(s2[l2]=='?')tag=1;
551 else num=num*10+s2[l2]-'0';
552
553 for(int j=1;j<=8;++j)
554 for(int k=1;k<=8;++k)
555 for(int o=1;o<=8;++o)
556 for(int l=1;l<=8;++l)
557 if(t1==1)
558 {
559 for(int tmd=0;tmd<=2*a[1][j];++tmd)
560 {
561 if(tmd<=tg2)
562 {
563 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
564 continue;
565 }
566 if(t2==1)
567 {
568 if(tag){
569 for(int t=0;t<=num*2;++t){
570 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
571 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
572 }
573 }
574 else
575 {
576 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
577 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
578 }
579 }
580 else if(t2==2)
581 {
582 if(tag){
583 for(int t=0;t<=num*2;++t){
584 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
585 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
586 }
587 }
588 else
589 {
590 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
591 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
592 }
593 }
594 else if(t2==3)
595 {
596 if(tag){
597 for(int t=0;t<=num*2;++t){
598 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
599 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
600 }
601 }
602 else
603 {
604 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
605 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
606 }
607 }
608 else
609 {
610 if(tag){
611 for(int t=0;t<=num*2;++t){
612 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
613 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd]*f[num][t];
614 }
615 }
616 else
617 {
618 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
619 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[1][j]][tmd];
620 }
621 }
622 }
623 }
624 else if(t1==2)
625 {
626 for(int tmd=0;tmd<=2*a[2][k];++tmd)
627 {
628 if(tmd<=tg2)
629 {
630 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
631 continue;
632 }
633 if(t2==1)
634 {
635 if(tag){
636 for(int t=0;t<=num*2;++t){
637 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
638 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
639 }
640 }
641 else
642 {
643 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
644 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
645 }
646 }
647 else if(t2==2)
648 {
649 if(tag){
650 for(int t=0;t<=num*2;++t){
651 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
652 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
653 }
654 }
655 else
656 {
657 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
658 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
659 }
660 }
661 else if(t2==3)
662 {
663 if(tag){
664 for(int t=0;t<=num*2;++t){
665 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
666 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
667 }
668 }
669 else
670 {
671 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
672 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
673 }
674 }
675 else
676 {
677 if(tag){
678 for(int t=0;t<=num*2;++t){
679 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
680 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd]*f[num][t];
681 }
682 }
683 else
684 {
685 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
686 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[2][k]][tmd];
687 }
688 }
689 }
690 }
691 else if(t1==3)
692 {
693 for(int tmd=0;tmd<=2*a[3][o];++tmd)
694 {
695 if(tmd<=tg2)
696 {
697 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
698 continue;
699 }
700 if(t2==1)
701 {
702 if(tag){
703 for(int t=0;t<=num*2;++t){
704 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
705 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
706 }
707 }
708 else
709 {
710 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
711 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
712 }
713 }
714 else if(t2==2)
715 {
716 if(tag){
717 for(int t=0;t<=num*2;++t){
718 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
719 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
720 }
721 }
722 else
723 {
724 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
725 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
726 }
727 }
728 else if(t2==3)
729 {
730 if(tag){
731 for(int t=0;t<=num*2;++t){
732 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
733 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
734 }
735 }
736 else
737 {
738 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
739 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
740 }
741 }
742 else
743 {
744
745 if(tag){
746 for(int t=0;t<=num*2;++t){
747 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
748 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd]*f[num][t];
749 }
750 }
751 else
752 {
753 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
754 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[3][o]][tmd];
755 }
756 }
757 }
758 }
759 else
760 {
761 for(int tmd=0;tmd<=2*a[4][l];++tmd)
762 {
763 if(tmd<=tg2)
764 {
765 dp[i+1][j][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
766 continue;
767 }
768 if(t2==1)
769 {
770 if(tag){
771 for(int t=0;t<=num*2;++t){
772 if(s2[1]=='+')dp[i+1][min(j+t,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
773 else dp[i+1][max(j-t,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
774 }
775 }
776 else
777 {
778 if(s2[1]=='+')dp[i+1][min(j+num,8)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
779 else dp[i+1][max(j-num,0)][k][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
780 }
781 }
782 else if(t2==2)
783 {
784 if(tag){
785 for(int t=0;t<=num*2;++t){
786 if(s2[1]=='+')dp[i+1][j][min(k+t,8)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
787 else dp[i+1][j][max(k-t,0)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
788 }
789 }
790 else
791 {
792 if(s2[1]=='+')dp[i+1][j][min(k+num,8)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
793 else dp[i+1][j][max(k-num,0)][o][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
794 }
795 }
796 else if(t2==3)
797 {
798 if(tag){
799 for(int t=0;t<=num*2;++t){
800 if(s2[1]=='+')dp[i+1][j][k][min(o+t,8)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
801 else dp[i+1][j][k][max(o-t,0)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
802 }
803 }
804 else
805 {
806 if(s2[1]=='+')dp[i+1][j][k][min(o+num,8)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
807 else dp[i+1][j][k][max(o-num,0)][l]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
808 }
809 }
810 else
811 {
812 if(tag){
813 for(int t=0;t<=num*2;++t){
814 if(s2[1]=='+')dp[i+1][j][k][o][min(l+t,8)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
815 else dp[i+1][j][k][o][max(l-t,0)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd]*f[num][t];
816 }
817 }
818 else
819 {
820 if(s2[1]=='+')dp[i+1][j][k][o][min(l+num,8)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
821 else dp[i+1][j][k][o][max(l-num,0)]+=dp[i][j][k][o][l]*f[a[4][l]][tmd];
822 }
823 }
824 }
825 }
826 break;
827 }
828 case '+':
829 {
830 for(int j=2;j<l2;++j)num=num*10+s2[j]-'0';
831 if(s2[l2]=='?')tag=1;
832 else num=num*10+s2[l2]-'0';
833 work1(t1,i,num,tag);
834 break;
835 }
836 case '-':
837 {
838 for(int j=2;j<l2;++j)num=num*10+s2[j]-'0';
839 if(s2[l2]=='?')tag=1;
840 else num=num*10+s2[l2]-'0';
841 work2(t1,i,num,tag);
842 break;
843 }
844 }
845 }
846 prans(n+1);
847 }
T3,dp or 记搜,考场上像一个sb一样打了状压,其实值域只有0,1,2,3。记录每一种有多少个以及上一次的操作即可。注意打高精

1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<vector>
6 #define N 13
7 using namespace std;
8 int n,a[N],sta;
9 int bk[N];
10 struct Big_int{
11 int a[60];
12 inline void init(int x){while(x){a[++a[0]]=x%10;x/=10;}}
13 inline bool empty(){return !a[0];}
14
15 inline void print()
16 {
17 for(int i=a[0];i;--i)printf("%d",a[i]);
18 puts("");
19 }
20 }dp[40][N][N][N][4];
21 inline void add( Big_int &c,const Big_int &x,const int y)
22 {
23 if(!y)return;
24 c.a[0]=max(c.a[0],x.a[0]);int t=0;
25 for(int i=1;i<=c.a[0];++i){
26 c.a[i]+=x.a[i]*y+t;
27 t=c.a[i]/10;c.a[i]%=10;
28 }
29 while(t)c.a[++c.a[0]]=t%10,t/=10;
30 return;
31 }
32 inline void work2()
33 {
34 int al=0,cnt=0;
35 for(int i=1;i<=n;++i)al+=a[i];
36 dp[1][bk[1]][bk[2]+1][bk[3]-1][2].init(bk[3]);
37 dp[1][bk[1]+1][bk[2]-1][bk[3]][1].init(bk[2]);
38 dp[1][bk[1]-1][bk[2]][bk[3]][0].init(bk[1]);
39 for(int o=1;o<al;++o)
40 for(int i=0;i<=n;++i)
41 for(int j=0;j<=n;++j)
42 for(int k=0;k<=n;++k)
43 for(int p=0;p<=2;++p){
44 if(dp[o][i][j][k][p].empty())continue;
45 // printf("dp[%d][%d][%d][%d][%d]=",o,i,j,k,p);dp[o][i][j][k][p].print();
46 if(k)add(dp[o+1][i][j+1][k-1][2],dp[o][i][j][k][p],k);
47 if(j)add(dp[o+1][i+1][j-1][k][1],dp[o][i][j][k][p],j-(p==2));
48 if(i)add(dp[o+1][i-1][j][k][0],dp[o][i][j][k][p],i-(p==1));
49 }
50 dp[al][0][0][0][0].print();
51 }
52 int main()
53 {
54 cin>>n;
55 for(int i=1;i<=n;++i)cin>>a[i],++bk[a[i]];
56 work2();return 0;
57 }
模拟89。
T1,正解为图论,然而被各种乱搞*爆,%%%cbx大神打表发现用2,3,5,7筛即可。

1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<vector>
5 #include<algorithm>
6 #define N 1000050
7 using namespace std;
8 int ans[N];
9 int n;
10 bool zhi[N];
11 int pri[N],tot;
12 inline int Min(int x,int y){if(x>y)return y;return x;}
13 int main()
14 {
15 // freopen("da.in","r",stdin);
16 // freopen("my.out","w",stdout);
17 ans[0]=1;ans[1]=0;
18 for(int i=2;i<=1000049;++i)ans[i]=i;
19 for(int i=2;i<=1000000;++i){
20 for(int j=i+1;j<=i+4;++j)ans[i]=Min(ans[i],ans[j]+j-i);
21 if(!zhi[i])pri[++tot]=i;
22 for(int j=1;j<=tot&&1ll*i*pri[j]<=1000000;++j)
23 {
24 ans[i*pri[j]]=Min(ans[i*pri[j]],ans[i]+pri[j]);
25 zhi[i*pri[j]]=1;
26 }
27 }
28 scanf("%d",&n);
29 printf("%d\n",ans[n]);
30 return 0;
31 }
T2,杜教筛and整除分块,考场上打线筛莫比乌斯能拿到40。

1 #include<bits/stdc++.h>
2 #define N 30000500
3 using namespace std;
4 long long n,ans;
5 bool zhi[N];
6 int pri[N],tot;
7 char mu[N];
8 int sum[N];
9 unordered_map<int,int>H;
10 inline void init(int n)
11 {
12 mu[1]=sum[1]=1;
13 for(int i=2;i<=n;++i){
14 if(!zhi[i])pri[++tot]=i,mu[i]=-1;
15 sum[i]=sum[i-1]+mu[i];
16 for(int j=1;j<=tot&&1ll*i*pri[j]<=n;++j)
17 {
18 zhi[i*pri[j]]=1;
19 if(i%pri[j])mu[i*pri[j]]=-mu[i];
20 else {mu[i*pri[j]]=0;break;}
21 }
22 }
23 }
24 inline int getsm(int x)
25 {
26 if(x<=30000000)return sum[x];
27 if(H.find(x)!=H.end())return H[x];
28 int ret=1;
29 for(int l=2,r;l<=x;l=r+1)
30 {
31 r=x/(x/l);
32 ret-=getsm(x/l)*(r-l+1);
33 }
34 return H[x]=ret;
35 }
36 inline void fenkuai()
37 {
38 int p=sqrt(n);
39 for(int l=2,r;l<=p;l=r+1){
40 r=sqrt(n/(n/l/l));
41 ans+=(getsm(r)-getsm(l-1))*(n/l/l);
42 }
43 }
44 int main()
45 {
46 cin>>n;ans=n;
47 init(30000000);
48 fenkuai();
49 cout<<ans<<endl;
50 return 0;
51 }
T3,正解为线段树维护单调栈,按题意模拟打treap可以拿到60(然而考场上删除函数打炸了,只有15分)

1 #include<bits/stdc++.h>
2 #define N 200050
3 using namespace std;
4 int n,m,A,lim,w;
5 int lsh[N];
6 int a[N];
7 struct node{int op,x,y;}q[N];
8 inline int py(int x){return A-x+1;}
9 struct Segment_tree{
10 int ma[N<<2],len[N<<2],mi[N<<2],po[N<<2];
11 void build(int g,int l,int r)
12 {
13 len[g]=r-l+1;
14 if(l==r)return;
15 const int m=l+r>>1;
16 build(g<<1,l,m);build(g<<1|1,m+1,r);
17 }
18 inline void upd(int g)
19 {
20 if(ma[g<<1]>ma[g<<1|1]){ma[g]=ma[g<<1];po[g]=po[g<<1];}
21 else{ma[g]=ma[g<<1|1];po[g]=po[g<<1|1];}mi[g]=mi[g<<1];
22 }
23 inline int ask(int g,int l,int r)
24 {
25 if(ma[g]<=w||r<=lim)return 0;
26 if(l>lim)
27 {
28 if(mi[g]>w){w=ma[g];return len[g];}
29 const int m=l+r>>1;
30 if(ma[g<<1]>w){
31 int ret=ask(g<<1,l,m);if(ma[g<<1|1]>ma[g<<1])w=ma[g<<1|1];
32 return ret+len[g]-len[g<<1];
33 }
34 else return ask(g<<1|1,m+1,r);
35 }
36 const int m=l+r>>1;
37 if(m<=lim){return ask(g<<1|1,m+1,r);}
38 else{
39 if(ma[g<<1]<=w)return ask(g<<1|1,m+1,r);
40 int ret=ask(g<<1,l,m);
41 if(w==ma[g<<1]){
42 if(ma[g<<1|1]>ma[g<<1])w=ma[g<<1|1];
43 return ret+len[g]-len[g<<1];
44 }
45 else{return ret+ask(g<<1|1,m+1,r);}
46 }
47 }
48 inline int getma(int g,int l,int r,int x,int y)
49 {
50 if(l>y||r<x)return 0;
51 if(l>=x&&r<=y)return po[g];
52 const int m=l+r>>1;
53 const int a1=getma(g<<1,l,m,x,y),a2=getma(g<<1|1,m+1,r,x,y);
54 if(a[a1]>a[a2])return a1;return a2;
55
56 }
57 void change(int g,int l,int r,int pos,int ww)
58 {
59 if(l==r){
60 mi[g]=ma[g]=ww;po[g]=l;
61 if(w){len[g]=1,po[g]=l;}
62 else len[g]=po[g]=0;
63 return;
64 }
65 const int m=l+r>>1;
66 if(pos<=m)
67 {
68 change(g<<1,l,m,pos,ww);upd(g);
69 lim=m;w=ma[g<<1];
70 len[g]=len[g<<1]+ask(g<<1|1,m+1,r);
71 }
72 else
73 {
74 change(g<<1|1,m+1,r,pos,ww);upd(g);
75 lim=m;w=ma[g<<1];
76 len[g]=len[g<<1]+ask(g<<1|1,m+1,r);
77 }
78 }
79 }tr1,tr2;
80 inline void init(){
81 sort(lsh+1,lsh+A+1);
82 A=unique(lsh+1,lsh+A+1)-lsh-1;
83 }
84 inline int getd(int x)
85 {
86 lim=x;w=a[x];
87 int ret=tr1.ask(1,1,A);
88 lim=py(x);w=a[x];
89 return ret+tr2.ask(1,1,A);
90
91 }
92 int main()
93 {
94
95 scanf("%d",&n);
96 for(int i=1;i<=n;++i)
97 {
98 scanf("%d",&q[i].op);
99 if(q[i].op==0){
100 scanf("%d%d",&q[i].x,&q[i].y);
101 lsh[++A]=q[i].x;
102 }
103 else if(q[i].op==1)scanf("%d",&q[i].x);
104 else scanf("%d%d",&q[i].x,&q[i].y);
105 }
106 init();
107 for(int i=1,op,x,y,t;i<=n;++i)
108 {
109 // printf("\n\n\ni:%d\n",i);
110 op=q[i].op;
111 x=lower_bound(lsh+1,lsh+A+1,q[i].x)-lsh;
112 if(op==0){
113 a[x]=q[i].y;
114 tr1.change(1,1,A,x,a[x]);
115 tr2.change(1,1,A,py(x),a[x]);
116 }
117 else if(q[i].op==1)
118 {
119 a[x]=0;
120 tr1.change(1,1,A,x,a[x]);
121 tr2.change(1,1,A,py(x),a[x]);
122 }
123 else
124 {
125 y=lower_bound(lsh+1,lsh+A+1,q[i].y)-lsh;
126 if(x>y)swap(x,y);t=tr1.getma(1,1,A,x,y);
127 printf("%d\n",getd(x)+getd(y)-2*getd(t));
128 }
129 }
130 }
模拟90。
T1:luode dijkstra

1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<queue>
6 #define N 505
7 using namespace std;
8 const int dx[]={1,-1,0,0};
9 const int dy[]={0,0,1,-1};
10 int a[N][N],b[N][N],n,m;
11 int sx,sy,tx,ty;
12 priority_queue<pair<int,int> >q;
13 inline void bfs(int x,int y)
14 {
15 q.push(make_pair(b[sx][sy],x*N+y));
16 int d,xx,yy;
17 while(q.size())
18 {
19 x=q.top().second;d=q.top().first;q.pop();
20 y=x%N;x/=N;if(d!=b[x][y])continue;
21 for(int i=0;i<=3;++i)
22 {
23 xx=x+dx[i];yy=y+dy[i];
24 if(xx<=0||xx>n||yy<=0||yy>m)continue;
25 if(d<=a[xx][yy]+b[xx][yy])continue;
26 b[xx][yy]=d-a[xx][yy];
27 q.push(make_pair(b[xx][yy],xx*N+yy));
28 }
29 }
30 }
31 inline void pr()
32 {
33 for(int i=1;i<=n;++i)
34 {
35 for(int j=1;j<=m;++j)
36 {
37 printf("%d ",b[i][j]);
38 }
39 puts("");
40 }
41 }
42 int main()
43 {
44 scanf("%d%d",&n,&m);
45 for(int i=1;i<=n;++i)
46 for(int j=1;j<=m;++j)
47 scanf("%d",&a[i][j]);
48 scanf("%d%d",&sx,&sy);
49 scanf("%d%d%d",&b[sx][sy],&tx,&ty);
50 bfs(sx,sy);
51 printf("%d\n",b[tx][ty]);
52 // pr();
53 }
T2:状压dp,怎么压都行,然而考场上打sb了,WA30,kuku。。
题解状压的思路还是不错的,积累一下。


1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<queue>
6 #define N 105
7 using namespace std;
8 const int inf=1000000007;
9 int n,m,bin[40],dp[N][1<<16],ct[1<<16],sta[N],ans=inf;
10 inline void init(int n)
11 {
12 for(int i=1;i<=bin[n];++i)
13 ct[i]=ct[i-(i&-i)]+1;
14 }
15 int main()
16 {
17 for(int i=0;i<=20;++i)bin[i]=1<<i;
18 memset(dp,0x3f,sizeof(dp));
19 scanf("%d%d",&n,&m);
20 for(int i=1;i<=n;++i)
21 for(int j=0,x;j<m;++j){
22 scanf("%d",&x);
23 if(x)sta[i]|=bin[j];
24 }
25 init(m);dp[0][0]=0;
26 for(int j=0;j<n;++j)
27 {
28 for(int i=0,cnt,ok;i<bin[m];++i)
29 {
30 if(dp[j][i]>=inf)continue;
31 if(!sta[j+1]){dp[j+1][0]=min(dp[j+1][0],dp[j][i]);continue;}
32 for(int st=sta[j+1],ok;st;st=(st-1)&sta[j+1]){
33 ok=1;cnt=ct[st];
34 if((sta[j+1]&bin[0])&&!(st&bin[0]))continue;
35 for(int k=0;k<m-1;++k){
36 if(sta[j+1]&bin[k])continue;
37 if((sta[j+1]&bin[k+1])&&!(st&bin[k+1])){ok=0;break;}
38 }
39 if(!ok)continue;
40 for(int k=0,s1,s2;k<m;++k){
41 if((i&bin[k])&&(st&bin[k]))
42 {
43 for(s1=k+1;s1<m;++s1)if(!(sta[j]&bin[s1])||(i&bin[s1]))break;
44 for(s2=k+1;s2<m;++s2)if(!(sta[j+1]&bin[s2])||(st&bin[s2]))break;
45 if(s1==s2)--cnt;
46 }
47 }
48 dp[j+1][st]=min(dp[j+1][st],dp[j][i]+cnt);
49 }
50 }
51 }
52 for(int i=0,cnt,ok;i<bin[m];++i)ans=min(ans,dp[n][i]);
53 printf("%d\n",ans);
54 }
T3:%%%kx
对所有斜率进行离散化,对矩形的左边界和下边界分别维护一棵线段树,下标为斜率离散化后的下标。然后标记永久化一下就可以了。
注意各种各样的特判(y==0和x==0)。

1 #include<bits/stdc++.h>
2 #define N 100050
3 using namespace std;
4 int n,m,ls;
5 const double eps=1e-9;
6 const int inf=1000000007;
7 double lsh[N<<2];
8 struct PA{
9 double first;
10 int second;
11 friend bool operator <(const PA &a,const PA &b)
12 {
13 if(a.first==b.first)return a.second<b.second;
14 return a.first<b.first;
15 }
16 };
17 inline PA mmp(int x,int y){PA a;a.first=x;a.second=y;return a;}
18 PA kkk;
19 struct node{double x,xx,y,yy;int op;}q[N];
20 struct Segment_tree{
21 PA mi[N<<2];
22 inline void build(int g,int l,int r)
23 {
24 mi[g]=mmp(inf,0);if(l==r)return;
25 const int m=l+r>>1;
26 build(g<<1,l,m);build(g<<1|1,m+1,r);
27 }
28 inline PA getmi(int g,int l,int r,int pos)
29 {
30 if(l==r)return mi[g];
31 const int m=l+r>>1;
32 PA ret;
33 if(pos<=m)ret=getmi(g<<1,l,m,pos);
34 else ret=getmi(g<<1|1,m+1,r,pos);
35 return min(ret,mi[g]);
36 }
37 inline void add(int g,int l,int r,int x,int y)
38 {
39 if(l>y||r<x)return;
40 if(l>=x&&r<=y){mi[g]=min(mi[g],kkk);return;}
41 const int m=l+r>>1;
42 add(g<<1,l,m,x,y);add(g<<1|1,m+1,r,x,y);
43 }
44 }T1,T2;
45 int main(){
46 scanf("%d",&n);
47 for(int i=1;i<=n;++i)
48 {
49 scanf("%d",&q[i].op);
50 if(q[i].op==1){
51 scanf("%lf%lf%lf%lf",&q[i].x,&q[i].y,&q[i].xx,&q[i].yy);
52 if(q[i].x)lsh[++ls]=q[i].y/q[i].x,lsh[++ls]=q[i].yy/q[i].x;
53 if(q[i].xx)lsh[++ls]=q[i].y/q[i].xx;
54 }
55 else{
56 scanf("%lf%lf",&q[i].x,&q[i].y);
57 if(q[i].x)lsh[++ls]=q[i].y/q[i].x;
58 }
59 }
60 sort(lsh+1,lsh+ls+1);ls=unique(lsh+1,lsh+ls+1)-lsh-1;
61 double x,y,xx,yy;int t1,t2;
62 PA k1,k2,spj=mmp(inf,0),spj2=mmp(inf,0);
63 T1.build(1,1,ls);T2.build(1,1,ls);
64 q[0].x=inf;q[0].y=inf;
65 for(int i=1,op;i<=n;++i)
66 {
67 op=q[i].op;x=q[i].x;y=q[i].y;xx=q[i].xx;yy=q[i].yy;
68 if(op==1)
69 {
70 kkk=mmp(x,-i);
71 if(!y)spj2=min(spj2,mmp(x,-i));
72 if(x)
73 {
74 t1=lower_bound(lsh+1,lsh+ls+1,y/x-eps)-lsh;
75 t2=lower_bound(lsh+1,lsh+ls+1,yy/x-eps)-lsh;
76 }
77 else
78 {
79 spj=min(spj,mmp(y,-i));
80 t1=t2=ls;
81 }
82 T1.add(1,1,ls,t1,t2);
83 kkk=mmp(y,-i);
84 if(xx)t2=lower_bound(lsh+1,lsh+ls+1,y/xx-eps)-lsh;
85 else t2=ls;
86 T2.add(1,1,ls,t2,t1);
87 }
88 else
89 {
90 if(!q[i].y){printf("%d\n",-spj2.second);continue;}
91 if(!q[i].x){printf("%d\n",-spj.second);continue;}
92 t1=lower_bound(lsh+1,lsh+ls+1,y/x-eps)-lsh;
93 k1=T1.getmi(1,1,ls,t1);k2=T2.getmi(1,1,ls,t1);
94 yy=max(q[-k1.second].x*y/x,q[-k1.second].y);xx=max(q[-k2.second].x*y/x,q[-k2.second].y);
95 if(fabs(yy-xx)<1e-8){printf("%d\n",-min(k1.second,k2.second));}
96 else if(yy>xx)printf("%d\n",-k2.second);
97 else printf("%d\n",-k1.second);
98 }
99 }
100 }
模拟91。
T1,下面说一下心态问题,我当时秒切
发现不同的数在根号级别,然后它就成了sbt。开链表维护存在的权值,每次暴扫即可。

1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #define N 300050
6 using namespace std;
7 int n,m,tot;
8 int fa[N],sz[N];
9 int pd[N];
10
11 struct node{int pre,ne,cnt,sum;}a[N];
12 int getfa(int x){return x==fa[x]?x:fa[x]=getfa(fa[x]);}
13
14 inline void del(int id)
15 {
16 pd[id]=0;
17 a[a[id].pre].ne=a[id].ne;
18 a[a[id].ne].pre=a[id].pre;
19 }
20 inline void ins2(int x,int id)
21 {
22 a[x].pre=a[id].pre;
23 a[a[id].pre].ne=x;
24 a[id].pre=x;a[x].ne=id;
25 pd[x]=1;
26 }
27 inline void ins(int x)
28 {
29 for(int i=a[0].ne;i<=n+1;i=a[i].ne)
30 if(i>x){ins2(x,i);return;}
31 }
32
33 int main()
34 {
35 // freopen("cards105.in","r",stdin);//diff -b -B cards105.out my.out
36 // freopen("my.out","w",stdout);
37 scanf("%d%d",&n,&m);tot=1;
38 for(int i=1;i<=n;++i)fa[i]=i,sz[i]=1;
39
40 a[0].ne=a[n+1].pre=1;
41 a[1].pre=0;a[1].ne=n+1;
42 a[1].cnt=n;pd[1]=1;
43
44 int op,x,y,sum;
45 long long ans;
46 while(m--)
47 {
48 scanf("%d",&op);
49 if(op==1)
50 {
51 scanf("%d%d",&x,&y);
52 if(getfa(x)==getfa(y))continue;
53 x=getfa(x);y=getfa(y);
54 --a[sz[x]].cnt;
55 if(!a[sz[x]].cnt)del(sz[x]);
56 --a[sz[y]].cnt;
57 if(!a[sz[y]].cnt)del(sz[y]);
58
59 fa[y]=x;sz[x]+=sz[y];
60 ++a[sz[x]].cnt;
61 if(!pd[sz[x]])ins(sz[x]);
62 }
63 else
64 {
65 scanf("%d",&x);
66 for(int i=a[0].ne;i<=n;i=a[i].ne)
67 {
68 a[i].sum=a[i].cnt+a[a[i].pre].sum;
69 }
70 ans=0;
71 if(!x){
72 ans=1ll*a[a[n+1].pre].sum*(a[a[n+1].pre].sum-1);ans>>=1;
73 }
74 else
75 {
76 for(int i=a[n+1].pre,j=a[n+1].pre;i>x;i=a[i].pre)
77 {
78 while(i-j<x)j=a[j].pre;
79 ans+=1ll*a[j].sum*a[i].cnt;
80 }
81 }
82 printf("%lld\n",ans);
83 }
84 }
85 }
T2,考场上大部分时间都扔给了T2,然而还是爆0了。
其实还是挺难的,考虑按概率dp,最后用概率乘位置得到期望。
考虑如何归并相同的数。
设dp[dep][i][j],表示在归并的第dep层,原数组中位置为i的值在当前归并的区间内排名为j的概率,在l==r时显然有dp[dep][l][1]=1。
对于非叶子
首先,已有两个子区间各自的排名,考虑预处理一些东西辅助转移。
设f[i][j]表示某点在原区间排名为j,在新区间排名为i的概率,
f数组可以递推转移(考虑前一个位置来自相同区间or不同区间,具体细节看代码)
但我们发现只有一个f数组还不够。因为不能确定另一个子区间是否已为空
设h[i][j]表示某点在原区间排名为j,在新区间排名为i,且另一个子区间的数全部在当前数之前的概率。
转移与f数组类似(同样考虑前一个位置来自相同区间or不同区间,具体细节看代码)
然后就可以kx地转移了。

1 #include<bits/stdc++.h>
2 #define N 550
3 #define pb push_back
4 #define int long long
5 const int mod=998244353;
6 const int inv2=499122177;
7 using namespace std;
8 int n,a[N],dp[12][N][N],f[N][N],h[N][N],pd[5500],ans[N];
9 vector<int>v[N<<2];
10 inline void init(int n)
11 {
12 f[1][1]=inv2;h[1][1]=1;
13 for(int i=2;i<=n;++i)
14 for(int j=1;j<=i;++j){
15 f[i][j]=(f[i-1][j-1]+f[i-1][i-j])%mod;
16 f[i][j]=1ll*inv2*f[i][j]%mod;
17 h[i][j]=(h[i-1][j-1]+f[i-1][i-j])%mod;
18 }
19 }
20 inline void merge(int g,int l,int r,int dep,int val)
21 {
22 v[g].clear();
23 if(l==r){if(a[l]==val)dp[dep][l][1]=1,v[g].pb(l);return;}
24 const int m=l+r>>1,lc=g<<1,rc=g<<1|1;;
25 merge(lc,l,m,dep+1,val);merge(rc,m+1,r,dep+1,val);
26 for(int i=0;i<v[lc].size();++i)v[g].pb(v[lc][i]);
27 for(int j=0;j<v[rc].size();++j)v[g].pb(v[rc][j]);
28 for(int o=0,t;o<v[lc].size();++o){t=v[lc][o];
29 for(int i=1;i<=v[lc].size();++i)
30 for(int j=0;j<=v[rc].size();++j)
31 if(j==v[rc].size())(dp[dep][t][i+j]+=1ll*dp[dep+1][t][i]*h[i+j][i]%mod)%=mod;
32 else (dp[dep][t][i+j]+=1ll*dp[dep+1][t][i]*f[i+j][i]%mod)%=mod;
33 }
34 for(int o=0,t;o<v[rc].size();++o){t=v[rc][o];
35 for(int i=1;i<=v[rc].size();++i)
36 for(int j=0;j<=v[lc].size();++j)
37 if(j==v[lc].size())(dp[dep][t][i+j]+=1ll*dp[dep+1][t][i]*h[i+j][i]%mod)%=mod;
38 else (dp[dep][t][i+j]+=dp[dep+1][t][i]*f[i+j][i]%mod)%=mod;
39 }
40 v[lc].clear();v[rc].clear();
41 }
42 signed main()
43 {
44 scanf("%lld",&n);init(n);
45 for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
46 for(int i=1;i<=n;++i)
47 if(!pd[a[i]])pd[a[i]]=1,merge(1,1,n,1,a[i]);
48 for(int k=0;k<=1000;++k)v[k].clear();
49 for(int i=1;i<=n;++i)v[a[i]].push_back(i);
50 for(int k=0,t=1;k<=1000;++k){
51 for(int i=0,p;i<v[k].size();++i){p=v[k][i];
52 for(int j=1;j<=v[k].size();++j)(ans[p]+=1ll*dp[1][p][j]*(j+t-1)%mod)%=mod;
53 }
54 t+=v[k].size();
55 }
56 for(int i=1;i<=n;++i)printf("%lld ",ans[i]);
57 puts("");
58 }

1 #include<bits/stdc++.h>
2 #define N 550
3 #define pb push_back
4 const int mod=998244353;
5 const double inv2=0.5;
6 using namespace std;
7 int n;
8 int a[N],b[N],c[N];
9 double dp[12][N][N];
10 double f[N][N];
11 double h[N][N];
12 double ans[N];
13 vector<int>v[N<<2];
14 inline void init(int n)
15 {
16 f[1][1]=inv2;h[1][1]=1;
17 for(int i=2;i<=n;++i){
18 for(int j=1;j<=i;++j){
19 f[i][j]=f[i-1][j-1]+f[i-1][i-j];
20 f[i][j]= inv2*f[i][j] ;
21 h[i][j]=( h[i-1][j-1]+ f[i-1][i-j]);
22 }
23 }
24 // for(int i=1;i<=n;++i,puts(""))
25 // for(int j=1;j<=i;++j)printf("%.2lf ",f[i][j]);
26 }
27 int pd[1050];
28 inline void merge(int g,int l,int r,int dep,int val)
29 {
30 v[g].clear();
31 if(l==r){
32 if(a[l]==val){
33 dp[dep][l][1]=1;
34 v[g].pb(l);
35 }return;
36 }
37 const int m=l+r>>1,lc=g<<1,rc=g<<1|1;;
38 merge(lc,l,m,dep+1,val);merge(rc,m+1,r,dep+1,val);
39 for(int i=0;i<v[lc].size();++i)v[g].pb(v[lc][i]);
40 for(int j=0;j<v[rc].size();++j)v[g].pb(v[rc][j]);
41 for(int o=0,t;o<v[lc].size();++o){t=v[lc][o];
42 for(int i=1;i<=v[lc].size();++i)
43 for(int j=0;j<=v[rc].size();++j)
44 if(j==v[rc].size())dp[dep][t][i+j]+=dp[dep+1][t][i]*h[i+j][i];
45 else dp[dep][t][i+j]+=dp[dep+1][t][i]*f[i+j][i];
46 }
47 for(int o=0,t;o<v[rc].size();++o){t=v[rc][o];
48 for(int i=1;i<=v[rc].size();++i)
49 for(int j=0;j<=v[lc].size();++j)
50 if(j==v[lc].size())dp[dep][t][i+j]+=dp[dep+1][t][i]*h[i+j][i];
51 else dp[dep][t][i+j]+=dp[dep+1][t][i]*f[i+j][i];
52 }v[lc].clear();v[rc].clear();
53 }
54 int main()
55 {
56 scanf("%d",&n);init(n);
57 for(int i=1;i<=n;++i)scanf("%d",&a[i]),b[i]=a[i];
58 for(int i=1;i<=n;++i){
59 if(!pd[a[i]]){pd[a[i]]=1;
60 merge(1,1,n,1,a[i]);
61 }
62 }
63 for(int k=0;k<=1000;++k)v[k].clear();
64 for(int i=1;i<=n;++i)v[a[i]].push_back(i);
65 int t=1;
66 for(int k=0;k<=1000;++k){
67 for(int i=0,p;i<v[k].size();++i){p=v[k][i];
68 for(int j=1;j<=v[k].size();++j)ans[p]+=dp[1][p][j]*(j+t-1);
69 }
70 t+=v[k].size();
71 }
72 for(int i=1;i<=n;++i)printf("%lf ",ans[i]);
73 puts("");
74 }
T3,直接粘题接&代码,此题给我的启示:学习暴力,学习卡常,++前置,加fread,重载max或直接用if,学会乱搞,减小枚举上界,然后就可以卡常AC此题

1 #include<bits/stdc++.h>
2 #define N 1000050
3 char xch,xB[1<<15],*xS=xB,*xTT=xB;
4 #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++)
5 inline int read()
6 {
7 int x=0,f=1;char ch=getc();
8 while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();}
9 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
10 return x*f;
11 }
12 using namespace std;
13 int n,K;
14 int a[N];
15 int ans[N];
16 int an2[N];
17 inline void work1()
18 {
19 for(int i=1;i<=n;++i)ans[i]=-1;
20 int ma,mi,an,o;
21 for(int i=n;i>=1;--i){
22 ma=mi=an=o=a[i];
23 for(int k=i+1;k<=n;++k){
24 if(a[k]>ma)ma=a[k];
25 if(a[k]<mi)mi=a[k];
26 an&=a[k];o|=a[k];
27 if(o+mi-ma-an>=K)ans[i]=k-i+1;
28 }
29 for(int k=min(n,i+ans[i]-1);k>i;--k)if(ans[k]<ans[i])ans[k]=ans[i];
30 }
31 for(int i=1;i<=n;++i)printf("%d ",ans[i]);
32 puts("");
33 }
34 inline void work2()
35 {
36 for(int i=1;i<=n;++i)ans[i]=-1;
37 int ma,mi,an,o;
38 for(int i=n;i>=1;--i){
39 ma=mi=an=o=a[i];
40 const int lim=min(n,i+700);
41 for(int k=i+1;k<=lim;++k){
42 if(a[k]>ma)ma=a[k];
43 if(a[k]<mi)mi=a[k];
44 an&=a[k];o|=a[k];
45 if(o+mi-ma-an>=K)ans[i]=k-i+1;
46 }
47 for(int k=min(n,i+ans[i]-1);k>i;--k)if(ans[k]<ans[i])ans[k]=ans[i];
48 }
49 for(int i=1;i<=n;++i)printf("%d ",ans[i]);
50 puts("");
51 }
52 int main()
53 {
54 scanf("%d%d",&n,&K);
55 for(int i=1;i<=n;++i)a[i]=read();
56 if(n>30000){work2();return 0;}
57 work1();return 0;
58 }
以下是正解:

正解代码:

1 #include<bits/stdc++.h>
2 #define N 1000050
3 char xch,xB[1<<15],*xS=xB,*xTT=xB;
4 #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++)
5 inline int read()
6 {
7 int x=0,f=1;char ch=getc();
8 while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();}
9 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
10 return x*f;
11 }
12 using namespace std;
13 int n,K,a[N],ans[N],bin[35],lg[N];
14 int st1[21][N],st2[21][N],st3[21][N],st4[21][N];//min max and or
15 inline void init()
16 {
17 for(int i=0;i<=30;++i)bin[i]=1<<i;lg[1]=0;
18 for(int i=2;i<=n;++i)lg[i]=lg[i>>1]+1;
19 for(int i=1;i<=n;++i)st1[0][i]=st2[0][i]=st3[0][i]=st4[0][i]=a[i];
20 for(int j=1;j<=20;++j)
21 for(int i=1;i<=n;++i){
22 st1[j][i]=min(st1[j-1][i],st1[j-1][i+bin[j-1]]);
23 st2[j][i]=max(st2[j-1][i],st2[j-1][i+bin[j-1]]);
24 st3[j][i]=st3[j-1][i]&st3[j-1][i+bin[j-1]];
25 st4[j][i]=st4[j-1][i]|st4[j-1][i+bin[j-1]];
26 }
27 }
28 inline int Min(int l,int r){return min(st1[lg[r-l+1]][l],st1[lg[r-l+1]][r-bin[lg[r-l+1]]+1]);}
29 inline int Max(int l,int r){return max(st2[lg[r-l+1]][l],st2[lg[r-l+1]][r-bin[lg[r-l+1]]+1]);}
30 inline int And(int l,int r){return st3[lg[r-l+1]][l]&st3[lg[r-l+1]][r-bin[lg[r-l+1]]+1];}
31 inline int Or(int l,int r){return st4[lg[r-l+1]][l]|st4[lg[r-l+1]][r-bin[lg[r-l+1]]+1];}
32 inline int getval(int l,int r){return Or(l,r)-And(l,r);}
33 struct list{int ne,pre,l,r;}li[N];int tot=1,kkk;
34 inline void del(int id){
35 int a1=li[id].pre,a2=li[id].ne;
36 li[a1].ne=a2;li[a2].pre=a1;li[a2].l=li[id].l;
37 }
38 inline bool check(int l,int r){
39 // printf("you checked:%d %d returned :%d\n",l,r,Or(l,r)+Min(l,r)-And(l,r)-Max(l,r));
40 return Or(l,r)+Min(l,r)-And(l,r)-Max(l,r)>=K;
41 }
42 int ma[N<<2];
43 inline void add(int g,int l,int r,int x,int y,int w){
44 if(l>y||r<x)return;
45 if(l>=x&&r<=y){ma[g]=max(ma[g],w);return;}
46 const int m=l+r>>1;
47 add(g<<1,l,m,x,y,w);add(g<<1|1,m+1,r,x,y,w);
48 }
49 inline void bl(int g,int l,int r)
50 {
51 ma[g]=max(ma[g],ma[g>>1]);
52 if(l==r){printf("%d ",ma[g]);return;}
53 const int m=l+r>>1;
54 bl(g<<1,l,m);bl(g<<1|1,m+1,r);
55 }
56 inline void erfen(int l,int r,const int alr)
57 {
58 // printf("l:%d r:%d\n",l,r);
59 int mid;
60 while(l+1<r)
61 {
62 mid=l+r>>1;
63 if(check(mid,alr))r=mid;
64 else l=mid;
65 }
66 add(1,1,n,r,alr,alr-r+1);
67 }
68 int main()
69 {
70 scanf("%d%d",&n,&K);memset(ma,0xFF,sizeof(ma));
71 for(int i=1;i<=n;++i)a[i]=read();
72 init();li[0].l=li[0].r=0;
73 for(int i=1;i<=n;++i)
74 {
75 // printf("now:%d \n",i);
76 li[kkk].ne=++tot;li[tot].pre=kkk;kkk=tot;
77 li[kkk].l=li[kkk].r=i;
78 for(int j=li[kkk].pre;j;j=li[j].pre)
79 if(getval(li[j].l,i)==getval(li[li[j].ne].l,i))del(j);
80 for(int j=li[0].ne;j;j=li[j].ne)
81 if(check(li[j].r,i)){erfen(li[j].l-1,li[j].r,i);break;}
82 }
83 bl(1,1,n);
84 puts("");
85 }
革命尚未成功,吾辈仍需努力
