「专题总结」交互题与提交答案题(3/10completed)

最有意思的专题了。做这个专题会上瘾。然而才做出来两个。(这个专题貌似是不可能做完的)

其实开这个坑的主要原因是要存ac代码,oj上存不了提答题的答案和生成代码。。。

小修和小栋猜♂数字:

$Description:$

这题非常无良。你也不知道你到底要还原出哪些,你也不知道几步完成能得满分。

题目大意就是让你写一份标程。。?

我第一次看这道题以为标程的询问次数是$O(nlogn)$级别的,然而事实上并不是。

标程能还原出$n-4$个位置,并且在最差情况下操作步数是$2n-4$。

可能这道题不算很难。但其实这道题不是很可想。

应该可以嗅到大力分类讨论的气息,但是依旧不知道从何下手。

事实上,你维护不出来的永远是最值和次值,关于最值你一无所知,关于次值你只知道大小但是分不清它与最大值的位置。

这四个东西虽说你求不出来,但是它对你求解其它数有很大帮助啊。

如果你能猜出最大值和最小值的位置,那么你查询这两个位置+任意一个位置,就能知道后者的值。

所以我们维护最值和次值可能出现的位置。具体不清楚,但是可以大致确定在最与次的范围内。

即对于序列的前4个值,通过4次询问找到哪两个较大哪两个较小,以此分为两组${ q10,q11},{ q20,q21}$,同时我们可以确定次大值$v_1$与次小值$v_0$的大小。

接下来我们从两组中各取一个点$q10,q20$,与序列中下一个数$a_i$比较,设查询结果为$V$

若$v_0<V<v_1$,那么就知道我们维护的四个数是最,次值,而新加入的值位于中间作为中位数,也就是$a_i=V$

若$v_0=V$,那么我们就知道次小值变成了中位数,只有可能是$a_i<v_0$,新的次小值变成$a_i$,同时我们确定$a_{q10}=v_0$

若$v_0>V$,那么这代表的唯一情况是你查询到了新的次小值,它可能是$a_i$也可能是$q10$,于是我们可以回答$a_{q11}=v_0$。

  $q10,a_i$取代它成为最/次小值。然而因为我们还需要维护次小值是多少所以还需要询问一次$v_1=ask(q10,a_i,q20)$

$v_1=V$与$v_1<V$的情况同理,不再赘述。

就这样对于每种情况我们都能还原出一个值,一共$n-4$个。

对于每种情况我们会调用$1$或$2$次$ask$,加上最初的$4$次于是在最差情况下是$2n-4$次。

所以就可以$AC$了。大型分类讨论稍恶心。

 1 #include"guess.h"
 2 void guess(int n){
 3     if(n<5)return;
 4     int x[5],q10,q11,q20,q21,v0,v1;
 5     x[1]=ask(2,3,4);x[2]=ask(1,3,4);x[3]=ask(1,2,4);x[4]=ask(1,2,3);
 6     int s1,s2,s3;for(int i=2;i<5;++i)if(x[i]==x[1])s1=i;else s2=i;
 7     for(int i=2;i<5;++i)if(i!=s1&&i!=s2)s3=i;
 8     if(x[1]<x[s2])q20=1,q21=s1,q10=s2,q11=s3,v1=x[s2],v0=x[1];
 9     else q10=1,q11=s1,q20=s2,q21=s3,v1=x[1],v0=x[s2];
10     for(int i=5;i<=n;++i){
11         int V=ask(q10,q20,i);
12         if(v0<V&&V<v1)answer(i,V);
13         else if(V==v1)answer(q20,V),q20=i,v1=ask(q10,i,q21);
14         else if(V==v0)answer(q10,V),q10=i,v0=ask(q11,i,q20);
15         else if(V>v1)answer(q21,v1),q21=i,v1=V;
16         else answer(q11,v0),q11=i,v0=V;
17     }
18 }
View Code

最大差分:

$Description:$

题面都是$LATEX$不好粘于是放图片了。这是远古交互题所以还要通过标准读入输出来交互。

然而做这道题的时候我又弱智了。

第一个子任务的签到分都卡了好久,刚开始还以为是$mikufun$大神在嘲讽我后来才发现真是我沙雕了。

每次询问时它会返回两个数,你就确定这两个数了,不断缩小范围就可以了。

第二个子任务的思路其实可能能想到但是容易算错复杂度,我想到了然后以为是$O(nsqrt{n})$的就去研究其它$O(nlogn)$的了。

到这里就跑偏了,于是$mikufun$大神告诉我这道题和哪道题比较像了。

类似于《股市预测》那道题的思想,每隔$frac{maxn}{n}$设置一个哨兵节点($maxn$是最大最小值之间的差)。

确认最大最小值付出了$n+1$的代价。

比较明显的是最终的答案一定大于等于$frac{maxn}{n}$,所以一定会经过至少一个哨兵节点。

每次查询相邻两个哨兵节点之间的部分,拿它们不断拼接就能得到最长的部分。

这样额外的查询次数是$n$次,查询到的总元素数量是$n-2$。(两端已经确定,不用再查了)

总代价是$3n-1$。卡的挺满的。

再次强调哨兵节点这种思路,希望下次能自己想出来吧。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 set<long long>s;
 4 long long a[100005],h,t,ans,bl[100005],ansl[100005],ansr[100005];
 5 void ask(long long a,long long b,long long &L,long long &R){
 6     printf("? %lld %lld
",a,b);fflush(stdout);
 7     scanf("%lld%lld",&L,&R);
 8 }
 9 int main(){
10     int T,n;scanf("%d%d",&T,&n);a[n+1]=1000000000000000001;h=1;t=n;
11     if(T==1){
12         while(h<=t)ask(a[h-1]+1,a[t+1]-1,a[h],a[t]),h++,t--;
13         for(int i=2;i<=n;++i)ans=max(ans,a[i]-a[i-1]);
14         printf("! %lld
",ans);
15     }
16     long long l,r;ask(1,1000000000000000000,l,r);
17     bl[1]=l;
18     for(int i=2;i<=n;++i)bl[i]=l+(r-l)/(n-1)*(i-1);bl[n]=r;
19     for(int i=2;i<=n;++i)ask(bl[i-1]+1,bl[i],ansl[i],ansr[i]);
20     s.insert(l);for(int i=2;i<=n;++i)if(ansl[i]!=-1)s.insert(ansl[i]),s.insert(ansr[i]);
21     for(int i=2;i<=n;++i)ans=max(ans,(*s.lower_bound(bl[i]))-(*(--s.lower_bound(bl[i]))));
22     printf("! %lld
",ans);
23 }
View Code

远古计算机:

$Description:$

题面是真的长,但是的确有必要读完。但是其实用到的指令只有$jmp,add,read,write$。而且每台计算机有1个存储单元就够了。

说了这么多都是在误导你。要求就是让你用一种远古语言写代码,得分与执行语句数最多的计算机的执行次数有关

然而这玩意居然不下发评分标准,所以你写了一份你觉得足够优秀的代码交上去依旧可能爆零。

而且它还卡常,幸而下发了checker,开个无限栈就能用了。对着它random或调参,难受的不行。

子任务1:

阅读理解的分。按照题意写一个代码就行。

要注意题目描述中说了程序执行完之后会循环所以不用手写$jmp$。

子任务2:

拿两个$int$变量递推$Fib_k$这貌似是无解的,因为你要花一个$int$来存$k$

而评分参数是$4,5,50$。$50$显然是递推不出来的。

前两档指向$O(1)$算法。通项显然不行,选择打表。

要注意,输出多了是没错的。

子任务3:

简单最短路,路上的所有点都读一下输一下就好,写个$BFS$让它输出代码就行。

然而生成代码被我盖了。。。只扔提交答案了。

子任务4:

点很多所以最短路并不长。

多源最短路,还是$BFS$,但是这样的话貌似只能拿一两档分。

反正是提交答案题而且$checker$还在手里,多$random shuffle$几组找最优的交上去就行了。

然而在子任务5前这都是渣渣,呃这就是我生成代码丢了的原因。

子任务5:

严重「卡常」,评分参数是$21,22,31$。而$21$是唯一最优解。

第一反应是那种拆点+网络流来表示每个点在某个时候是否在忙碌。

然而事实上只要依次安排10项任务即可。跑10遍最短路,给路径上的点在相应时间打上标记。

做最短路到这个点时如果它正在忙碌那么就等待相应时间再来更新它的距离。

倒也不是想不出来,只是想出来了也不是很敢写。

还是要对着$checker$疯狂调参。这回总算是记得留代码了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int fir[61111],l[61111],to[61111],ec,dep[61111],n,m,t,h,q[61111],bz[111][111],pre[66666],suc[66666],X[6666],Y[6666];
 4 vector<pair<int,int> >in[66666],out[66666];
 5 void link(int a,int b){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;}
 6 int main(){srand(19260817);
 7     freopen("oldcomputer5.in","r",stdin);freopen("5","w",stdout);
 8     cin>>t>>n>>m;
 9     for(int i=1,x,y;i<=m;++i)cin>>X[i]>>Y[i];
10     for(int i=m;i;--i)link(X[i],Y[i]),link(Y[i],X[i]);
11     for(int i=1;i<=10;++i)bz[i][0]=bz[i][1]=1;
12     for(int S=1;S<=10;++S){
13         int h=1,t=1;
14         for(int i=1;i<=n;++i)dep[i]=546546854,pre[i]=suc[i]=0;
15         dep[S]=0;q[1]=S;
16         while(h<=t){
17             for(int i=fir[q[h]];i;i=l[i]){
18                 int w=dep[q[h]]+1;
19                 while(bz[to[i]][w+1]||bz[to[i]][w])w++;
20                 if(w<dep[to[i]])dep[to[i]]=w,pre[to[i]]=q[h],q[++t]=to[i];
21             }h++;
22         }
23         int T=101-S;
24         while(T)suc[pre[T]]=T,T=pre[T];
25         T=101-S;
26         while(T)
27             in[T].push_back(make_pair(dep[T],pre[T])),
28             out[T].push_back(make_pair(dep[T]+1,suc[T])),
29             bz[T][dep[T]]=bz[T][dep[T]+1]=1,
30             T=pre[T];
31     }
32     for(int i=1;i<=n;++i){
33         sort(in[i].begin(),in[i].end());sort(out[i].begin(),out[i].end());
34         if(in[i].empty())continue;
35         printf("node %d
",i);
36         int o[30],x=in[i].size();
37         for(int j=0;j<x;++j)o[j]=j;
38         for(int j=0;j<x;++j)printf("read %d a
write a %d
",in[i][o[j]].second,out[i][o[j]].second);
39     }
40 }
5生成
1 node 1
2 read 0 a
3 write a 0
1答案
 1 node 1
 2 read 0 a
 3 add a 4
 4 jmp a
 5 write 0 0
 6 write 1 0
 7 write 1 0
 8 write 2 0
 9 write 3 0
10 write 5 0
11 write 8 0
12 write 13 0
13 write 21 0
14 write 34 0
15 write 55 0
16 write 89 0
17 write 144 0
18 write 233 0
19 write 377 0
20 write 610 0
21 write 987 0
22 write 1597 0
23 write 2584 0
24 write 4181 0
25 write 6765 0
26 write 10946 0
27 write 17711 0
28 write 28657 0
29 write 46368 0
30 write 75025 0
31 write 121393 0
32 write 196418 0
33 write 317811 0
34 write 514229 0
35 write 832040 0
36 write 1346269 0
37 write 2178309 0
38 write 3524578 0
39 write 5702887 0
40 write 9227465 0
41 write 14930352 0
42 write 24157817 0
43 write 39088169 0
44 write 63245986 0
45 write 102334155 0
46 write 165580141 0
47 write 267914296 0
48 write 433494437 0
49 write 701408733 0
2答案
 1 node 1
 2 read 0 a
 3 write a 7
 4 node 7
 5 read 1 a
 6 write a 13
 7 node 13
 8 read 7 a
 9 write a 54
10 node 54
11 read 13 a
12 write a 40
13 node 40
14 read 54 a
15 write a 50
16 node 50
17 read 40 a
18 write a 36
19 node 36
20 read 50 a
21 write a 37
22 node 37
23 read 36 a
24 write a 56
25 node 56
26 read 37 a
27 write a 98
28 node 98
29 read 56 a
30 write a 80
31 node 80
32 read 98 a
33 write a 100
34 node 100
35 read 80 a
36 write a 0
3答案
  1 node 42
  2 read 0 a
  3 write a 975
  4 node 17
  5 read 0 a
  6 write a 620
  7 node 19
  8 read 0 a
  9 write a 524
 10 node 975
 11 read 42 a
 12 write a 640
 13 node 1
 14 read 0 a
 15 write a 273
 16 node 8
 17 read 0 a
 18 write a 881
 19 node 13
 20 read 0 a
 21 write a 469
 22 node 14
 23 read 0 a
 24 write a 537
 25 node 16
 26 read 0 a
 27 write a 915
 28 node 20
 29 read 0 a
 30 write a 401
 31 node 22
 32 read 0 a
 33 write a 188
 34 node 24
 35 read 0 a
 36 write a 677
 37 node 30
 38 read 0 a
 39 write a 553
 40 node 36
 41 read 0 a
 42 write a 567
 43 node 38
 44 read 0 a
 45 write a 864
 46 node 43
 47 read 0 a
 48 write a 346
 49 node 44
 50 read 0 a
 51 write a 595
 52 node 45
 53 read 0 a
 54 write a 786
 55 node 50
 56 read 0 a
 57 write a 297
 58 node 524
 59 read 19 a
 60 write a 692
 61 node 620
 62 read 17 a
 63 write a 465
 64 node 640
 65 read 975 a
 66 write a 931
 67 node 4
 68 read 0 a
 69 write a 790
 70 node 5
 71 read 0 a
 72 write a 277
 73 node 6
 74 read 0 a
 75 write a 821
 76 node 10
 77 read 0 a
 78 write a 763
 79 node 11
 80 read 0 a
 81 write a 562
 82 node 21
 83 read 0 a
 84 write a 319
 85 node 23
 86 read 0 a
 87 write a 912
 88 node 27
 89 read 0 a
 90 write a 790
 91 node 28
 92 read 0 a
 93 write a 255
 94 node 31
 95 read 0 a
 96 write a 303
 97 node 33
 98 read 0 a
 99 write a 619
100 node 34
101 read 0 a
102 write a 917
103 node 35
104 read 0 a
105 write a 237
106 node 37
107 read 0 a
108 write a 618
109 node 39
110 read 0 a
111 write a 745
112 node 41
113 read 0 a
114 write a 249
115 node 46
116 read 0 a
117 write a 214
118 node 47
119 read 0 a
120 write a 410
121 node 48
122 read 0 a
123 write a 768
124 node 49
125 read 0 a
126 write a 564
127 node 188
128 read 22 a
129 write a 802
130 node 273
131 read 1 a
132 write a 770
133 node 297
134 read 50 a
135 write a 973
136 node 346
137 read 43 a
138 write a 326
139 node 401
140 read 20 a
141 write a 808
142 node 465
143 read 620 a
144 write a 29
145 node 469
146 read 13 a
147 write a 611
148 node 537
149 read 14 a
150 write a 924
151 node 553
152 read 30 a
153 write a 718
154 node 567
155 read 36 a
156 write a 449
157 node 595
158 read 44 a
159 write a 391
160 node 677
161 read 24 a
162 write a 934
163 node 692
164 read 524 a
165 write a 104
166 node 786
167 read 45 a
168 write a 319
169 node 864
170 read 38 a
171 write a 934
172 node 881
173 read 8 a
174 write a 15
175 node 915
176 read 16 a
177 write a 571
178 node 931
179 read 640 a
180 write a 912
181 node 2
182 read 0 a
183 write a 54
184 node 3
185 read 0 a
186 write a 97
187 node 7
188 read 0 a
189 write a 53
190 node 9
191 read 0 a
192 write a 82
193 node 12
194 read 0 a
195 write a 90
196 node 15
197 read 0 a
198 write a 81
199 read 881 a
200 write a 81
201 node 18
202 read 0 a
203 write a 96
204 node 25
205 read 0 a
206 write a 74
207 node 26
208 read 0 a
209 write a 57
210 node 29
211 read 0 a
212 write a 93
213 read 465 a
214 write a 93
215 node 32
216 read 0 a
217 write a 53
218 node 40
219 read 0 a
220 write a 74
221 node 104
222 read 692 a
223 write a 68
224 node 214
225 read 46 a
226 write a 95
227 node 237
228 read 35 a
229 write a 91
230 node 249
231 read 41 a
232 write a 69
233 node 255
234 read 28 a
235 write a 86
236 node 277
237 read 5 a
238 write a 98
239 node 303
240 read 31 a
241 write a 73
242 node 319
243 read 786 a
244 write a 58
245 read 21 a
246 write a 58
247 node 326
248 read 346 a
249 write a 59
250 node 391
251 read 595 a
252 write a 74
253 node 410
254 read 47 a
255 write a 64
256 node 449
257 read 567 a
258 write a 66
259 node 562
260 read 11 a
261 write a 66
262 node 564
263 read 49 a
264 write a 95
265 node 571
266 read 915 a
267 write a 84
268 node 611
269 read 469 a
270 write a 55
271 node 618
272 read 37 a
273 write a 89
274 node 619
275 read 33 a
276 write a 98
277 node 718
278 read 553 a
279 write a 56
280 node 745
281 read 39 a
282 write a 78
283 node 763
284 read 10 a
285 write a 91
286 node 768
287 read 48 a
288 write a 59
289 node 770
290 read 273 a
291 write a 87
292 node 790
293 read 27 a
294 write a 100
295 read 4 a
296 write a 100
297 node 802
298 read 188 a
299 write a 85
300 node 808
301 read 401 a
302 write a 61
303 node 821
304 read 6 a
305 write a 81
306 node 912
307 read 23 a
308 write a 71
309 read 931 a
310 write a 71
311 node 917
312 read 34 a
313 write a 68
314 node 924
315 read 537 a
316 write a 70
317 node 934
318 read 677 a
319 write a 97
320 read 864 a
321 write a 97
322 node 973
323 read 297 a
324 write a 77
325 node 53
326 read 7 a
327 write a 0
328 read 32 a
329 write a 0
330 node 54
331 read 2 a
332 write a 0
333 node 55
334 read 611 a
335 write a 0
336 node 56
337 read 718 a
338 write a 0
339 node 57
340 read 26 a
341 write a 0
342 node 58
343 read 319 a
344 write a 0
345 read 319 a
346 write a 0
347 node 59
348 read 768 a
349 write a 0
350 read 326 a
351 write a 0
352 node 61
353 read 808 a
354 write a 0
355 node 64
356 read 410 a
357 write a 0
358 node 66
359 read 562 a
360 write a 0
361 read 449 a
362 write a 0
363 node 68
364 read 917 a
365 write a 0
366 read 104 a
367 write a 0
368 node 69
369 read 249 a
370 write a 0
371 node 70
372 read 924 a
373 write a 0
374 node 71
375 read 912 a
376 write a 0
377 read 912 a
378 write a 0
379 node 73
380 read 303 a
381 write a 0
382 node 74
383 read 25 a
384 write a 0
385 read 40 a
386 write a 0
387 read 391 a
388 write a 0
389 node 77
390 read 973 a
391 write a 0
392 node 78
393 read 745 a
394 write a 0
395 node 81
396 read 15 a
397 write a 0
398 read 821 a
399 write a 0
400 read 15 a
401 write a 0
402 node 82
403 read 9 a
404 write a 0
405 node 84
406 read 571 a
407 write a 0
408 node 85
409 read 802 a
410 write a 0
411 node 86
412 read 255 a
413 write a 0
414 node 87
415 read 770 a
416 write a 0
417 node 89
418 read 618 a
419 write a 0
420 node 90
421 read 12 a
422 write a 0
423 node 91
424 read 237 a
425 write a 0
426 read 763 a
427 write a 0
428 node 93
429 read 29 a
430 write a 0
431 read 29 a
432 write a 0
433 node 95
434 read 564 a
435 write a 0
436 read 214 a
437 write a 0
438 node 96
439 read 18 a
440 write a 0
441 node 97
442 read 3 a
443 write a 0
444 read 934 a
445 write a 0
446 read 934 a
447 write a 0
448 node 98
449 read 619 a
450 write a 0
451 read 277 a
452 write a 0
453 node 100
454 read 790 a
455 write a 0
456 read 790 a
457 write a 0
4答案
  1 node 1
  2 read 0 a
  3 write a 77
  4 node 2
  5 read 0 a
  6 write a 30
  7 node 3
  8 read 0 a
  9 write a 4
 10 node 4
 11 read 0 a
 12 write a 71
 13 read 3 a
 14 write a 71
 15 node 5
 16 read 0 a
 17 write a 60
 18 read 6 a
 19 write a 60
 20 node 6
 21 read 0 a
 22 write a 5
 23 read 7 a
 24 write a 75
 25 node 7
 26 read 0 a
 27 write a 47
 28 read 8 a
 29 write a 6
 30 node 8
 31 read 0 a
 32 write a 7
 33 node 9
 34 read 0 a
 35 write a 52
 36 read 10 a
 37 write a 52
 38 node 10
 39 read 0 a
 40 write a 9
 41 node 11
 42 read 60 a
 43 write a 19
 44 read 68 a
 45 write a 13
 46 node 13
 47 read 71 a
 48 write a 26
 49 read 87 a
 50 write a 26
 51 read 71 a
 52 write a 26
 53 read 11 a
 54 write a 26
 55 node 14
 56 read 53 a
 57 write a 84
 58 node 15
 59 read 52 a
 60 write a 47
 61 node 16
 62 read 36 a
 63 write a 23
 64 node 17
 65 read 70 a
 66 write a 43
 67 node 19
 68 read 26 a
 69 write a 58
 70 read 26 a
 71 write a 58
 72 read 26 a
 73 write a 58
 74 read 11 a
 75 write a 58
 76 node 20
 77 read 31 a
 78 write a 57
 79 read 31 a
 80 write a 59
 81 read 53 a
 82 write a 59
 83 node 21
 84 read 82 a
 85 write a 23
 86 read 27 a
 87 write a 65
 88 read 27 a
 89 write a 82
 90 node 22
 91 read 25 a
 92 write a 31
 93 read 25 a
 94 write a 74
 95 node 23
 96 read 21 a
 97 write a 35
 98 read 16 a
 99 write a 35
100 node 24
101 read 74 a
102 write a 53
103 read 31 a
104 write a 53
105 read 31 a
106 write a 53
107 node 25
108 read 47 a
109 write a 22
110 read 68 a
111 write a 22
112 read 32 a
113 write a 68
114 node 26
115 read 13 a
116 write a 19
117 read 13 a
118 write a 19
119 read 13 a
120 write a 19
121 read 13 a
122 write a 72
123 node 27
124 read 37 a
125 write a 21
126 read 37 a
127 write a 21
128 node 28
129 read 90 a
130 write a 82
131 node 30
132 read 2 a
133 write a 38
134 node 31
135 read 22 a
136 write a 20
137 read 49 a
138 write a 20
139 read 49 a
140 write a 24
141 read 49 a
142 write a 24
143 node 32
144 read 89 a
145 write a 25
146 node 33
147 read 81 a
148 write a 96
149 read 45 a
150 write a 96
151 node 34
152 read 53 a
153 write a 80
154 node 35
155 read 23 a
156 write a 81
157 read 23 a
158 write a 65
159 node 36
160 read 72 a
161 write a 16
162 node 37
163 read 88 a
164 write a 27
165 read 88 a
166 write a 27
167 node 38
168 read 30 a
169 write a 87
170 read 71 a
171 write a 87
172 read 71 a
173 write a 87
174 node 39
175 read 80 a
176 write a 98
177 node 40
178 read 85 a
179 write a 91
180 node 42
181 read 87 a
182 write a 88
183 read 87 a
184 write a 88
185 node 43
186 read 17 a
187 write a 69
188 node 45
189 read 55 a
190 write a 97
191 read 55 a
192 write a 33
193 node 47
194 read 7 a
195 write a 25
196 read 15 a
197 write a 75
198 node 48
199 read 66 a
200 write a 99
201 node 49
202 read 58 a
203 write a 31
204 read 58 a
205 write a 31
206 read 58 a
207 write a 31
208 node 52
209 read 9 a
210 write a 89
211 read 9 a
212 write a 15
213 node 53
214 read 24 a
215 write a 20
216 read 24 a
217 write a 14
218 read 24 a
219 write a 34
220 node 54
221 read 67 a
222 write a 81
223 read 67 a
224 write a 81
225 node 55
226 read 59 a
227 write a 45
228 read 59 a
229 write a 45
230 node 57
231 read 20 a
232 write a 86
233 node 58
234 read 19 a
235 write a 49
236 read 19 a
237 write a 49
238 read 19 a
239 write a 49
240 read 19 a
241 write a 86
242 node 59
243 read 20 a
244 write a 55
245 read 20 a
246 write a 55
247 node 60
248 read 5 a
249 write a 75
250 read 5 a
251 write a 11
252 read 75 a
253 write a 71
254 read 75 a
255 write a 71
256 node 65
257 read 21 a
258 write a 93
259 read 35 a
260 write a 93
261 node 66
262 read 84 a
263 write a 48
264 node 67
265 read 86 a
266 write a 54
267 read 86 a
268 write a 54
269 node 68
270 read 75 a
271 write a 25
272 read 25 a
273 write a 11
274 node 69
275 read 43 a
276 write a 90
277 node 70
278 read 77 a
279 write a 17
280 node 71
281 read 4 a
282 write a 13
283 read 4 a
284 write a 13
285 read 60 a
286 write a 38
287 read 60 a
288 write a 38
289 node 72
290 read 26 a
291 write a 36
292 node 74
293 read 22 a
294 write a 24
295 node 75
296 read 60 a
297 write a 68
298 read 6 a
299 write a 60
300 read 47 a
301 write a 60
302 node 77
303 read 1 a
304 write a 70
305 node 80
306 read 34 a
307 write a 39
308 node 81
309 read 54 a
310 write a 95
311 read 35 a
312 write a 33
313 read 54 a
314 write a 95
315 node 82
316 read 28 a
317 write a 21
318 read 21 a
319 write a 85
320 node 84
321 read 14 a
322 write a 66
323 node 85
324 read 82 a
325 write a 40
326 node 86
327 read 57 a
328 write a 67
329 read 58 a
330 write a 67
331 node 87
332 read 38 a
333 write a 13
334 read 38 a
335 write a 42
336 read 38 a
337 write a 42
338 node 88
339 read 42 a
340 write a 37
341 read 42 a
342 write a 37
343 node 89
344 read 52 a
345 write a 32
346 node 90
347 read 69 a
348 write a 28
349 node 91
350 read 40 a
351 write a 0
352 node 92
353 read 93 a
354 write a 0
355 node 93
356 read 65 a
357 write a 0
358 read 65 a
359 write a 92
360 node 94
361 read 95 a
362 write a 0
363 node 95
364 read 81 a
365 write a 94
366 read 81 a
367 write a 0
368 node 96
369 read 33 a
370 write a 97
371 read 33 a
372 write a 0
373 node 97
374 read 45 a
375 write a 0
376 read 96 a
377 write a 98
378 node 98
379 read 97 a
380 write a 99
381 read 39 a
382 write a 0
383 node 99
384 read 98 a
385 write a 100
386 read 48 a
387 write a 0
388 node 100
389 read 99 a
390 write a 0
5答案

noip十合一:

$Description:$

在 NOIP 2044 的赛场上,小 D 遇到了这样一道题:

给出一个n个点的图,其中有m条带权有向边,有q个询问,每个询问形如从s号点走到t号点,长度为x的道路数量有多少?你只需要输出答案P取模的结果即可。

小 D 思考了良久也不会做这道题,悻悻离场之后,他从官网上取得了这道题的数据,共有10组数据。

小 D 怎么也想做出来这道题,于是他开始寻求你的帮助,将10组数据的输入给了你。聪明的你一定可以帮小 D 计算出每组数据的输出的!

杂题十合一。直接按这个题意并不可做。观察数据特性转化题意。

$Test1:$

对于所有奇数点$i$,向$i+1$连一条$1$边。

对于所有偶数点$i$,向$i+1$连一条$0$边。

对于所有奇数点$i$,向$i+2$连一条$0$边。

$n=100000,m=149998,q=100000,mod=26873856,wle 1,x le 50000$

将偶数点压缩。直接转化为组合数问题。直接离线后杨辉三角递推。

预计耗时$5s$

不知道为什么在其它$OJ$上会$PC9$,错那么几百组询问。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,q,mod,ans[111111],C[111111];
 4 struct qs{int l,r,o,v;friend bool operator<(qs a,qs b){return a.r-a.l<b.r-b.l;}}Q[111111];
 5 int main(){
 6     freopen("noip1.in","r",stdin);freopen("1","w",stdout);
 7     scanf("%d%d%d%d",&n,&m,&q,&mod);
 8     for(int i=1;i<=m;++i)scanf("%*d%*d%*d");
 9     for(int i=1;i<=q;++i){
10         scanf("%d%d%d",&Q[i].l,&Q[i].r,&Q[i].v);
11         if(!(Q[i].l&1))Q[i].l++;
12         if(!(Q[i].r&1))Q[i].r--,Q[i].v--;
13         Q[i].o=i;
14     }sort(Q+1,Q+1+q);
15     int p=1;C[0]=1;
16     while(Q[p].r-Q[p].l<0&&p<=q)p++;
17     for(int i=0;i<=50000;++i){
18         for(int j=i;j;--j){C[j]+=C[j-1];if(C[j]>=mod)C[j]-=mod;}
19         while(Q[p].r-Q[p].l==i<<1&&p<=q){
20             int v=Q[p].v;
21             if(0<=v&&v<=i)ans[Q[p].o]=C[v];
22             p++;cerr<<p<<endl;
23         }
24     }for(int i=1;i<=q;++i)printf("%d
",ans[i]);
25 }
生成1

$Test2:$

所有点有一个有权自环,$i$到$i+1$有一条$0$边。

$n=100,m=199,q=100000,mod=19960826,w le 200,x le 50000,s=1$

多重背包。离线后按终点排序后直接做就行,也可以当成下一个测试点那么做。

预计耗时$0s$。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int mod,n,m,q,mx,bp[50005],v[101],ans[101][50005];
 4 int main(){
 5     freopen("noip2.in","r",stdin);freopen("2","w",stdout);
 6     scanf("%d%d%d%d",&n,&m,&q,&mod);
 7     bp[0]=1;
 8     for(int i=1;i<=n;++i){
 9         scanf("%*d%*d%d",&v[i]);
10         if(i!=n)scanf("%*d%*d%*d");
11     }
12     for(int i=1;i<=n;++i){
13         for(int j=0;j+v[i]<=50000;++j)bp[j+v[i]]+=bp[j],bp[j+v[i]]%=mod;
14         for(int j=0;j<=50000;++j)ans[i][j]=bp[j];
15     }
16     for(int i=1,P,V;i<=q;++i){
17         scanf("%*d%d%d",&P,&V);
18         printf("%d
",ans[P][V]);
19     }
20 }
生成2

$Test3:$

图的特性同上,数据范围不同。

$n=10000,m=19999,q=100000,mod=1998585857,w le 300,x le 1000$

不再保证起点为$1$。还是用背包的思路做。

莫队,背包是支持删除的。某个吴傻子曾经莫队没排序。。。

注意模数相加炸$int$

预计耗时$18s$。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int bp[1111],st[11111],n,m,mod,q,ans[111111];
 4 struct qs{
 5     int l,r,v,o;
 6     friend bool operator<(qs a,qs b){
 7         return a.l/100!=b.l/100?a.l<b.l:a.r<b.r;
 8     }
 9 }Q[111111];
10 int mo(long long x){return x>=mod?x-mod:x;}
11 void del(int x){
12     x=st[x];
13     for(int i=1000;i>=x;--i)bp[i]=mo(0ll-bp[i-x]+bp[i]+mod);
14 }
15 void add(int x){
16     x=st[x];
17     for(int i=0;i<=1000-x;++i)bp[i+x]=mo(0ll+bp[i+x]+bp[i]);
18 }
19 int main(){
20     freopen("noip3.in","r",stdin);freopen("noip3.out","w",stdout);
21     scanf("%d%d%d%d",&n,&m,&q,&mod);
22     for(int i=1;i<=n;++i){
23         scanf("%*d%*d%d",&st[i]);
24         if(i!=n)scanf("%*d%*d%*d");
25     }
26     bp[0]=1;
27     int l=1,r=0;
28     for(int i=1;i<=q;++i)scanf("%d%d%d",&Q[i].l,&Q[i].r,&Q[i].v),Q[i].o=i;
29     sort(Q+1,Q+1+q);
30     for(int i=1;i<=q;++i){cerr<<i<<endl;
31         while(l<Q[i].l)del(l++);
32         while(l>Q[i].l)add(--l);
33         while(r>Q[i].r)del(r--);
34         while(r<Q[i].r)add(++r);
35         ans[Q[i].o]=bp[Q[i].v];
36     }
37     for(int i=1;i<=q;++i)printf("%d
",ans[i]);
38 }
生成3

$Test4:$

图无特性。

$n=5,m=100000,q=100000,mod=1998585857,w le 50000,xle 50000$

点数很小,拆成$50000$个点直接拓扑就行。跑的比较慢。

预计耗时$2.5min$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[6][6][50005],n,m,mod,q;vector<pair<int,int> >v[6];
 4 int mo(long long x){return x>=mod?x-mod:x;}
 5 int main(){
 6     freopen("noip4.in","r",stdin);freopen("noip4.out","w",stdout);
 7     scanf("%d%d%d%d",&n,&m,&q,&mod);
 8     for(int i=1,a,b,x;i<=m;++i)scanf("%d%d%d",&a,&b,&x),v[a].push_back(make_pair(x,b));
 9     dp[1][1][0]=dp[2][2][0]=dp[3][3][0]=dp[4][4][0]=dp[5][5][0]=1;
10     for(int i=1;i<=5;++i)sort(v[i].begin(),v[i].end());
11     for(int d=0;d<=50000;++d,cerr<<d<<endl)for(int s=1;s<=5;++s)for(int t=1;t<=5;++t)if(dp[s][t][d])
12         for(int j=0;j<v[t].size();++j)if(d+v[t][j].first>50000)break;
13             else dp[s][v[t][j].second][d+v[t][j].first]=mo(0ll+dp[s][v[t][j].second][d+v[t][j].first]+dp[s][t][d]);
14     for(int i=1,a,b,c;i<=q;++i)scanf("%d%d%d",&a,&b,&c),printf("%d
",dp[a][b][c]);
15 }
View Code

$Test5:$

对于所有$x>10$的点入度出度均为1,与其直接相连的点的编号$le 10$

$n=50000,m=99980,q=100000,mod=1998585857,w le 200,xle 10000$

把编号大于10的点缩掉,然后和上一个点一样。

预计耗时$13.5s$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ui unsigned int
 4 int n,m,mod,q,out[66666],inval[66666],in[66666],outval[66666];ui dp[11][11][11111];
 5 ui mo(ui x){return x>=mod?x-mod:x;}
 6 vector<pair<ui,int> >v[11];
 7 int main(){
 8     freopen("noip5.in","r",stdin);
 9     freopen("noip5.out","w",stdout);
10     scanf("%d%d%d%d",&n,&m,&q,&mod);
11     for(int i=1;i<=m;i+=2){
12         int a,b,c,d,e,f;
13         scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
14         v[a].push_back(make_pair(c+f,e));
15         in[b]=a;out[b]=e;
16         inval[b]=c;outval[b]=f;
17     }
18     for(int i=1;i<=10;++i)sort(v[i].begin(),v[i].end()),dp[i][i][0]=1;
19     for(int d=0;d<=10000;++d,cerr<<d<<endl)
20         for(int s=1;s<=10;++s)
21             for(int t=1;t<=10;++t)
22                 if(dp[s][t][d])
23                     for(int i=0;i<v[t].size();++i)
24                         if(d+v[t][i].first>10000)break;
25                         else dp[s][v[t][i].second][d+v[t][i].first]=mo(dp[s][v[t][i].second][d+v[t][i].first]+dp[s][t][d]);
26     for(int i=1,a,b,c;i<=q;++i){
27         scanf("%d%d%d",&a,&b,&c);
28         if(a>10)c-=outval[a],a=out[a];
29         if(b>10)c-=inval[b],b=in[b];
30         printf("%u
",c>=0?dp[a][b][c]:0);
31     }
32 }
生成5

$Test6:$

图无特性。

$n=200,m=100000,q=100000,mod=1998585857,w=1,x le 10^9$

矩阵快速幂的模板题。我选择的是倍增预处理。跑的很慢。。。

预计耗时$11min$。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int mxt[33][222][222],n,m,mod,q,ans[222],r[222];
 4 int main(){
 5     freopen("noip6.in","r",stdin);freopen("noip6.out","w",stdout);
 6     scanf("%d%d%d%d",&n,&m,&q,&mod);
 7     for(int i=1,a,b;i<=m;++i)scanf("%d%d%*d",&a,&b),mxt[0][a][b]++;
 8     for(int t=0;t<32;++t)for(int i=1;i<=200;++i)for(int j=1;j<=200;++j)for(int k=1;k<=200;++k)
 9         mxt[t+1][i][k]=(mxt[t+1][i][k]+1ll*mxt[t][i][j]*mxt[t][j][k])%mod;
10     while(q-->0){cerr<<q<<endl;
11         int a,b,v;scanf("%d%d%d",&a,&b,&v);
12         for(int i=1;i<=200;++i)ans[i]=0;ans[a]=1;
13         for(int i=0;i<32;++i)if(v&1<<i){
14             for(int j=1;j<=200;++j)for(int k=1;k<=200;++k)r[k]=(r[k]+1ll*ans[j]*mxt[i][j][k])%mod;
15             for(int j=1;j<=200;++j)ans[j]=r[j],r[j]=0;
16         }printf("%d
",ans[b]);
17     }
18 }
生成6

$Test7:$

有$100$条边边权为$2$,其余均为$1$。

$n=100,m=100000,q=100000,mod=1998585857,w le 2,x le 10^9$

和上一问一样,但是对于边权为$2$的边单独拆出一个点就可以了。

采用了$skyh$之前某道题的那种分块预处理矩阵的方法

预计耗时$7min$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int mxt[1001][222][222],mxt2[1001][222][222],mxt3[1001][222][222],cnt=100,n,m,mod,q;
 4 int main(){
 5     freopen("noip7.in","r",stdin);freopen("noip7.out","w",stdout);
 6     scanf("%d%d%d%d",&n,&m,&q,&mod);
 7     for(int i=1;i<=200;++i)mxt[0][i][i]=mxt2[0][i][i]=mxt3[0][i][i]=1;
 8     for(int i=1,a,b,c;i<=m;++i){
 9         scanf("%d%d%d",&a,&b,&c);
10         if(c==1)mxt[1][a][b]++;
11         else ++cnt,mxt[1][a][cnt]++,mxt[1][cnt][b]++;
12     }
13     for(int i=2;i<=1000;++i,cerr<<i<<endl)for(int j=1;j<=200;++j)for(int k=1;k<=200;++k)if(mxt[i-1][j][k])for(int l=1;l<=200;++l)
14         mxt[i][j][l]=(mxt[i][j][l]+1ll*mxt[i-1][j][k]*mxt[1][k][l])%mod;
15     for(int i=1;i<=200;++i)for(int j=1;j<=200;++j)mxt2[1][i][j]=mxt[1000][i][j];
16     for(int i=2;i<=1000;++i,cerr<<i<<endl)for(int j=1;j<=200;++j)for(int k=1;k<=200;++k)if(mxt2[i-1][j][k])for(int l=1;l<=200;++l)
17         mxt2[i][j][l]=(mxt2[i][j][l]+1ll*mxt2[i-1][j][k]*mxt2[1][k][l])%mod;
18     for(int i=1;i<=200;++i)for(int j=1;j<=200;++j)mxt3[1][i][j]=mxt2[1000][i][j];
19     for(int i=2;i<=1000;++i,cerr<<i<<endl)for(int j=1;j<=200;++j)for(int k=1;k<=200;++k)if(mxt3[i-1][j][k])for(int l=1;l<=200;++l)
20         mxt3[i][j][l]=(mxt3[i][j][l]+1ll*mxt3[i-1][j][k]*mxt3[1][k][l])%mod;
21     while(q-->0){cerr<<q<<endl;
22         int a,b,v,v2,v3,ans=0;scanf("%d%d%d",&a,&b,&v);v3=v/1000000;v2=v/1000%1000;v=v%1000;
23         for(int i=1;i<=200;++i)for(int j=1;j<=200;++j)ans=(ans+1ll*mxt[v][a][i]*mxt2[v2][i][j]%mod*mxt3[v3][j][b])%mod;
24         printf("%d
",ans);
25     }
26 }
生成7

$Test8:$

图无特性。

$n=1000,m=100000,q=10000,mod=1998585857,w=1,x le 10^9$

既然还是没有特性。。。没关系,有耐心就行。。。拿第6个点的代码接着跑

预计耗时$34min$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int mxt[33][1111][1111],n,m,mod,q,ans[1111],r[1111];
 4 int main(){
 5     freopen("noip8.in","r",stdin);freopen("noip8.out","w",stdout);
 6     scanf("%d%d%d%d",&n,&m,&q,&mod);
 7     for(int i=1,a,b;i<=m;++i)scanf("%d%d%*d",&a,&b),mxt[0][a][b]++;
 8     for(int t=0;t<32;++t,cerr<<t<<endl)for(int i=1;i<=1000;++i)for(int j=1;j<=1000;++j)for(int k=1;k<=1000;++k)
 9         mxt[t+1][i][k]=(mxt[t+1][i][k]+1ll*mxt[t][i][j]*mxt[t][j][k])%mod;
10     while(q-->0){cerr<<q<<endl;
11         int a,b,v;scanf("%d%d%d",&a,&b,&v);
12         for(int i=1;i<=1000;++i)ans[i]=0;ans[a]=1;
13         for(int i=0;i<32;++i)if(v&1<<i){
14             for(int j=1;j<=1000;++j)for(int k=1;k<=1000;++k)r[k]=(r[k]+1ll*ans[j]*mxt[i][j][k])%mod;
15             for(int j=1;j<=1000;++j)ans[j]=r[j],r[j]=0;
16         }printf("%d
",ans[b]);
17     }
18 }
View Code

$Test9:$

边的端点在模1000意义下由$i$连向$i+1$

$n=10000,m=100000,q=100000,mod=19920826,w=1,x le 10^8$

那么只要存一下高位在哪里就行了。

预计耗时$1.5s$。但是答案暂时还不对,错了几百组。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,q,mod,mxt[1001][11][11],pre[1001][11][11],suc[1001][11][11],base1[100001][11][11],Errorcnt;
 4 int main(){
 5     freopen("noip9.in","r",stdin);freopen("noip9.out","w",stdout);
 6     scanf("%d%d%d%d",&n,&m,&q,&mod);
 7     for(int i=1;i<=m;++i){
 8         int a,b;scanf("%d%d%*d",&a,&b);
 9         mxt[a%1000][a/1000%10][b/1000%10]++;
10     }
11     for(int i=0;i<=9;++i)pre[0][i][i]=suc[1000][i][i]=suc[0][i][i]=base1[0][i][i]=1;
12     
13     for(int i=1;i<=1000;++i)for(int j=0;j<=9;++j)for(int k=0;k<=9;++k)for(int l=0;l<=9;++l)
14         pre[i][j][l]=(pre[i][j][l]+1ll*pre[i-1][j][k]*mxt[i-1][k][l])%mod;
15 
16     for(int i=999;~i;--i)for(int j=0;j<=9;++j)for(int k=0;k<=9;++k)for(int l=0;l<=9;++l)
17         suc[i][j][l]=(suc[i][j][l]+1ll*mxt[i][j][k]*suc[i+1][k][l])%mod;
18 
19     for(int i=0;i<=9;++i)for(int j=0;j<=9;++j)base1[1][i][j]=pre[1000][i][j];
20 
21     for(int i=2;i<=100000;++i)for(int j=0;j<=9;++j)for(int k=0;k<=9;++k)for(int l=0;l<=9;++l)
22         base1[i][j][l]=(base1[i][j][l]+1ll*base1[i-1][j][k]*base1[1][k][l])%mod;
23 
24     while(q-->0){cerr<<q<<endl;
25         register int a,b,c,ha,hb,la,lb,ans=0,b1,b2;
26         scanf("%d%d%d",&a,&b,&c);
27         ha=a/1000%10;hb=b/1000%10;
28         la=a%1000;lb=b%1000;
29         if(la)c-=1000-la;
30         if(!lb)c-=1000;
31         c-=lb;
32         b1=c/1000;
33         if(c<0)Errorcnt++;
34         for(register int i=0;i<=9;++i)for(register int j=0;j<=9;++j)
35             ans=(ans+1ll*suc[la][ha][i]*base1[b1][i][j]%mod*pre[lb][j][hb])%mod;
36         printf("%d
",ans);
37     }cerr<<Errorcnt<<endl;
38 }
View Code

.

原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/12186613.html