「专题总结」交互题与提交答案题(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 }
最大差分:
$Description:$
题面都是$LATEX$不好粘于是放图片了。这是远古交互题所以还要通过标准读入输出来交互。
然而做这道题的时候我又弱智了。
第一个子任务的签到分都卡了好久,刚开始还以为是$mikufun$大神在嘲讽我后来才发现真是我沙雕了。
每次询问时它会返回两个数,你就确定这两个数了,不断缩小范围就可以了。
第二个子任务的思路其实可能能想到但是容易算错复杂度,我想到了然后以为是$O(n\sqrt{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\n",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\n",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\n",ans); 23 }
远古计算机:
$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\n",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\nwrite a %d\n",in[i][o[j]].second,out[i][o[j]].second); 39 } 40 }
1 node 1 2 read 0 a 3 write a 0
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
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
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
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
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,w\le 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\n",ans[i]); 25 }
$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\n",ans[P][V]); 19 } 20 }
$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\n",ans[i]); 38 }
$Test4:$
图无特性。
$n=5,m=100000,q=100000,mod=1998585857,w \le 50000,x\le 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\n",dp[a][b][c]); 15 }
$Test5:$
对于所有$x>10$的点入度出度均为1,与其直接相连的点的编号$\le 10$
$n=50000,m=99980,q=100000,mod=1998585857,w \le 200,x\le 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\n",c>=0?dp[a][b][c]:0); 31 } 32 }
$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\n",ans[b]); 17 } 18 }
$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\n",ans); 25 } 26 }
$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\n",ans[b]); 17 } 18 }
$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\n",ans); 37 }cerr<<Errorcnt<<endl; 38 }
.