zoukankan      html  css  js  c++  java
  • 「专题总结」交互题与提交答案题(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

    .

  • 相关阅读:
    SKAction类
    SpriteKit所有的类
    Reachability下载地址
    IOS学习教程
    SpriteKit游戏开发
    APP开发者到期续费说明
    Unique Paths
    Letter Combinations of a Phone Number
    Reverse Nodes in k-Group
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/12186613.html
Copyright © 2011-2022 走看看