World Final 合集
想了想太蛋疼了……作业做完了把latex源码粘上来吧……
cnblogs不支持latex……你们自己看着办吧……
1 \documentclass[10pt,twosidep]{article} 2 \usepackage{amsmath} 3 \usepackage{CJK} 4 \usepackage{verbatim} 5 \usepackage{indentfirst} 6 \usepackage{syntonly} 7 \usepackage{fancyhdr} 8 \usepackage{supertabular} 9 \usepackage[CJKbookmarks=true, colorlinks, linkcolor=black, anchorcolor=black, citecolor=blackp, urlcolor=black]{hyperref} 10 \usepackage{graphicx} 11 \usepackage[top = 1.2in, bottom = 1.2in, left = 1.3in, right = 1.3in]{geometry} 12 %\usepackage{xcolor} 13 %\usepackage{listings} 14 %\usepackage{minted} 15 16 \begin{document} 17 \begin{CJK*}{GBK}{song} 18 19 \hypersetup{CJKbookmarks = true} 20 \pagestyle{fancy} 21 %\definecolor{bg}{RGB}{30, 30, 30} 22 %\newminted[C++]{cpp}{mathescape, numbersep = 5pt, obeytabs, gobble = 10, frame = single, framesep = -2mm, bgcolor = bg} 23 24 \setlength{\parindent}{2em} 25 \setlength{\footskip}{30pt} 26 \setlength{\baselineskip}{1.3\baselineskip} 27 28 \centerline{\huge{IOI2014中国国家集训队第一次作业第二部分试题泛做表格}} 29 30 \rightline{} 31 32 \centerline{\large{姓名:钟皓曦}} 33 34 \rightline{} 35 36 \newpage 37 38 39 40 \leftline{\textbf{试题编号}} 41 1998 B\\ 42 43 44 45 \leftline{\textbf{题目名称}} 46 Flight Planning\\ 47 48 49 50 \leftline{\textbf{题目大意}} 51 给出每一段的风速、飞机的单位时间耗油、不同的飞行高度和攀爬高度给飞机带来的油耗,问飞机的最少油耗已经达到该油耗的最小字典序的方案。\\ 52 53 54 55 \leftline{\textbf{算法讨论}} 56 我们用$f[i][j]$表示第$i$段的飞行高度为$j$飞完剩下的所有路程的最小油耗。(这样表示是为了方便处理最小字典序的方案)那么转移就是枚举当前段和下一段的飞行高度算出代价即可。\\ 57 58 59 60 61 \leftline{\textbf{时空复杂度}} 62 时间复杂度 $O(N^3)$ 63 64 65 空间复杂度 $O(N^2)$ \\ 66 67 \newpage 68 69 70 \leftline{\textbf{试题编号}} 71 1998 C\\ 72 73 74 75 \leftline{\textbf{题目名称}} 76 Lead or Gold\\ 77 78 79 80 \leftline{\textbf{题目大意}} 81 给出每种物品的三种配方混合比,问能否做出某个特定的三种配方比例的物品。\\ 82 83 84 85 \leftline{\textbf{算法讨论}} 86 假设给出的物体三种配方比例是$x:y:z$,我们首先将$x$、$y$、$z$调整为$x+y+z=1$。那么这个时候只要有$x$和$y$就能够确定$z$ 了。所以任意一种物品都可以只用$x$和$y$来表示。那么我们接下来就只需要考虑二维的情况了。我们将每种物品表示为平面上的一个点$(x,y)$。那么一种比例的物品能够被混合出来的条件就是它所表示出来的点在可用物品所组成的凸包内部。所以我们将点全部表示出来之后做出凸包之后检验最后的点是否在凸包内部即可。\\ 87 88 89 90 91 \leftline{\textbf{时空复杂度}} 92 时间复杂度 $O(N^3)$ 93 94 95 空间复杂度 $O(N)$ \\ 96 97 \newpage 98 99 100 101 \leftline{\textbf{试题编号}} 102 1998 D\\ 103 104 105 106 \leftline{\textbf{题目名称}} 107 Page Selection by Keyword Matching\\ 108 109 110 111 \leftline{\textbf{题目大意}} 112 给出每个网站的关键字,每次询问询问与给出关键字关联度前五大的网页编号。\\ 113 114 115 116 \leftline{\textbf{算法讨论}} 117 直接模拟算出每个网站的关联度然后排序即可。注意大小写是没有区分的。\\ 118 119 120 121 122 \leftline{\textbf{时空复杂度}} 123 时间复杂度 $O(NM)$ 124 125 126 空间复杂度 $O(NM)$ \\ 127 128 \newpage 129 130 131 132 \leftline{\textbf{试题编号}} 133 1998 E\\ 134 135 136 137 \leftline{\textbf{题目名称}} 138 Petri Net Simulation\\ 139 140 141 142 \leftline{\textbf{题目大意}} 143 有$N$个仓库和$M$种转存方式。每种转存方式会从一些仓库中取出一定数量的物品,然后在另外某些仓库中放入某些物品。一个转存方式是合法的当且仅当能够拿出足够数量的物品。你每次可以从合法的转存方式中选一种出来进行转存。问能否成功进行$T$次转存,数据保证无论你每次怎样选取转存方式最后得到的结果相同。\\ 144 145 146 147 \leftline{\textbf{算法讨论}} 148 直接模拟即可。每次枚举进行哪一种转存方式,能进行就直接进行。:D\\ 149 150 151 152 153 \leftline{\textbf{时空复杂度}} 154 时间复杂度 $O(NMT)$ 155 156 157 空间复杂度 $O(NM)$ \\ 158 159 \newpage 160 161 162 163 164 \leftline{\textbf{试题编号}} 165 1998 G\\ 166 167 168 169 \leftline{\textbf{题目名称}} 170 Spatial Structures\\ 171 172 173 174 \leftline{\textbf{题目大意}} 175 给出一个矩阵或者一个矩阵的黑点象限四分树,求该矩阵的黑点象限四分树或者该矩阵。\\ 176 177 178 179 \leftline{\textbf{算法讨论}} 180 直接模拟即可。\\ 181 182 183 184 185 \leftline{\textbf{时空复杂度}} 186 时间复杂度 $O(N^2)$ 187 188 189 空间复杂度 $O(N^2)$ \\ 190 191 \newpage 192 193 194 195 196 197 198 \leftline{\textbf{试题编号}} 199 1999 A\\ 200 201 202 203 \leftline{\textbf{题目名称}} 204 Bee Breeding\\ 205 206 207 208 \leftline{\textbf{题目大意}} 209 一张无限大的六边形网格图,每次可以从一个六边形走到周围的六个六边形,问某两个六边形之间的最短距离。\\ 210 211 212 213 \leftline{\textbf{算法讨论}} 214 我们将给出的1号点的坐标定为$(0,0)$,将从左上到右下的线作为Y轴,将竖线作为X轴建立坐标系。那么我们会发现从一个点能走出去的六个方向的(deltax,deltay)为$(1,0)$、$(1,-1)$、$(0,-1)$、\newline$(-1,0)$、$(-1,1)$和$(0,1)$。那么接下来可以算出询问的两点的坐标后进行bfs 求解即可。(也可以推公式,因为我们可以发现如果将现有坐标转移到方格坐标上后从一个方格向周围的八个方向仅有两个方向不能走,所以可以按象限进行分情况讨论)\\ 215 216 217 218 219 \leftline{\textbf{时空复杂度}} 220 时间复杂度 $O(1)$ 221 222 223 空间复杂度 $O(1)$ \\ 224 225 \newpage 226 227 228 229 230 \leftline{\textbf{试题编号}} 231 1999 C\\ 232 233 234 235 \leftline{\textbf{题目名称}} 236 A Dicey Problem\\ 237 238 239 240 \leftline{\textbf{题目大意}} 241 给出一张地图和一开始一个骰子的状态(位置和方向)。每次你可以把骰子向某个方向进行翻转移动,要求移动到的地方的数值与骰子的顶面数字相等(或者数值为$-1$)。要求找出一条从起点出发再回到起点的移动路径。\\ 242 243 244 245 \leftline{\textbf{算法讨论}} 246 由于即使骰子到达同一个地方但是各个数字的朝向也会不一样,所以我们用一个思维状态表示走到某个地方且此时的顶面数字和正前方数字各是多少(只需要这两个数字即可确定骰子的状态)。在这个基础上在做bfs即可。\\ 247 248 249 250 251 \leftline{\textbf{时空复杂度}} 252 时间复杂度 $O(N^2)$ 253 254 255 空间复杂度 $O(N^2)$ \\ 256 257 \newpage 258 259 260 261 262 263 \leftline{\textbf{试题编号}} 264 1999 D\\ 265 266 267 268 \leftline{\textbf{题目名称}} 269 The Fortified Forest\\ 270 271 272 273 \leftline{\textbf{题目大意}} 274 有N棵树,要求砍掉最少代价的树,使得获得的木材能够将剩下的树围住。\\ 275 276 277 278 \leftline{\textbf{算法讨论}} 279 我们枚举我们需要砍掉哪些树,那么此时能够获得的木材以及花费的代价都确定了。对于剩下没有被砍掉的树,我们要将它们围住的话,一定是围住它们所形成的凸包。所以我们对于剩下的树组成的图形求一个凸包算出周长即可判断是否满足条件了。\\ 280 281 282 283 284 \leftline{\textbf{时空复杂度}} 285 时间复杂度 $O(2^N*NlogN)$ 286 287 288 空间复杂度 $O(N)$ \\ 289 290 \newpage 291 292 293 294 295 \leftline{\textbf{试题编号}} 296 1999 E\\ 297 298 299 300 \leftline{\textbf{题目名称}} 301 Trade on Verweggistan\\ 302 303 304 305 \leftline{\textbf{题目大意}} 306 有$N$堆物体,每堆的每个物体有一个成本,每个物体可以带来$10$的收益。每次你可以从一堆中选取最上面的几个物体拿走,求最后的最大收益以及能达到这个收益需要拿走多少个物体。\\ 307 308 309 310 \leftline{\textbf{算法讨论}} 311 最简单的背包,用$f[i][j]$表示从前$i$堆物体中拿走了$j$个物体的最大收益,转移直接枚举从当前堆顶拿走多少物体即可。\\ 312 313 314 315 316 \leftline{\textbf{时空复杂度}} 317 时间复杂度 $O(N^2M^2)$ 318 319 320 空间复杂度 $O(NM)$ \\ 321 322 \newpage 323 324 325 326 327 \leftline{\textbf{试题编号}} 328 1999 H\\ 329 330 331 332 \leftline{\textbf{题目名称}} 333 flooded!\\ 334 335 336 337 \leftline{\textbf{题目大意}} 338 有一个地方会降下总量为$v$的雨。先给出每个地方的高度,求最后的水位高度以及有多少地方被水淹没。\\ 339 340 341 342 \leftline{\textbf{算法讨论}} 343 注意到积水一定是从最低的地方开始形成,所以我们首先将所有的高度排序,然后从较低的高度向较高的高度进行扫描。每次扫描到下一个高度时先判断当前剩余雨量是否能够达到下一高度,如果不能直接退出,否则继续向后进行扫描即可。\\ 344 345 346 347 348 \leftline{\textbf{时空复杂度}} 349 时间复杂度 $O(N^2logN^2)$ 350 351 352 空间复杂度 $O(N^2)$ \\ 353 354 \newpage 355 356 357 358 \leftline{\textbf{试题编号}} 359 2000 A\\ 360 361 362 363 \leftline{\textbf{题目名称}} 364 Abbott’s Revenge\\ 365 366 367 368 \leftline{\textbf{题目大意}} 369 给出一张网格图,对于每个点你都有四种可以走到它的方向。对于每种走到它的方向,会限制你能够走出去的方向。现在给出该网格图,求从给定起点到给定终点的最短距离。(一开始会强制你从起点向着某个方向走一步)\\ 370 371 372 373 \leftline{\textbf{算法讨论}} 374 很基础的BFS,只需要注意一开始会被强制向某一个方向走一步处理掉环的情况即可。\\ 375 376 377 378 \leftline{\textbf{时空复杂度}} 379 时间复杂度 $O(NM)$ 380 381 382 空间复杂度 $O(NM)$\\ 383 384 \newpage 385 386 387 388 \leftline{\textbf{试题编号}} 389 2000 B\\ 390 391 392 393 \leftline{\textbf{题目名称}} 394 According to Bartjens\\ 395 396 397 398 \leftline{\textbf{题目大意}} 399 给出一个被去掉符号的算式,要求填上$+$、$-$、$*$三种符号之后使得原式的值为2000。\\ 400 401 402 403 \leftline{\textbf{算法讨论}} 404 直接搜索即可。:D\\ 405 406 407 408 \leftline{\textbf{时空复杂度}} 409 时间复杂度 $O(4^N)$ 410 411 412 空间复杂度 $O(N)$\\ 413 414 \newpage 415 416 417 418 \leftline{\textbf{试题编号}} 419 2000 C\\ 420 421 422 423 \leftline{\textbf{题目名称}} 424 Cutting Chains\\ 425 426 427 428 \leftline{\textbf{题目大意}} 429 有一些环套在了一起,你需要打开某些环然后将它们进行移动后关闭,使得最后所有环形成一条链。问最少需要打开的环的数量。\\ 430 431 432 433 \leftline{\textbf{算法讨论}} 434 我们首先枚举打开哪些环,然后将与之相连的所有环全部分开。由于接下来我们不会再打开任何的新环,所以此时相连接的环都必须组成一条链,如果不是链的话无论怎么组合最后的结果也不可能是链。假设最后总共形成了$x$个联通块,我们打开了$y$个环,那么最后能够形成链的条件是$x<=y*2+1$。(即用一个打开的环去连接两个块)所以我们枚举打开哪些环后,判断是否全部为链以及是否满足该不等式即可解决问题。\\ 435 436 437 438 \leftline{\textbf{时空复杂度}} 439 时间复杂度 $O(2^N*N^2)$ 440 441 442 空间复杂度 $O(N^2)$\\ 443 444 \newpage 445 446 447 448 449 \leftline{\textbf{试题编号}} 450 2000 E\\ 451 452 453 454 \leftline{\textbf{题目名称}} 455 Internet Bandwidth\\ 456 457 458 459 \leftline{\textbf{题目大意}} 460 求一个无向图的最大流。\\ 461 462 463 464 \leftline{\textbf{算法讨论}} 465 直接做网络流即可。:D\\ 466 467 468 469 \leftline{\textbf{时空复杂度}} 470 时间复杂度 $O(N^2*M)$ 471 472 473 474 空间复杂度 $O(N+M)$ \\ 475 476 \newpage 477 478 479 480 \leftline{\textbf{试题编号}} 481 2000 F\\ 482 483 484 485 \leftline{\textbf{题目名称}} 486 Page Hopping\\ 487 488 489 490 \leftline{\textbf{题目大意}} 491 求所有点对之间的平均最短路。\\ 492 493 494 495 \leftline{\textbf{算法讨论}} 496 因为有$N<=100$,所以直接做floyd即可。:D\\ 497 498 499 500 \leftline{\textbf{时空复杂度}} 501 时间复杂度 $O(N^3)$ 502 503 504 505 空间复杂度 $O(N^2)$ \\ 506 507 \newpage 508 509 510 511 \leftline{\textbf{试题编号}} 512 2001 A\\ 513 514 515 516 \leftline{\textbf{题目名称}} 517 Airport Configuration\\ 518 519 520 521 \leftline{\textbf{题目大意}} 522 给出城市与城市之间的人流量以及很多种排布机场的方案。将每种方案的代价排序后输出。(一种方案的代价为所有人需要移动的距离总和)\\ 523 524 525 526 \leftline{\textbf{算法讨论}} 527 直接模拟算出每种方案的代价之后排序输出即可。\\ 528 529 530 531 \leftline{\textbf{时空复杂度}} 532 时间复杂度 $O(KN^2+KlogK)$ 533 534 535 536 空间复杂度 $O(N^2)$ \\ 537 538 \newpage 539 540 541 542 543 \leftline{\textbf{试题编号}} 544 2001 B\\ 545 546 547 548 \leftline{\textbf{题目名称}} 549 Say Cheese\\ 550 551 552 553 \leftline{\textbf{题目大意}} 554 一个无限大的实体空间中有N个球形部分为空(球形部分可能有重叠),你在空的空间里的移动速度为无限大,在实体空间中移动的速度为每秒$1$个单位。问从给定起点移动到给定终点的最短时间。\\ 555 556 557 558 \leftline{\textbf{算法讨论}} 559 给定的起点和终点我们可以将其看做两个半径为0的球体,这样我们就统一了所有的部分。考虑从一个球体球心走到另一个球体球心的最短时间,如果这两个球相交的话那么两个球心只用0的时间就可以到达,否则则是它们圆心的距离减去它们的半径之和(也就是在实体空间内会移动的距离)。做出了所有球之间的距离之后,直接使用最短路的算法算出答案即可。\\ 560 561 562 563 \leftline{\textbf{时空复杂度}} 564 时间复杂度 $O(N^2)$ 565 566 567 568 空间复杂度 $O(N)$ \\ 569 570 \newpage 571 572 573 574 575 \leftline{\textbf{试题编号}} 576 2001 F\\ 577 578 579 580 \leftline{\textbf{题目名称}} 581 A Major Problem\\ 582 583 584 585 \leftline{\textbf{题目大意}} 586 将给出的某个大调音阶的音符转换为另一个大调音阶的对应音符。\\ 587 588 589 590 \leftline{\textbf{算法讨论}} 591 直接模拟即可。\\ 592 593 594 595 \leftline{\textbf{时空复杂度}} 596 时间复杂度 $O(1)$ 597 598 599 600 空间复杂度 $O(1)$ \\ 601 602 \newpage 603 604 605 606 607 \leftline{\textbf{试题编号}} 608 2001 I\\ 609 610 611 612 \leftline{\textbf{题目名称}} 613 A Vexing Problem\\ 614 615 616 617 \leftline{\textbf{题目大意}} 618 给出一张游戏地图,每次可以将一个位置上的方格向左或向右移到一个没有其他物品的位置上。两个相同的方块挨在一起就会消除,问最少消除步数以及方案。数据保证最后的步数不超过11步。\\ 619 620 621 622 \leftline{\textbf{算法讨论}} 623 基本的思路就是搜索,搜索的过程中需要判重,以及加上两个剪枝。第一个剪枝是如果某种颜色只剩一个直接退出,另外一个是如果某种颜色如果剩下两个,那么它们横向的距离是必须靠自己的移动得到的,那么就可以算出一个最小的可能步数。用这两个剪枝即可过这道题了。\\ 624 625 626 627 \leftline{\textbf{时空复杂度}} 628 时间复杂度 $O(11^{nm})$ 629 630 631 632 空间复杂度 $O(nm*11^{nm})$ \\ 633 634 \newpage 635 636 637 638 639 \leftline{\textbf{试题编号}} 640 2002 A\\ 641 642 643 644 \leftline{\textbf{题目名称}} 645 Ballons in a Box\\ 646 647 648 649 \leftline{\textbf{题目大意}} 650 有边界的立体空间中有N个可以放置气球的点。每放置一个气球这个气球就会膨胀至不能再膨胀。问最后剩下的没被气球占据的空间最少是多少。\\ 651 652 653 654 \leftline{\textbf{算法讨论}} 655 直接爆搜。:D\\ 656 657 658 659 \leftline{\textbf{时空复杂度}} 660 时间复杂度 $O(N*N!)$ 661 662 663 664 空间复杂度 $O(N)$ \\ 665 666 \newpage 667 668 669 670 \leftline{\textbf{试题编号}} 671 2002 C\\ 672 673 674 675 \leftline{\textbf{题目名称}} 676 Crossing the Desert\\ 677 678 679 680 \leftline{\textbf{题目大意}} 681 给出一个平面坐标,你需要从起点走到终点。你有一个能携带的物品容量上限,你可以在起点无限购买食物和水或者在其他点得到水或者储存食物。现在问从起点走到终点至少需要多少食物。\\ 682 683 684 685 \leftline{\textbf{算法讨论}} 686 我们用$dist[i]$表示从$i$点走到终点至少还需要购买多少食物。考虑如何转移$dist$。显然我们有$dist[n]=0$,那么考虑从某个点走到这个点有两种情况:1、直接抵达。2、通过食物储存抵达。对于第一种情况,我们可以直接算出代价。对于第二种情况,我们可以算出每单位距离需要的食物储存量,那么通过这个值我们可以得出通过反复的食物储存抵达当前点的代价。有了以上两个信息,我们就可以用最短路来转移我们的$dist$值。\\ 687 688 689 690 \leftline{\textbf{时空复杂度}} 691 时间复杂度 $O(N^2)$ 692 693 694 695 空间复杂度 $O(N)$ \\ 696 697 \newpage 698 699 700 701 \leftline{\textbf{试题编号}} 702 2002 E\\ 703 704 705 706 \leftline{\textbf{题目名称}} 707 Island Hopping\\ 708 709 710 711 \leftline{\textbf{题目大意}} 712 给出平面上N个点,求出最小生成树,每个点的代价为其权值乘以它到1号节点路径上的最大边权。求总价值。\\ 713 714 715 716 \leftline{\textbf{算法讨论}} 717 直接求出最小生成树后从每个点向根节点走一遍看路径上的最大值是多少即可。\\ 718 719 720 721 \leftline{\textbf{时空复杂度}} 722 时间复杂度 $O(N^2)$ 723 724 725 726 空间复杂度 $O(N^2)$ \\ 727 728 \newpage 729 730 731 732 \leftline{\textbf{试题编号}} 733 2002 H\\ 734 735 736 737 \leftline{\textbf{题目名称}} 738 Silly Sort\\ 739 740 741 742 \leftline{\textbf{题目大意}} 743 每次可以交换序列中的两个数,代价是两个数的和。求最小的代价使得序列有序。\\ 744 745 746 747 \leftline{\textbf{算法讨论}} 748 考虑对于每一个置换群,我们有两种操作方式:1、在该置换群内部完成交换操作。2、从置换群外部找一个数辅助完成操作。第一种操作一定是每次用最小的数与其他数完成置换,第二种操作一定是用外部最小的数完成置换。那么对于每个置换群我们都这样检验一次就可以得出答案了。\\ 749 750 751 752 \leftline{\textbf{时空复杂度}} 753 时间复杂度 $O(N^2)$ 754 755 756 757 空间复杂度 $O(N^2)$ \\ 758 759 \newpage 760 761 762 763 \leftline{\textbf{试题编号}} 764 2003 A\\ 765 766 767 768 \leftline{\textbf{题目名称}} 769 Building Bridges\\ 770 771 772 773 \leftline{\textbf{题目大意}} 774 在一张网格图上有一些区域,你需要沿着网格线修建道路,用最短长度的道路连接最多的区域。\\ 775 776 777 778 \leftline{\textbf{算法讨论}} 779 首先我们处理出哪些格子属于哪些区域。那么接下来的问题解决就是我们要如何修建道路。实际上我们如果处理出所有的道路之后就是一个最小生成树的问题了,那么处理出可以修建的道路的方法就只需要从每个交点向四个方向暴力出会遇到哪个区域即可。\\ 780 781 782 783 \leftline{\textbf{时空复杂度}} 784 时间复杂度 $O(N^3)$ 785 786 787 788 空间复杂度 $O(N^2)$ \\ 789 790 \newpage 791 792 793 794 795 796 \leftline{\textbf{试题编号}} 797 2003 B \\ 798 799 800 801 \leftline{\textbf{题目名称}} 802 Light Bulbs\\ 803 804 805 806 \leftline{\textbf{题目大意}} 807 给出$N$盏灯的初始状态和结束状态,每个灯上的开关会改变自己和相邻两个的灯的状态(如果是边界上就只有一个相邻的)。问最少多少次由起始状态改变为终止状态。\\ 808 809 810 811 \leftline{\textbf{算法讨论}} 812 可以发现当我们确定了是否对一个开关操作后我们就可以知道接下来究竟是否对某个开关进行操作。所以我们直接枚举两种情况,算出每一种的答案即可。注意高精度。\\ 813 814 815 816 \leftline{\textbf{时空复杂度}} 817 时间复杂度 $O(N^2)$ 818 819 820 821 空间复杂度 $O(N)$ \\ 822 823 \newpage 824 825 826 827 828 \leftline{\textbf{试题编号}} 829 2003 D \\ 830 831 832 833 \leftline{\textbf{题目名称}} 834 Eurodiffusion\\ 835 836 837 838 \leftline{\textbf{题目大意}} 839 每个城市会将自己的硬币分一些给周边城市,问什么时候所有城市都有所有种类的硬币。\\ 840 841 842 843 \leftline{\textbf{算法讨论}} 844 直接模拟即可。\\ 845 846 847 848 \leftline{\textbf{时空复杂度}} 849 时间复杂度 $O(N^2*T)$ 850 851 852 853 空间复杂度 $O(N^2)$ \\ 854 855 \newpage 856 857 858 859 860 \leftline{\textbf{试题编号}} 861 2003 H \\ 862 863 864 865 \leftline{\textbf{题目名称}} 866 A Spy in the Metro\\ 867 868 869 870 \leftline{\textbf{题目大意}} 871 你需要从起点走到终点且必须使用指定数量的时间。每次你可以换乘反方向的车或者在车站等待,问完成要求所需要的等待时间。\\ 872 873 874 875 \leftline{\textbf{算法讨论}} 876 我们用$dist[i][j]$表示到达$i$号站台且当前用时为$j$所需要的最少的等待时间。那么我们可以用最短路来进行转移,每次转移就只需要考虑等待、向前和向后三种情况即可。\\ 877 878 879 880 \leftline{\textbf{时空复杂度}} 881 时间复杂度 $O(N^4)$ 882 883 884 885 空间复杂度 $O(N^2)$ \\ 886 887 \newpage 888 889 890 891 892 \leftline{\textbf{试题编号}} 893 2003 I \\ 894 895 896 897 \leftline{\textbf{题目名称}} 898 The Solar System\\ 899 900 901 902 \leftline{\textbf{题目大意}} 903 求一个星球在运动一定时间后的坐标。\\ 904 905 906 907 \leftline{\textbf{算法讨论}} 908 根据开普勒第一定律,行星与焦点的连线扫过的面积在单位时间内是相同的。由于我们知道行星的运动时间和运动周期,所以我们是可以算出行星扫过的面积的。我们只考虑此时行星在$x$轴上方的情况(在下方是一致的)。此时随着横坐标的增长,行星与焦点连线扫过的面积也是增长的。所以我们可以二分横坐标的位置,每次对所需要计算的部分的面积进行定积分得到答案即可。需要long double来提高精度。\\ 909 910 911 912 \leftline{\textbf{时空复杂度}} 913 时间复杂度 $O(1)$ 914 915 916 917 空间复杂度 $O(1)$ \\ 918 919 \newpage 920 921 922 923 \leftline{\textbf{试题编号}} 924 2003 J \\ 925 926 927 928 \leftline{\textbf{题目名称}} 929 Toll\\ 930 931 932 933 \leftline{\textbf{题目大意}} 934 给出一张图,某些点是城市而某些点是乡村。走到城市需要缴纳与携带货物成正比的税,而走到乡村需要缴纳定量的税。现在需要运送一些货物,问最少需要缴纳的税费。(税费即货物)\\ 935 936 937 938 \leftline{\textbf{算法讨论}} 939 可以看出如果我们携带某个货物量能够实现成功运输的话,那么更多的货物量也一定能够成功运输。也就是说,能否成功运输与携带货物量是有单调的关系的。所以我们可以二分初始携带的货物量,每次做SPFA判断能否成功运输即可。\\ 940 941 942 943 \leftline{\textbf{时空复杂度}} 944 时间复杂度 $O(N^3logN)$ 945 946 947 948 空间复杂度 $O(N)$ \\ 949 950 \newpage 951 952 953 954 \leftline{\textbf{试题编号}} 955 2004 H\\ 956 957 958 959 \leftline{\textbf{题目名称}} 960 Tree-Lined Streets\\ 961 962 963 964 \leftline{\textbf{题目大意}} 965 给出平面上$N$条线段,你需要在线段上标记尽量多的点。对于同一条线段上被标记的点,它们之间的距离不能小于$50$,它们到该条线段与其他线段的交点的距离不能小于$25$。问最多能标记多少个点。\\ 966 967 968 969 \leftline{\textbf{算法讨论}} 970 两两枚举所有的线段组合,求出它们的所有交点。然后由于线段与线段之间是不影响的,所以我们可以只考虑一条线段的情况。一条线段上的交点会把该条线段分成很多段,中间的段的长度会被裁掉$50$,而两边的线段长度只会被裁掉$25$。算出了实际有用的长度之后,那么对于单独的有用长度为L一条线段的答案就是$\lfloor \frac{L}{50}\rfloor+1$。\\ 971 972 973 974 \leftline{\textbf{时空复杂度}} 975 时间复杂度 $O(N^2)$ 976 977 978 979 空间复杂度 $O(N)$ \\ 980 981 \newpage 982 983 984 985 \leftline{\textbf{试题编号}} 986 2005 A\\ 987 988 989 990 \leftline{\textbf{题目名称}} 991 Eyeball Benders\\ 992 993 994 995 \leftline{\textbf{题目大意}} 996 给出两张图,每张图都是由一些垂直于坐标轴的线段组成的图。现在询问是否能够将第一张图缩小一定倍数(缩小之后要保证最短线段的长度大于等于$0.005$),然后进行平移操作,使得它变为第二张图中的一部分。你需要保证第一张图中的某个线段端点在经过一系列操作后是第二张图中某条线段的端点。数据保证第一张图内部同向的线段不会重叠,不同向的线段至少有一个交点。\\ 997 998 999 1000 \leftline{\textbf{算法讨论}} 1001 考虑该问题,我们首先需要确定缩小的比例和平移的向量。第一点,由于我们需要保证第一张图的一个端点能够映射到第二张图上的某个端点上去,所以我们可以首先枚举第一张图中的某个点映射到第二张图上的哪个点上去。有了这组映射关系我们就可以确定第一张图的平移量(平移和缩小两种操作互不影响)。接下来我们还需要一组映射关系才能确定缩小的比例,注意到数据保证了不同向的线段至少有一个交点,那么我们可以任取一个交点,然后在第二张图中枚举第一张图中的这个交点映射到第二张图中的哪个交点(因为经过变换之后交点依旧是交点),有了这组映射关系我们就可以确定了缩小量。那么确定了平移的向量和缩小的向量后,我们便可以将第一张图经过变换之后的图表示出来。表示出来后,我们就可以确定新图的上下左右边界,有了边界我们就可以将第二张图中属于这一部分的线段抠出来。接下来的判重问题就是一个简单的排序然后扫一遍就能解决的问题了。\\ 1002 1003 1004 1005 \leftline{\textbf{时空复杂度}} 1006 时间复杂度 $O(N^4*\log(N))$ 1007 1008 1009 1010 空间复杂度 $O(N)$\\ 1011 1012 \newpage 1013 1014 1015 1016 1017 1018 \leftline{\textbf{试题编号}} 1019 2005 C\\ 1020 1021 1022 1023 \leftline{\textbf{题目名称}} 1024 The Traveling Judges Problem\\ 1025 1026 1027 1028 \leftline{\textbf{题目大意}} 1029 有$N$个城市和$M$个人,给出$M$个人的初始位置。这$M$个人都需要走到一个固定的终点去,最后的总代价为所有人所经过的路径的并的长度。求使得这个长度最短的方案。\\ 1030 1031 1032 1033 \leftline{\textbf{算法讨论}} 1034 我们用$f[i][j]$表示集合为j的人都到达$i$号城市的最小花费。那么对于一个特定的$i$和$j$,首先我们枚举$j$的子集$k$,那么就有$f[i][j]=min(f[i][k]+f[i][j\otimes k])$。对于特定的j做出了所有的$i$的答案之后,我们可以在同一层内做spfa来做对第一维的转移。这样我们就成功的做出了这个DP。 \\ 1035 1036 1037 1038 \leftline{\textbf{时空复杂度}} 1039 时间复杂度 $O(N*2^M*(3^M+N^3))$ 1040 1041 1042 1043 空间复杂度 $O(N*2^M)$\\ 1044 1045 \newpage 1046 1047 1048 1049 1050 1051 1052 \leftline{\textbf{试题编号}} 1053 2005 E\\ 1054 1055 1056 1057 \leftline{\textbf{题目名称}} 1058 Lots of Sunlight\\ 1059 1060 1061 1062 \leftline{\textbf{题目大意}} 1063 给出$N$幢楼的高度和宽度以及所在位置。询问某些楼房的某些层被阳关照射的时间。\\ 1064 1065 1066 1067 \leftline{\textbf{算法讨论}} 1068 在处理某个询问的答案时,我们只需要知道左边的楼房对它造成的最大影响和右边的楼房对它造成的最大影响就行了(所谓的影响,就是因为这幢楼的存在,会使得其被照射时间的改变量,也就是该幢楼的顶部与询问点所成的角度)。所以我们直接枚举左边和右边的楼房计算影响即可。\\ 1069 1070 1071 1072 \leftline{\textbf{时空复杂度}} 1073 时间复杂度 $O(N^2)$ 1074 1075 1076 1077 空间复杂度 $O(N)$\\ 1078 1079 \newpage 1080 1081 1082 1083 \leftline{\textbf{试题编号}} 1084 2005 H\\ 1085 1086 1087 1088 \leftline{\textbf{题目名称}} 1089 The Great Wall Game\\ 1090 1091 1092 1093 \leftline{\textbf{题目大意}} 1094 $N*N$的棋盘上有$N$个棋子,求最少的步数将这$N$颗棋子移动到一条直线上。\\ 1095 1096 1097 1098 \leftline{\textbf{算法讨论}} 1099 我们考虑实际上可能的情况只有三种:1、竖线。2、横线。3、斜线。对于前两种情况(比如竖线),最后所有的棋子的$y$坐标的值都要相等,所以我们可以直接算出横向的移动量。对于纵向的移动量,显然让$x$尽量小的棋子去$x$更小的地方是更优的,所以我们可以贪心得出答案。对于第三种情况,我们可以把每个棋子和它们所需要到的位置建立一张二分图,边的边权为两点距离(对于前两种情况也可以这么做),做一次费用流即可得出答案。\\ 1100 1101 1102 1103 \leftline{\textbf{时空复杂度}} 1104 时间复杂度 $O(N^2+N^3)$ 1105 1106 1107 1108 空间复杂度 $O(N^2)$\\ 1109 1110 \newpage 1111 1112 1113 1114 1115 \leftline{\textbf{试题编号}} 1116 2005 I\\ 1117 1118 1119 1120 \leftline{\textbf{题目名称}} 1121 Workshops\\ 1122 1123 1124 1125 \leftline{\textbf{题目大意}} 1126 有N个会议在同一时刻开始,每个会议有一定的人数和持续时间。有M个可以开会的地方,每个地方有最多能够容纳的人数和最多能提供的时间。现在问最多能使多少人成功参加会议。\\ 1127 1128 1129 1130 \leftline{\textbf{算法讨论}} 1131 由于我们最后需要使最多的人参加会议,所以我们贪心的从人数最多的会议开始选取。考虑当前会议如果有多个能够满足它的地点,那么我们只需要选取能够满足的当中能够提供的时间最少的即可(因为我们是按人数贪心,当前能满足该会议的场地的在人数上也一定能满足以后的会议)。\\ 1132 1133 1134 1135 \leftline{\textbf{时空复杂度}} 1136 时间复杂度 $O(N^2)$ 1137 1138 1139 1140 空间复杂度 $O(N)$\\ 1141 1142 \newpage 1143 1144 1145 1146 \leftline{\textbf{试题编号}} 1147 2005 J\\ 1148 1149 1150 1151 \leftline{\textbf{题目名称}} 1152 Zones\\ 1153 1154 1155 1156 \leftline{\textbf{题目大意}} 1157 给出N个集合的大小以及其中某些集合交的大小(没有给出的交集的大小都为0)。现在从中选K个集合,问它们并集的大小最大是多少。\\ 1158 1159 1160 1161 \leftline{\textbf{算法讨论}} 1162 直接枚举选哪K个集合,然后用容斥原理算出这些集合的并集大小即可。:D\\ 1163 1164 1165 1166 \leftline{\textbf{时空复杂度}} 1167 时间复杂度 $O(\binom{N}{K}*M)$或者$O(2^N*M)$ 1168 1169 1170 1171 空间复杂度 $O(1)$或者$O(2^N*M)$\\ 1172 1173 \newpage 1174 1175 1176 1177 \leftline{\textbf{试题编号}} 1178 2006 A\\ 1179 1180 1181 1182 \leftline{\textbf{题目名称}} 1183 Low Cost Air Travel\\ 1184 1185 1186 1187 \leftline{\textbf{题目大意}} 1188 给出所有可以乘坐的航班,问实现某条旅行线路的最小代价。\\ 1189 1190 1191 1192 \leftline{\textbf{算法讨论}} 1193 首先用floyd预处理出从某一个航班的某个位置到达另外一个航班的某个位置的代价,在每次询问时再做最短路即可。\\ 1194 1195 1196 1197 \leftline{\textbf{时空复杂度}} 1198 时间复杂度 $O(1000NT^3+10NI*100*NT^2)$ 1199 1200 1201 1202 空间复杂度 $O(10NT^2)$\\ 1203 1204 \newpage 1205 1206 1207 1208 \leftline{\textbf{试题编号}} 1209 2006 E\\ 1210 1211 1212 1213 \leftline{\textbf{题目名称}} 1214 Bit Compressor\\ 1215 1216 1217 1218 \leftline{\textbf{题目大意}} 1219 给出原串有多少个$1$和多少个$0$,以及压缩后的串。压缩的方法为将连续的超过两个的$1$变为它们个数的二进制表示。求原串。\\ 1220 1221 1222 1223 \leftline{\textbf{算法讨论}} 1224 由于总长度不超过$40$,所以直接搜索即可。:D\\ 1225 1226 1227 1228 \leftline{\textbf{时空复杂度}} 1229 时间复杂度 $O(N^2)$ 1230 1231 1232 1233 空间复杂度 $O(N)$\\ 1234 1235 \newpage 1236 1237 1238 1239 \leftline{\textbf{试题编号}} 1240 2006 I\\ 1241 1242 1243 1244 \leftline{\textbf{题目名称}} 1245 Degrees of Separation\\ 1246 1247 1248 1249 \leftline{\textbf{题目大意}} 1250 给出一张图,就两点之间最短路的最大值。\\ 1251 1252 1253 1254 \leftline{\textbf{算法讨论}} 1255 枚举其中一点,每次做最短路求出最大值即可。\\ 1256 1257 1258 1259 \leftline{\textbf{时空复杂度}} 1260 时间复杂度 $O(N^3)$ 1261 1262 1263 1264 空间复杂度 $O(N^2)$\\ 1265 1266 \newpage 1267 1268 1269 1270 1271 \leftline{\textbf{试题编号}} 1272 2006 J\\ 1273 1274 1275 1276 \leftline{\textbf{题目名称}} 1277 Routing\\ 1278 1279 1280 1281 \leftline{\textbf{题目大意}} 1282 从起点走到终点再走回来,问最少需要经过多少个不同的点。\\ 1283 1284 1285 1286 \leftline{\textbf{算法讨论}} 1287 首先我们可以将从起点走到终点再走回来看作是从起点走两条路径到终点,只不过其中一条路径是反图。那么我们可以用$f[i][j]$表示两条路径分别走到了$i$和$j$号点时的最小花费。考虑转移实际上就是枚举从$i$走到某个点或者是从$j$走到某个点。但是由于边权不为$1$,所以我们需要使用spfa但这样会TLE。注意到所有的边权都是小于等于$1$的,所以我们可以使用多个队列bfs降低复杂度。\\ 1288 1289 1290 1291 \leftline{\textbf{时空复杂度}} 1292 时间复杂度 $O(N^3)$ 1293 1294 1295 1296 空间复杂度 $O(N^2)$\\ 1297 1298 \newpage 1299 1300 1301 \leftline{\textbf{试题编号}} 1302 2007 A\\ 1303 1304 1305 1306 \leftline{\textbf{题目名称}} 1307 Consanguine Calculations\\ 1308 1309 1310 1311 \leftline{\textbf{题目大意}} 1312 给出基因与血型的关系表,告诉父亲、母亲、儿子三个人中两个的血型问剩下一个人可能存在的合法血型。\\ 1313 1314 1315 1316 \leftline{\textbf{算法讨论}} 1317 直接暴力搜索即可。:D\\ 1318 1319 1320 1321 \leftline{\textbf{时空复杂度}} 1322 时间复杂度 $O(6^3)$ 1323 1324 1325 1326 空间复杂度 $O(1)$\\ 1327 1328 \newpage 1329 1330 1331 1332 \leftline{\textbf{试题编号}} 1333 2007 I\\ 1334 1335 1336 1337 \leftline{\textbf{题目名称}} 1338 Water Tanks\\ 1339 1340 1341 1342 \leftline{\textbf{题目大意}} 1343 给出一个储水设施,除了第一个出水管剩下的出水管的顶部都是封闭的。连接相邻两个储水设置的管道高度是单调递增的。问注满水后能够存下多少容量的水。\\ 1344 1345 1346 1347 \leftline{\textbf{算法讨论}} 1348 由于连接两个储水设施的管道高度是单调递增的,所以后面的注水过程是与前面的注水过程是无关的,所以我们可以从左至右一个一个储水设施的做。对于每一个储水设施,我们可以将其的注水过程分为三个部分:1、达到前一个管道的高度、2、到达下一个管道的高度。3、注满水。所以我们可以按照这个过程算出每一个部分能不能够到达就能够得到当前储水设施的储水量了。\\ 1349 1350 1351 1352 \leftline{\textbf{时空复杂度}} 1353 时间复杂度 $O(N)$ 1354 1355 1356 1357 空间复杂度 $O(N)$\\ 1358 1359 \newpage 1360 1361 1362 1363 1364 \leftline{\textbf{试题编号}} 1365 2007 J\\ 1366 1367 1368 1369 \leftline{\textbf{题目名称}} 1370 Tunnels\\ 1371 1372 1373 1374 \leftline{\textbf{题目大意}} 1375 给出一张图,你可以在任意时刻删除一些边使得某个人不能到达出口,求最坏情况下需要删除的边的数目的最小值。\\ 1376 1377 1378 1379 \leftline{\textbf{算法讨论}} 1380 首先我们可以做出当那个人在某个点时我们不希望他进行移动所需要删除的边的数目。我们考虑如果一开始那个人选择了一个代价很大的点,那么我们可以通过封住某些路使他移动到并不需要那么多代价的点上去。所以我们可以在这里用最短路来松弛每个点的权值,两个点之间的权值再做一次网络流即可得到。\\ 1381 1382 1383 1384 \leftline{\textbf{时空复杂度}} 1385 时间复杂度 $O(N^3M)$ 1386 1387 1388 1389 空间复杂度 $O(N+M)$\\ 1390 1391 \newpage 1392 1393 1394 1395 \leftline{\textbf{试题编号}} 1396 2008 A\\ 1397 1398 1399 1400 \leftline{\textbf{题目名称}} 1401 Air Conditioning Machinery\\ 1402 1403 1404 1405 \leftline{\textbf{题目大意}} 1406 给出一个立方体和一个特定的形状,你需要用不超过六个特定的形状从起点拼接出一条到终点的路,问最少需要多少个立方体。\\ 1407 1408 1409 1410 \leftline{\textbf{算法讨论}} 1411 直接爆搜。:D\\ 1412 1413 1414 1415 \leftline{\textbf{时空复杂度}} 1416 时间复杂度 $O(8^6)$ 1417 1418 1419 1420 空间复杂度 $O(N^3)$\\ 1421 1422 \newpage 1423 1424 1425 1426 1427 \leftline{\textbf{试题编号}} 1428 2008 B\\ 1429 1430 1431 1432 \leftline{\textbf{题目名称}} 1433 Always an Integer\\ 1434 1435 1436 1437 \leftline{\textbf{题目大意}} 1438 判断一个多项式在$x$的值取不同的正整数时是否恒为整数。\\ 1439 1440 1441 1442 \leftline{\textbf{算法讨论}} 1443 由于最高次项的次数不会超过$100$,所以我们只需要将$x$赋值为连续的$100$个整数带入检验,就一定能够知道该多项式是否恒为整数。\\ 1444 1445 1446 1447 \leftline{\textbf{时空复杂度}} 1448 时间复杂度 $O(N)$ 1449 1450 1451 1452 空间复杂度 $O(N)$\\ 1453 1454 \newpage 1455 1456 1457 1458 \leftline{\textbf{试题编号}} 1459 2008 D\\ 1460 1461 1462 1463 \leftline{\textbf{题目名称}} 1464 The Hare and the Hounds\\ 1465 1466 1467 1468 \leftline{\textbf{题目大意}} 1469 给出一张方位图。定义猎狗和兔子的基本移动方式是走转角最小的路。兔子在某些点会随机选择移动方式,猎狗在这些点会执行检查过程直到检查到兔子走过某个地方。问兔子的猎狗移动的距离以及兔子移动的路径。\\ 1470 1471 1472 1473 \leftline{\textbf{算法讨论}} 1474 直接模拟。:D\\ 1475 1476 1477 1478 \leftline{\textbf{时空复杂度}} 1479 时间复杂度 $O(360N)$ 1480 1481 1482 1483 空间复杂度 $O(360N)$\\ 1484 1485 \newpage 1486 1487 1488 1489 1490 \leftline{\textbf{试题编号}} 1491 2008 E\\ 1492 1493 1494 1495 \leftline{\textbf{题目名称}} 1496 Huffman Codes\\ 1497 1498 1499 1500 \leftline{\textbf{题目大意}} 1501 给出一个经过哈夫曼编码之后的序列,问可以构成该编码序列的原序列有多少种。\\ 1502 1503 1504 1505 \leftline{\textbf{算法讨论}} 1506 首先第一步我们想办法建出哈夫曼树。我们将我们得到的所有编码序列排序,那么此时最小的两个值一定是哈夫曼树上的某个结点的左右儿子。我们不断做这个过程,直到我们找到了哈夫曼树的根。处理出了哈夫曼树之后,我们观察到实际上可用的变量以及变量的最大值都不会很多,所以我们直接暴力搜索出合法的序列即可。\\ 1507 1508 1509 1510 \leftline{\textbf{时空复杂度}} 1511 时间复杂度 $O(100^N)$ 1512 1513 1514 1515 空间复杂度 $O(N)$\\ 1516 1517 \newpage 1518 1519 1520 1521 \leftline{\textbf{试题编号}} 1522 2008 F\\ 1523 1524 1525 1526 \leftline{\textbf{题目名称}} 1527 Glenbow Museum \\ 1528 1529 1530 1531 \leftline{\textbf{题目大意}} 1532 定义一个直角多边形的$90^\circ$角为R,$270^\circ$角为O,那么一个普通的矩形可以表示成为RRRR。现在询问长度为$N$的序列中有多少个不存在连续两个O并且最后是一个合法的直角多边形。\\ 1533 1534 1535 1536 \leftline{\textbf{算法讨论}} 1537 考虑最简单的情况就是$N=4$。对于$N=4$的时候,我们如果希望当中出现O,就只能将某个$90^\circ$换成一个$270^\circ$,也就是将一个R 替换为ROR。所以我们想要在原来的序列上得到一个更长的长度,我们唯一的方法就是将某个R替换为ROR。(所以,长度为奇数或者没有达到$4$的情况都无解)。最后的长度为$N$,也就是说最后的序列当中有$4+\frac{N}{2}$个R。我们假设$x=4+\frac{N}{2}$,那么我们有我们最后的答案$ans=\frac{\binom{x}{4}*\binom{x-1}{4}}{24}$,于是我们可以在$O(1)$的时间内求出答案。\\ 1538 1539 1540 1541 \leftline{\textbf{时空复杂度}} 1542 时间复杂度 $O(1)$ 1543 1544 1545 1546 空间复杂度 $O(1)$\\ 1547 1548 \newpage 1549 1550 1551 1552 1553 \leftline{\textbf{试题编号}} 1554 2008 G\\ 1555 1556 1557 1558 \leftline{\textbf{题目名称}} 1559 Net Loss\\ 1560 1561 1562 1563 \leftline{\textbf{题目大意}} 1564 给出一个多项式,求出一个与其之差的平方的在$[-1,1]$上定积分最小的的分为两段的线性变换函数。\\ 1565 1566 1567 1568 \leftline{\textbf{算法讨论}} 1569 题目给出了分段函数的分段点的横坐标,我们可以发现当分段点的y值确定之后,函数的左边和右边是没有联系的。只考虑左边我们会发现左边这一段的定积分的值是一个关于左端点的$y$值得一个二次函数,具有凸性,所以我们可以三分出当前状况下左边最好的$y$值以及函数值。右边同理。同理我们可以发现整个函数的函数值是关于断点$y$值的一个二次函数,所以确定断点的y值也可以进行三分。用一个三分套三分即可解决问题。\\ 1570 1571 1572 1573 \leftline{\textbf{时空复杂度}} 1574 时间复杂度 $O(50*50*20*20)$ 1575 1576 1577 1578 空间复杂度 $O(1)$\\ 1579 1580 \newpage 1581 1582 1583 1584 \leftline{\textbf{试题编号}} 1585 2008 H\\ 1586 1587 1588 1589 \leftline{\textbf{题目名称}} 1590 Painter \\ 1591 1592 1593 1594 \leftline{\textbf{题目大意}} 1595 给出平面上N个三角形,问是否有三角形相交。如果没有,问被包含次数最多的三角形的被包含次数。\\ 1596 1597 1598 1599 \leftline{\textbf{算法讨论}} 1600 我们首先考虑如何判断三角形是否相交。这个问题的本质其实是问平面上的很多条线段是否相交,我们可以将线段按照x的坐标进行排序然后用平衡树维护扫描线扫描到的东西。一旦两条线段在平衡树内的位置发生交换就说明出现了相交的情况。同理,在处理被包含次数时也可以直接使用扫描线加平衡树维护即可。\\ 1601 1602 1603 1604 \leftline{\textbf{时空复杂度}} 1605 时间复杂度 $O(N\log{N})$ 1606 1607 1608 1609 空间复杂度 $O(N)$\\ 1610 1611 \newpage 1612 1613 1614 1615 1616 \leftline{\textbf{试题编号}} 1617 2008 I\\ 1618 1619 1620 1621 \leftline{\textbf{题目名称}} 1622 Password Suspects\\ 1623 1624 1625 1626 \leftline{\textbf{题目大意}} 1627 问长度为$N$的字符串中有多少个是包含了给出的给定的$M$个串的,在答案小于一定值的时候输出方案。\\ 1628 1629 1630 1631 \leftline{\textbf{算法讨论}} 1632 我们对给出的M个串建立AC自动机,那么我们可以在AC自动机上进行DP。用$f[i][j][k]$表示我们当前的字符串长度为$i$走到了自动机上的$j$号结点且此时已经出现了的字符串的集合为$k$的方案数。那么转移就直接从每种状态枚举下一位填什么字母即可。对于输出方案,暴力搜索即可。\\ 1633 1634 1635 1636 \leftline{\textbf{时空复杂度}} 1637 时间复杂度 $O(N*M^2*2^M*26p)$ 1638 1639 1640 1641 空间复杂度 $O(N*M^2*2^M)$\\ 1642 1643 \newpage 1644 1645 1646 1647 1648 1649 \leftline{\textbf{试题编号}} 1650 2008 J\\ 1651 1652 1653 1654 \leftline{\textbf{题目名称}} 1655 The Sky is the Limit \\ 1656 1657 1658 1659 \leftline{\textbf{题目大意}} 1660 给定底边都在x轴上的多个等腰三角形,现在问所有三角形的并的周长是多少(并之后询问周长时不计算底边长度)。\\ 1661 1662 1663 1664 \leftline{\textbf{算法讨论}} 1665 由于三角形的两条腰边都是线段,都是属于线性的变换。所以我们需要计算的答案可以拆分为一条一条的线段,而可能出现拐点的地方就只有在原来各条线段对应的交点处。在相邻的交点与交点之间,一定是由一条线段组成的答案。所以我们可以预处理出所有交点的位置然后将其排序,算出每个交点处函数所对应的值,然后在通过相邻两个交点的函数值算出这一段的答案即可。\\ 1666 1667 1668 1669 \leftline{\textbf{时空复杂度}} 1670 时间复杂度 $O(N^3)$ 1671 1672 1673 1674 空间复杂度 $O(N)$\\ 1675 1676 \newpage 1677 1678 1679 1680 1681 \leftline{\textbf{试题编号}} 1682 2009 A\\ 1683 1684 1685 1686 \leftline{\textbf{题目名称}} 1687 A Careful Approach \\ 1688 1689 1690 1691 \leftline{\textbf{题目大意}} 1692 给出N架飞机的可降落时间,问可能的最长的两架飞机的降落时间差。\\ 1693 1694 1695 1696 \leftline{\textbf{算法讨论}} 1697 首先可以很容易的看出如果某个降落时间差是可行的,那么更短的时间差也一定是可行的。所以我们可以二分答案。又由于$N<=8$,所以我们每次可以暴力搜索出所有可能的降落顺序然后从左至右贪心放置即可。\\ 1698 1699 1700 1701 \leftline{\textbf{时空复杂度}} 1702 时间复杂度 $O(N*N!)$ 1703 1704 1705 1706 空间复杂度 $O(N)$\\ 1707 1708 \newpage 1709 1710 1711 1712 1713 \leftline{\textbf{试题编号}} 1714 2009 G\\ 1715 1716 1717 1718 \leftline{\textbf{题目名称}} 1719 House of Cards \\ 1720 1721 1722 \leftline{\textbf{题目大意}} 1723 给出$N$张牌,每张牌有花色和点数。将最开始的八张牌摆在桌上与桌面形成四个三角形。以后每次两人轮流放牌,可以执行的操作有:1、屯牌。(至多一张)。2、将一张卡片横放形成一个倒三角。3、将两张卡片竖放形成一个竖三角。每个三角形的权值是三张牌的点数总和,权值会加给三张牌中花色较多的一边。最后剩下的牌的点数会加入对应的人的分数中。现在双方都采取最优策略,问两方的分差。\\ 1724 1725 1726 \leftline{\textbf{算法讨论}} 1727 很容易看出该问题是个搜索问题,但直接的爆搜的复杂度是不能接受的。由于该问题是一个双方较量的问题,所以我们可以直接使用alpha-beta剪枝。使用了alpha-beta剪枝之后会被搜索的状态就大大减少了,可以顺利通过该题。\\ 1728 1729 1730 1731 \leftline{\textbf{时空复杂度}} 1732 时间复杂度 $O(N!)$ 1733 1734 1735 1736 空间复杂度 $O(N)$\\ 1737 1738 \newpage 1739 1740 1741 1742 1743 \leftline{\textbf{试题编号}} 1744 2009 I\\ 1745 1746 1747 1748 \leftline{\textbf{题目名称}} 1749 Struts and Springs \\ 1750 1751 1752 1753 \leftline{\textbf{题目大意}} 1754 有N个矩形,每个矩形由六个弹簧或者支杆固定。每个矩形周围的四个固定轴一定都连到另外一个矩形的四条边上。现在不断改变最外层矩形的大小,求内部每个矩形的大小。\\ 1755 1756 1757 \leftline{\textbf{算法讨论}} 1758 $N$只有$500$,暴力做出所有矩形的嵌套情况以后每次暴力修改每个矩形即可。\\ 1759 1760 1761 1762 \leftline{\textbf{时空复杂度}} 1763 时间复杂度 $O(N^2)$ 1764 1765 1766 1767 空间复杂度 $O(N)$\\ 1768 1769 \newpage 1770 1771 1772 1773 1774 \leftline{\textbf{试题编号}} 1775 2009 J\\ 1776 1777 1778 1779 \leftline{\textbf{题目名称}} 1780 The Ministers' Major Mess \\ 1781 1782 1783 1784 \leftline{\textbf{题目大意}} 1785 每个人会对不超过$4$个议案进行投票,要求最后对于每个人投票的议案的结果有超过一半是与投票人的看法是一致的。问是否可行,以及每个议案是必须通过或者否定或者两者皆可。\\ 1786 1787 1788 1789 \leftline{\textbf{算法讨论}} 1790 由于每个人投票的议案不会超过四个,我们设为$k$。那么对于$k\leq 2$的人,他投票的所有议案都必须符合他的要求;对于$k>2$的人,至多只会有一个不满足他要求的议案。并且每个议案有且仅有通过与否定两种矛盾的状态,那么这就可以看做是一个基本的2-SAT模型。对于$k\leq 2$的人会确定某些必须被选取的点。对于$k>2$的人,可以根据只要有一个议案不满足要求那么剩下的议案都必须满足要求来建立矛盾关系。建出了2-SAT模型后,再检验一遍即可了。\\ 1791 1792 1793 1794 \leftline{\textbf{时空复杂度}} 1795 时间复杂度 $O(N^2)$ 1796 1797 1798 1799 空间复杂度 $O(N)$\\ 1800 1801 \newpage 1802 1803 1804 \leftline{\textbf{试题编号}} 1805 2010 B\\ 1806 1807 1808 1809 \leftline{\textbf{题目名称}} 1810 Barcodes\\ 1811 1812 1813 1814 \leftline{\textbf{题目大意}} 1815 定义条形码为由一些区域从左至右排列而成的图案。区域之间的颜色深浅交替(该条件无用),并且每个区域有一个宽度。可能的宽度总共有两种,较宽的那种的宽度是窄的宽度的两倍。条形码中相邻的五个区域可以被解码为一个字符,对应的解码方法在原题的表格中给出。每两个相邻字符所表示出来的10个区域之间会用一个窄的区域进行分割。一个字符串在被编码为条形码时,会在该字符串尾部添加两个检验字符(检验字符的计算方式题目给出),在添加完检验字符后会在字符串头部和尾部加入开始和结束标记后再按编码规则编码为条形码。现给出条形码每个区域的宽度,询问该条形码是否合法。给出不合法的信息或者编码前的字符串。在读入宽度时你所得到的数据会与原数据有不超过$5\%$的误差。输入的宽度序列有可能是逆序的。\\ 1816 1817 1818 1819 \leftline{\textbf{算法讨论}} 1820 根据题目当中给出的字符的编码方式我们可以发现,无论我们读入的顺序是顺序的还是逆序的,如果该序列是一个合法的序列,那么第一个区域的宽度一定是窄区域的宽度。那么我们可以直接将第一个区域设置为窄区域。即使第一块区域的宽度因误差导致其数值是真实宽度的$95\%$,那么最宽的窄的宽度也不会超过该宽度的$21/19$倍。所以我们可以将大于该临界值的全部设为较宽的区域,将剩下的全部设为较窄的区域。经过这样的处理之后我们就成功的消去了误差,剩下的问题就是简单的模拟了。 1821 1822 1823 另外该题有很多细节,在这里罗列一下: 1824 1825 1826 1、某种宽度的误差超过了$5\%$。 1827 1828 1829 2、起始结尾不为开始结束标记。 1830 1831 1832 3、中间部分出现了开始结束标记。 1833 1834 1835 4、较宽部分的宽度不为较窄部分宽度的两倍。 1836 1837 1838 5、两个检验字符的值不正确。 1839 1840 1841 6、序列有可能是逆序的。 1842 1843 1844 注意到了这些细节,加之前面部分的误差处理后,就能够成功的解决这道题了。\\ 1845 1846 1847 1848 1849 1850 \leftline{\textbf{时空复杂度}} 1851 时间复杂度 $O(N)$ 1852 1853 1854 1855 空间复杂度 $O(N)$\\ 1856 1857 \newpage 1858 1859 1860 1861 1862 1863 \leftline{\textbf{试题编号}} 1864 2010 D\\ 1865 1866 1867 1868 \leftline{\textbf{题目名称}} 1869 Castles\\ 1870 1871 1872 1873 \leftline{\textbf{题目大意}} 1874 攻占编号为i的城市至少需要Ai名士兵,会牺牲Bi名士兵,需要派Ci名士兵留守。总共有N座城市,它们之间形成一棵树。你可以随意选取你第一个攻占的城市。在整个攻占行动中,每条边至多被经过两次,每次只能从已经攻占的城市去攻占未被攻占的城市。问最少需要的士兵总数。\\ 1875 1876 1877 1878 \leftline{\textbf{算法讨论}} 1879 枚举我们第一个攻占哪个城市,那么接下来需要解决的是以这个点为根最少需要多少士兵才能攻占完所有的城市。考虑在处理以i为根的子树时的答案,假设j和k都是i的儿子,并且我们已经处理出了攻占以j和k为根的子树最少需要的士兵数need和攻占完成后会减少的士兵数delta。考虑如果只有j和k两个儿子的话,我们需要决定的是先攻占哪一棵子树。先攻占j的代价为max(need[j],delta[j]+use[k]),先攻占k的代价为max(need[k],delta[k]+use[j]),我们只需要比较这两个值即可确定攻占顺序。当有多个儿子时,我们只需要以这个作为关键字排序即可确定这些子树的攻占顺序。接下来我们只需要扫一遍即可做出当前子树的答案。\\ 1880 1881 1882 1883 1884 \leftline{\textbf{时空复杂度}} 1885 时间复杂度 $O(N^2*\log{N})$ 1886 1887 1888 1889 空间复杂度 $O(N)$\\ 1890 1891 1892 \newpage 1893 1894 1895 1896 1897 \leftline{\textbf{试题编号}} 1898 2010 F\\ 1899 1900 1901 1902 \leftline{\textbf{题目名称}} 1903 Contour Mapping\\ 1904 1905 1906 1907 \leftline{\textbf{题目大意}} 1908 给出一个由三角形拼成的六边形网格图,每个结点有个高度。相同高度的地方形成等高线。现在询问所有等高线高度为H的倍数的等高线长度。\\ 1909 1910 1911 1912 \leftline{\textbf{算法讨论}} 1913 考虑三角形与三角形之间是没有影响的,所以我们可以单独算出每个三角形中等高线的数值。在同一个三角形中,每条等高线的长度形成一个等差数列,所以我们可以求出最长的等高线长度和最短的等高线长度以及等高线数量(计算等高线长度可使用正弦定理),那么我们就可以出该三角形内部的等高线长度和。接下来需要处理的是多个相同高度的点导致等高线的计算重复,这一步可以使用bfs处理出等高线边缘或者扫一遍判一条边是否在该区域内部即可。\\ 1914 1915 1916 1917 1918 \leftline{\textbf{时空复杂度}} 1919 时间复杂度 $O(N^2)$ 1920 1921 1922 1923 空间复杂度 $O(N^2)$\\ 1924 1925 1926 \newpage 1927 1928 1929 1930 1931 1932 \leftline{\textbf{试题编号}} 1933 2010 G\\ 1934 1935 1936 1937 \leftline{\textbf{题目名称}} 1938 The Islands\\ 1939 1940 1941 1942 \leftline{\textbf{题目大意}} 1943 找出一条从出发点一直往东到达终点后在一直往西回到起点且每个城市只经过一次并且某两个特殊城市是出于两段不同的旅行中且总路程最小的旅行路线。\\ 1944 1945 1946 1947 \leftline{\textbf{算法讨论}} 1948 一次向西一次向东,实际上可以看做是两次向东且旅行路程中没有相同的点(起点终点除外)的两条路径。我们设$f[i][j]$表示第一条线路走到了$i$点第二条线路走到了$j$点的最小代价。由于我们需要经过所有的点,那么此时$1-max(i,j)$的所有点都应该已经被经过了。那么下一个需要走的点是$max(i,j)+1$。那么如果这个点不是两个特殊点中的一个的话,那么我们可以直接枚举是第一条线路走过来还是第二条线路走过来,否则去除其中之一的转移即可。(强制使第一个特殊点在第一条线路中,第二个特殊点在第二条线路中)\\ 1949 1950 1951 1952 1953 \leftline{\textbf{时空复杂度}} 1954 时间复杂度 $O(N^2)$ 1955 1956 1957 1958 空间复杂度 $O(N^2)$\\ 1959 1960 1961 \newpage 1962 1963 1964 1965 \leftline{\textbf{试题编号}} 1966 2010 I\\ 1967 1968 1969 1970 \leftline{\textbf{题目名称}} 1971 Robots on Ice\\ 1972 1973 1974 1975 \leftline{\textbf{题目大意}} 1976 给出一张方格图,其中有四个点是必须在指定时间到达的。问遍历整张图的方案数。(每个点只经过一次)\\ 1977 1978 1979 1980 \leftline{\textbf{算法讨论}} 1981 数据范围不是很大,但是直接的暴力搜索是过不了的,需要剪枝优化。最基础的剪枝即为提前到达了某个指定点或者到达了指定时间却不在指定点上。我们实际上还可以判断当前点到下一个指定点的这段路是否能在余下的时间内完成,如果不能这也显然是一种不合法的方案。由于每个点只能经过一次,所以一旦某个时刻我们将图分为了两个部分且两个部分内都还有没到达过的点,那么接下来我们无论如何也不可能完成对图的遍历了。有了以上的剪枝之后就可以顺利通过该题了。\\ 1982 1983 1984 1985 1986 \leftline{\textbf{时空复杂度}} 1987 时间复杂度 $O(4^{NM})$ 1988 1989 1990 1991 空间复杂度 $O(NM)$\\ 1992 1993 1994 \newpage 1995 1996 1997 1998 1999 2000 2001 2002 \leftline{\textbf{试题编号}} 2003 2010 J\\ 2004 2005 2006 2007 \leftline{\textbf{题目名称}} 2008 Sharing Chocolate\\ 2009 2010 2011 2012 \leftline{\textbf{题目大意}} 2013 给出一块长$x$宽$y$的巧克力,你需要把它分成$N$部分,每次分割只能沿着某块巧克力的某条竖线或者横线切开(都是整数位置)。现给出$N$个部分的大小,问能否成功分割。\\ 2014 2015 2016 2017 \leftline{\textbf{算法讨论}} 2018 用$f[i][j]$表示当剩下的巧克力的某一个长度为i能否成功分割成集合$j$。由于集合$j$的$size$是确定的,所以我们当前巧克力的另外一个长度一定为$\frac{size[j]}{i}$。确定了两条边的长度后,我们枚举$j$的子集,把剩下需要形成的部分分为两部分,然后再考虑是竖着进行分割还是横着进行分割(两种分割所需要的巧克力的长宽都可以直接计算)进行记忆化搜索即可。\\ 2019 2020 2021 2022 2023 \leftline{\textbf{时空复杂度}} 2024 时间复杂度 $O(X*(2^N+3^N))$ 2025 2026 2027 2028 空间复杂度 $O(X*2^N)$\\ 2029 2030 2031 \newpage 2032 2033 2034 2035 2036 \leftline{\textbf{试题编号}} 2037 2010 K\\ 2038 2039 2040 2041 \leftline{\textbf{题目名称}} 2042 Paperweight\\ 2043 2044 2045 2046 \leftline{\textbf{题目大意}} 2047 给出一个由两个四棱锥拼接而成的立体图形,定义这个图形是稳定的当且仅当我们选定这个图形的底面之后将重心向任意方向移动之后不超过$0.2$个单位距离后该图形都不会移动。问所有能使该图形稳定的方案中某个特定点到底面距离的最大值。\\ 2048 2049 2050 2051 \leftline{\textbf{算法讨论}} 2052 由于总共的点数和面数都是常数,所以我们直接枚举我们所选取的底面。选取了底面之后,原问题转化为:将重心投影到当前底面后,投影出来的点向任意方向移动不超过$0.2$个单位距离都不会移到底面以外的地方去。首先第一步,我们考虑如何求出一个点在一个平面上的投影。我们可以做出该平面的法向量,然后算出该点到平面的距离。然后将该点沿着法向量移动那么长的距离就能求出该点在平面上的投影坐标了。第二步我们想办法检验是否合法。注意到检验的内容又可以等价为投影出来的点到底面的每条边的距离都不小于$0.2$ 个单位距离,于是我们依次求出点到每条边的距离进行判断即可。(如果四点共面就转化为四边形处理)\\ 2053 2054 2055 2056 2057 \leftline{\textbf{时空复杂度}} 2058 时间复杂度 $O(1)$ 2059 2060 2061 2062 空间复杂度 $O(1)$\\ 2063 2064 2065 \newpage 2066 2067 2068 2069 \leftline{\textbf{试题编号}} 2070 2011 A\\ 2071 2072 2073 2074 \leftline{\textbf{题目名称}} 2075 To Add or to Multiply\\ 2076 2077 2078 2079 \leftline{\textbf{题目大意}} 2080 给出一个在$[p,q]$之间的数,你可以每次把它加上$a$或者乘以$m$。现在你需要给出一个最短且字典序最小的操作序列,使得无论给出的是$[p,q]$之间的哪个数,经过操作之后的数都是在$[r,s]$之间的。\\ 2081 2082 2083 2084 \leftline{\textbf{算法讨论}} 2085 首先考虑即使是极限情况能够乘以m的次数也不会很多($m=1$时特殊处理),所以我们可以枚举究竟乘了多少次。假设我们当前乘了$k$ 次,在不考虑最少次数的情况下,我们通过合法的操作序列能够将$p$变成的最小的数应该是$m^k+xa>=p$。这个值可以直接通过模的数直接算出来。考虑当前$x$在$m$进制下的表示,某一位上是$y$的话就代表在某次乘法前连加了$y$次。(这样一定是最小的)考虑我们修改操作序列使得我们的操作序列长度变小并且仍然合法。我们每次修改可以在$x$对应的$m$进制数的某一位上加$1$,但这样会使得答案变大。答案变小的情况只会发生在某一位加上$1$之后出现了进位的情况。所以我们可以直接枚举将哪一位加进位,并且检验当前操作序列是否合法。这样我们就可以只用做$x$在$m$进制下的位数多次的检验即可。\\ 2086 2087 2088 2089 2090 \leftline{\textbf{时空复杂度}} 2091 时间复杂度 $O(log^2{p})$ 2092 2093 2094 2095 空间复杂度 $O(log{p})$\\ 2096 2097 2098 \newpage 2099 2100 2101 2102 \leftline{\textbf{试题编号}} 2103 2011 E\\ 2104 2105 2106 2107 \leftline{\textbf{题目名称}} 2108 Coffee Central\\ 2109 2110 2111 2112 \leftline{\textbf{题目大意}} 2113 给出一张方格图,某些位置有咖啡馆。现在每次给出一个询问距离,问从某个位置最多走这么多距离能够到达的咖啡馆的数目最多是多少个。\\ 2114 2115 2116 2117 \leftline{\textbf{算法讨论}} 2118 考虑到每次询问对于一个固定的距离,在原图上从某个点能够走到的图形是一个锯齿形的形状不好处理,所以我们将原图以$(1,1)$为中旋转$45$度。这样处理之后我们可以发现现在对于一个点询问一个固定距离能够走到的咖啡馆的数目,就是在询问一个矩形内部有多少个咖啡馆。这个可以用前缀和问题解决。至于如何得到旋转后的点的坐标,我们只需要把原坐标$(x,y)$变化为$(x+y-1,max(n,m)+y-x)$即可。\\ 2119 2120 2121 2122 2123 \leftline{\textbf{时空复杂度}} 2124 时间复杂度 $O(QN^2)$ 2125 2126 2127 2128 空间复杂度 $O(N^2)$\\ 2129 2130 2131 \newpage 2132 2133 2134 2135 \leftline{\textbf{试题编号}} 2136 2011 H\\ 2137 2138 2139 2140 \leftline{\textbf{题目名称}} 2141 Mining Your Own Business\\ 2142 2143 2144 2145 \leftline{\textbf{题目大意}} 2146 给出一张图,求至少要修几个逃生点才能使得任一个点被删除之后剩下的点仍能够到达某一个逃生点并求方案数。\\ 2147 2148 2149 2150 \leftline{\textbf{算法讨论}} 2151 很容易看出这个问题是跟点双联通分量有关的,所以我们将所有点双联通分量缩点得到了一棵树。由于只会删除一个点,所以这棵树上任何度数不为$1$的点都是不用修建逃生点的,只需要在度数为$1$的点中的任意一个非割点上修建一个逃生点即可。所以处理出点双联通分量后扫一遍即可得到答案。\\ 2152 2153 2154 2155 2156 \leftline{\textbf{时空复杂度}} 2157 时间复杂度 $O(N)$ 2158 2159 2160 2161 空间复杂度 $O(N)$\\ 2162 2163 2164 \newpage 2165 2166 2167 2168 2169 2170 \leftline{\textbf{试题编号}} 2171 2011 I\\ 2172 2173 2174 2175 \leftline{\textbf{题目名称}} 2176 Mummy Madness\\ 2177 2178 2179 2180 \leftline{\textbf{题目大意}} 2181 一个无限大的直角坐标系中你位于$(0,0)$。有$N$个木乃伊站在其他某些位置。你们都可以在一个单位的时间内移动到周围$8$个格子中去或者停留在原地。你希望木乃伊在尽量长的时间之后和你相遇,问这个最长的时间。\\ 2182 2183 2184 2185 \leftline{\textbf{算法讨论}} 2186 很显然答案具有单调性,所以首先二分答案。考虑如何检验一个答案$m$是否可行。这个问题等价于一个$2m*2m$的矩形是否完全被另外$N$个$2m*2m$的矩形完全覆盖。我们的矩形总共四个方向,我们考虑其中的一个方向。如果$N$个矩形中的某一个矩形的右下角在第一个矩形之中,那么在第一个矩形之中这个点的左上方一定都被覆盖了(因为所有的矩形的大小是一样的)。那么考虑所有矩形右下角对矩形的覆盖影响就会在该矩形上部形成随着$x$的增长$y$也增长的一个轮廓线。于是我们可以使用单调栈维护出这个形状。对于另外的方向也是一样的作法。最后再判断各个轮廓线是否完全覆盖矩形即可。\\ 2187 2188 2189 2190 2191 \leftline{\textbf{时空复杂度}} 2192 时间复杂度 $O(N\log{N})$ 2193 2194 2195 2196 空间复杂度 $O(N)$\\ 2197 2198 2199 \newpage 2200 2201 2202 2203 2204 \leftline{\textbf{试题编号}} 2205 2011 J\\ 2206 2207 2208 2209 \leftline{\textbf{题目名称}} 2210 Pyramids\\ 2211 2212 2213 2214 \leftline{\textbf{题目大意}} 2215 有两种搭建金字塔的方式:将上一层的边长变为比下一层少$1$或$2$。现在给出总共的石块数,要求给出一种用上全部石块搭建尽量少且大的金字塔尽量大的方案。\\ 2216 2217 2218 2219 \leftline{\textbf{算法讨论}} 2220 我们发现实际金字塔的大小在整数域内的覆盖范围很广阔,所以对于任意一个正整数都可以用很少的金字塔将其搭建出来,所以可以直接爆搜。(实际上这个答案是不会超过7的)\\ 2221 2222 2223 2224 2225 \leftline{\textbf{时空复杂度}} 2226 时间复杂度 $O(N^7)$ 2227 2228 2229 2230 空间复杂度 $O(N)$\\ 2231 2232 2233 \newpage 2234 2235 2236 2237 \leftline{\textbf{试题编号}} 2238 2012 B\\ 2239 2240 2241 2242 \leftline{\textbf{题目名称}} 2243 Curvy Little Bottles\\ 2244 2245 2246 2247 \leftline{\textbf{题目大意}} 2248 给出一个函数,求它在某段上的平方值的和以及将其按照某个值分段之后每一段的坐标值。\\ 2249 2250 2251 2252 \leftline{\textbf{算法讨论}} 2253 对于第一问,我们直接将原函数平方之后求出它在该段上的定积分即可。对于第二问,我们可以每次二分下一个分段点的坐标值,然后再用定积分判断即可。\\ 2254 2255 2256 2257 2258 \leftline{\textbf{时空复杂度}} 2259 时间复杂度 $O(N^2)$ 2260 2261 2262 2263 空间复杂度 $O(N)$\\ 2264 2265 2266 \newpage 2267 2268 2269 2270 2271 2272 \leftline{\textbf{试题编号}} 2273 2012 C\\ 2274 2275 2276 2277 \leftline{\textbf{题目名称}} 2278 Bus Tour\\ 2279 2280 2281 2282 \leftline{\textbf{题目大意}} 2283 有$N$个城市。你需要定义一个旅行序列,你会按照序列上的序列去遍历完这$N$个城市,要求从$0$号城市出发,在$N-1$号城市结束。在从$N-1$号城市返回$0$号城市时需要重新定义一个旅行序列。假设$H=\lfloor\dfrac{N-2}{2}\rfloor$,要求在一个旅行序列中前$H$ 个城市编号所形成的的集合与第二个旅行序列后$H$个城市编号所形成的的集合相等。求所有合法的旅行序列中旅行距离最短的长度。\\ 2284 2285 2286 2287 \leftline{\textbf{算法讨论}} 2288 我们用$f[i][j]$表示从$0$号城市出发走完集合为$i$的城市最后达到$j$城市的最短距离,用$g[i][j]$表示从$N-1$号城市出发走完集合为$i$的城市最后到达$j$城市的最短距离。这两个值都可以在$O(2^N*N^2)$的复杂度内解决。然后考虑答案,我们考虑首先我们枚举前$H$个城市所形成的集合$S$,然后考虑第一段旅行,由于都是无向边,所以我们可以直接枚举在第一段旅行中前$H$个城市和剩下的城市进行交界的时候是哪两个城市。同理也可以处理出第二段旅行序列的答案。这样的总复杂度就是$O(2^N*N^2)$。\\ 2289 2290 2291 2292 2293 \leftline{\textbf{时空复杂度}} 2294 时间复杂度 $O(2^N*N^2)$ 2295 2296 2297 2298 空间复杂度 $O(2^N*N^2)$\\ 2299 2300 2301 \newpage 2302 2303 2304 2305 2306 \leftline{\textbf{试题编号}} 2307 2012 D\\ 2308 2309 2310 2311 \leftline{\textbf{题目名称}} 2312 Fibonacci Words\\ 2313 2314 2315 2316 \leftline{\textbf{题目大意}} 2317 定义01斐波那契串,询问某个串在某个斐波那契串中出现了多少次。\\ 2318 2319 2320 2321 \leftline{\textbf{算法讨论}} 2322 考虑一个斐波那契串对答案的贡献。它是由前两个串拼接而成,那么除了本来就在原来两个串中已存在的答案,新的答案只会在拼接的两部分中出现。由于询问的字符串不会很长,所以我们可以暴力处理出每一个斐波那契串前面以及后面部分的字符串,然后每次拼接时用KMP做出答案即可。\\ 2323 2324 2325 2326 2327 \leftline{\textbf{时空复杂度}} 2328 时间复杂度 $O(NL)$ 2329 2330 2331 2332 空间复杂度 $O(L)$\\ 2333 2334 2335 \newpage 2336 2337 2338 2339 2340 2341 2342 \leftline{\textbf{试题编号}} 2343 2012 E\\ 2344 2345 2346 2347 \leftline{\textbf{题目名称}} 2348 infiltration\\ 2349 2350 2351 2352 \leftline{\textbf{题目大意}} 2353 $N$个城市,一个城市被选择之后从它只经过一条边能被到达的城市和它自己都会被标记上。如果从城市$i$到城市$j$没有边,那么从城市$j$到城市$i$一定有一条边。现在问最少需要选择多少个城市才能使所有城市都被标记上。\\ 2354 2355 2356 2357 \leftline{\textbf{算法讨论}} 2358 由题意可以看出给出的图十分稠密,所以最后的答案一定不会很大,所以直接迭代加深搜索答案即可。(实际上,通过搜索之后发现,在题目给定的数据范围内,最多只用不超过六个点就可以解决问题)\\ 2359 2360 2361 2362 2363 \leftline{\textbf{时空复杂度}} 2364 时间复杂度 $O($迭代加深层数$)$ 2365 2366 2367 2368 空间复杂度 $O(N^2)$\\ 2369 2370 2371 \newpage 2372 2373 2374 2375 2376 2377 \leftline{\textbf{试题编号}} 2378 2012 K\\ 2379 2380 2381 2382 \leftline{\textbf{题目名称}} 2383 Stacking Plates\\ 2384 2385 2386 2387 \leftline{\textbf{题目大意}} 2388 有$N$堆圆盘,每次可以将一堆圆盘分成两部分或者合并两堆圆盘,大圆盘必须放在小圆盘下面。问最少的操作次数使得只剩一堆圆盘。\\ 2389 2390 2391 2392 \leftline{\textbf{算法讨论}} 2393 实际上我们每次将圆盘分割出去之后都一定会马上拿回来,并且我们一定是先将所有较小的圆盘处理掉之后才会处理更大的圆盘,所以我们可以按照圆盘大小进行DP。我们用$f[i][j]$表示已经将大小小于等于$i$的圆盘全部合并并且它们的位置在$j$堆中的最小代价。那么我们考虑转移的话就是枚举下一个大小的圆盘放在哪一堆之中,每次由上次推算出代价即可。\\ 2394 2395 2396 2397 2398 \leftline{\textbf{时空复杂度}} 2399 时间复杂度 $O(N^4)$ 2400 2401 2402 2403 空间复杂度 $O(N^3)$\\ 2404 2405 2406 \newpage 2407 2408 2409 2410 2411 2412 \leftline{\textbf{试题编号}} 2413 2012 L\\ 2414 2415 2416 2417 \leftline{\textbf{题目名称}} 2418 Takeover Wars\\ 2419 2420 2421 2422 \leftline{\textbf{题目大意}} 2423 有两个公司有很多子公司,它们每次可以用一个较大权值的子公司消灭对手的一个公司,或者合并自己的两个子公司。问先手是否必胜。\\ 2424 2425 2426 2427 \leftline{\textbf{算法讨论}} 2428 很容易观察出我们最优的策略一定是当前如果自己最大的子公司能够消灭掉对方最大的子公司就消灭否则继续合并。那么只需要将两边的子公司进行排序之后贪心即可。\\ 2429 2430 2431 2432 2433 \leftline{\textbf{时空复杂度}} 2434 时间复杂度 $O(NlogN)$ 2435 2436 2437 2438 空间复杂度 $O(N)$\\ 2439 2440 2441 \newpage 2442 2443 2444 2445 2446 2447 2448 2449 \leftline{\textbf{试题编号}} 2450 2013 A\\ 2451 2452 2453 2454 \leftline{\textbf{题目名称}} 2455 Self-Assembly\\ 2456 2457 2458 2459 \leftline{\textbf{题目大意}} 2460 有一些正方形,正方形的每条边上都有两个字符,可能是A+、A-、B+、B-、……、Z+、Z-、$00$这53种中的一种。两个正方形能够被拼接在一起的条件是它们两个用于拼接的两条边是像A+和A-这样能配对字符对。($00$和$00$不能配对)现在给你N种正方形,每种正方形的个数都是无限个,问用这些正方形是否能够实现无限拼接。\\ 2461 2462 2463 2464 \leftline{\textbf{算法讨论}} 2465 如果我们将能够拼接的正方形之间连上边的话,那么问题转换为了一个图里面是否存在环。但是这个算法的复杂度是$O(N^2)$的,不能接受。注意到实际上有用的边的种类只有52种,如果我们将某种边通过拼接后可以转移到的边的种类建立起边的关系。那么,我们问题的本质任然是判断一张图种是否存在环,但是点数已经降至可以接受的范围了。\\ 2466 2467 2468 2469 2470 \leftline{\textbf{时空复杂度}} 2471 时间复杂度 $O(N+52^3)$ 2472 2473 2474 2475 空间复杂度 $O(N)$\\ 2476 2477 2478 \newpage 2479 2480 2481 2482 2483 2484 2485 \leftline{\textbf{试题编号}} 2486 2013 B\\ 2487 2488 2489 2490 \leftline{\textbf{题目名称}} 2491 Hey, Better Bettor\\ 2492 2493 2494 2495 \leftline{\textbf{题目大意}} 2496 在赌场你每局有$p$的概率赢$1$元钱,$1-p$的概率输$1$元钱。当你的最终受益为负时,赌场会返还你$x\%$的钱,问期望的最大受益。\\ 2497 2498 2499 2500 \leftline{\textbf{算法讨论}} 2501 我们设当我们输到$a$元或者赢到$b$元时就不再继续进行赌博,用$f(i)$表示当前受益为i时的最大期望受益。那么我们可以得出$f(a)=x*a$,$f(b)=b$,$f(i)=p*f(i-1)+(1-p)*f(i+1)$。通过这三个式子我们可以解出$f(0)=(((p/(1-p))^b-(p/(1-p))^{b-a})/(1-(p/(1-p))^{b-a}))*b+(1-x)*(1-((p/(1-p))^b-(p/(1-p))^{b-a})/(1-(p/(1-p))^{b-a}))*a $ 那么接下来只需要搜索a和b的值就可以得出我们所需要的答案了。 2502 2503 2504 2505 2506 \leftline{\textbf{时空复杂度}} 2507 时间复杂度 $O(N^2)$ 2508 2509 2510 2511 空间复杂度 $O(1)$\\ 2512 2513 2514 \newpage 2515 2516 2517 2518 \leftline{\textbf{试题编号}} 2519 2013 C\\ 2520 2521 2522 2523 \leftline{\textbf{题目名称}} 2524 Surely You Congest\\ 2525 2526 2527 2528 \leftline{\textbf{题目大意}} 2529 有一些人需要从某些点走到1号点去,他们都只会沿着最短的路线走。如果在某个时刻两个人需要同时进入同一条路,就会发生矛盾关系,会导致有一个人无法在最短的时间内走到1号点去。问最多能有多少人在最少的时间内走到1号点去。所有人的移动速度相同。\\ 2530 2531 2532 2533 \leftline{\textbf{算法讨论}} 2534 由于所有人都是沿着最短的路线行动,所以先做出最短路图。然后由于到1号点距离不同的人之间一定不会有所影响,所以对每种距离的人做一次网络流算出最大值即可。虽然复杂度很高,但是由于时限很长,所以是能够解决这个问题的。\\ 2535 2536 2537 2538 2539 \leftline{\textbf{时空复杂度}} 2540 时间复杂度 $O(NM+N^3M)$ 2541 2542 2543 2544 空间复杂度 $O(N)$\\ 2545 2546 \newpage 2547 2548 2549 2550 \leftline{\textbf{试题编号}} 2551 2013 D\\ 2552 2553 2554 2555 \leftline{\textbf{题目名称}} 2556 Factors\\ 2557 2558 2559 2560 \leftline{\textbf{题目大意}} 2561 定义$f(i)$为将$i$的所有质因子的排列数(比如$12$有$2 2 3$这$3$个质因子,有三种排列方式),求$f(i)=x$的最小的$i$。\\ 2562 2563 2564 2565 \leftline{\textbf{算法讨论}} 2566 有几个显而易见的结论: 2567 2568 2569 1、选择的质数一定是最小的几个质数。 2570 2571 2572 2、将选择的质数从小到大排序后,较小的质数的指数一定大于等于较大的质数的指数。 2573 2574 2575 只有满足上述两个条件,才能够保证做出来的答案最小。利用上述两个条件进行搜索预处理出所有数的答案即可。(答案的取值不会很多)\\ 2576 2577 2578 2579 2580 \leftline{\textbf{时空复杂度}} 2581 时间复杂度 $O($可行答案数$+$询问数$)$ 2582 2583 2584 2585 空间复杂度 $O($可行答案数$)$\\ 2586 2587 \newpage 2588 2589 2590 2591 2592 \leftline{\textbf{试题编号}} 2593 2013 E\\ 2594 2595 2596 2597 \leftline{\textbf{题目名称}} 2598 Harvard\\ 2599 2600 2601 2602 \leftline{\textbf{题目大意}} 2603 总共有不超过$13$个内存,你需要将它们分配给不超过$B$个部分,每个部分最多拥有$S$个内存。现在给出一段程序,你需要完成该程序对内存的访问操作。如果访问的是第一部分的内存便可以直接访问,如果不是第一部分的内存,你需要先修改位置到该内存所属于的部分,然后再访问这个内存(如果当前位置就是该部分则不需要修改)。每种操作的代价都为$1$,程序段的长度为$N$,求最小的代价。\\ 2604 2605 2606 2607 \leftline{\textbf{算法讨论}} 2608 首先第一步我们需要确定每个内存位置是属于那一部分的,我们用搜索枚举所有可能的情况。注意到除了第一部分剩下的部分都是没有本质区别的,利用这点可以将这部分的搜索大大剪枝,最后该部分的搜索量的极限大概为$10^7$左右。但是如果在每次搜索后依旧用$O(n)$的复杂度确定答案的话是不能接受的,所以我们需要预处理一些信息。 2609 2610 2611 首先第一步我们枚举哪些内存是属于第一部分的(第一部分的内存一定是越多越好)。我们考虑,对答案的影响在于两个地方,第一个是访问每个变量,第二个是切换部分的代价。第一个代价是定值,所以我们只需要想办法快速算出第二个代价的值。在确定了哪些内存属于了第一部分之后,那么对第二个代价有贡献的只可能是剩下的没有被确定归属的内存。我们可以在每次搜索前提前处理出归属不为第一部分 的内存$i$ 的下一个归属不为第一部分的内存是$j$的个数,记录为$cnt[i][j]$。那么在完成一次搜索的时候,如果$i$和$j$ 都不属于第一部分并且它们的归属也不同,那么它们就会对答案贡献$cnt[i][j]+cnt[j][i]$。这样我们就把每次搜索时解出答案的复杂度变成了$O(13^2)$,对于$10s$的时限是可以接受的了。\\ 2612 2613 2614 2615 2616 \leftline{\textbf{时空复杂度}} 2617 时间复杂度 $O(10^7*13^2+N*2^{13})$ 2618 2619 2620 2621 空间复杂度 $O(N)$ 2622 2623 \newpage 2624 2625 2626 2627 \leftline{\textbf{试题编号}} 2628 2013 F\\ 2629 2630 2631 2632 \leftline{\textbf{题目名称}} 2633 Low Power\\ 2634 2635 2636 2637 \leftline{\textbf{题目大意}} 2638 有$N$个机器,每个机器有$2$个芯片,每个芯片可以放$K$个电池,每个芯片能量是$K$个电池的能量的最小值,每台机器的能量是两个芯片能量的差值。现在给出$2NK$个电池的能量,求所有机器的能量之差的最大值最小的值。\\ 2639 2640 2641 2642 \leftline{\textbf{算法讨论}} 2643 很直观的一点是,如果答案$a$是合法的,那么对于$b p\geq a$,$b$也肯定是合法的。所以我们可以二分答案,然后从后往前贪心选取,能选就选,判断是否合法即可。\\ 2644 2645 2646 2647 2648 \leftline{\textbf{时空复杂度}} 2649 时间复杂度 $O(2NK*log{10^9})$ 2650 2651 2652 2653 空间复杂度 $O(2NK)$ 2654 2655 \newpage 2656 2657 2658 2659 2660 \leftline{\textbf{试题编号}} 2661 2013 H\\ 2662 2663 2664 2665 \leftline{\textbf{题目名称}} 2666 Матрёшка\\ 2667 2668 2669 2670 \leftline{\textbf{题目大意}} 2671 有$N$个玩偶,可以将小的玩偶放到大的玩偶里面去,但是这样需要将大的玩偶拆开,会花费$1$的代价。两个玩偶合并后变为一个玩偶(但是小的玩偶仍然在大的玩偶内部),每次可以合并两个相邻的玩偶。求最少的代价使得每一个玩偶里面的$m$个玩偶(包括自己,$m$不为定值)的大小分别是$1$、$2$、$3$、……、$m$。\\ 2672 2673 2674 2675 \leftline{\textbf{算法讨论}} 2676 我们另$f[i][j]$表示将$i$到$j$这一段的所有玩偶合并为一个玩偶所需要的最小的代价。考虑转移即是枚举一个$k$,将$i$到$j$分为$i$到$k$、$k+1$到$j$两部分,这样的代价即使$f[i][k]+f[k+1][j]+$合并左右玩偶的代价。合并左右玩偶的代价可以重做一次得到。有了$f$数组,我们可以用$g[i]$表示前$i$个玩偶合并为最后合法的玩偶的最小代价。转移方式是枚举下一段合并为一个玩偶的位置(需要保证这一段所有玩偶的大小是一个排列)。这样做的复杂度是$O(N^4)$的。由于N最大可以达到$500$,这样的复杂度不能接受,我们考虑如何优化。复杂度的主要问题来自处理$f$数组时,由于状态和枚举断点都是难以优化的,所以我们考虑优化算出合并代价的复杂度。考虑我们假设$k$是$i$到$j$中大小最小的位置,那么如果假设$k$为断点,那么右边的所有的都需要拆开,左边的大于右边的最小值的也都需要被拆开。如果$k$向左移,我们会发现在移动的过程中代价的变化也是单调的。所以我们用一个单调的指针扫描来维护我们的合并代价,就可以将复杂度降至$O(N^3)$。\\ 2677 2678 2679 2680 2681 \leftline{\textbf{时空复杂度}} 2682 时间复杂度 $O(N^3)$ 2683 2684 2685 2686 空间复杂度 $O(N^2)$ 2687 2688 \newpage 2689 2690 2691 2692 \leftline{\textbf{试题编号}} 2693 2013 J\\ 2694 2695 2696 2697 \leftline{\textbf{题目名称}} 2698 Pollution Solution\\ 2699 2700 2701 2702 \leftline{\textbf{题目大意}} 2703 求一个多边形与一个半圆的面积并。\\ 2704 2705 2706 2707 \leftline{\textbf{算法讨论}} 2708 数据保证了多边形在半圆内部的部分是连续的,所以直接自适应辛普森做即可。\\ 2709 2710 2711 2712 2713 \leftline{\textbf{时空复杂度}} 2714 时间复杂度 $O(N*$辛普森迭代次数$)$ 2715 2716 2717 2718 空间复杂度 $O(N)$ 2719 2720 \newpage 2721 2722 2723 2724 2725 \leftline{\textbf{试题编号}} 2726 2013 K\\ 2727 2728 2729 2730 \leftline{\textbf{题目名称}} 2731 Up a Tree\\ 2732 2733 2734 2735 \leftline{\textbf{题目大意}} 2736 有三段分别用于输出树的前序、中序、后续遍历的递归程序,但是程序内部递归调用的部分可能调用的并非自身而是其他的两种遍历程序中的一种。现在给出按照这三段程序所输出的前序、中序、后序遍历,问所有可能有同样输出的程序段以及正确的前序、中序、遍历。(每个递归程序在所有程序段中被调用的次数一定是两次)\\ 2737 2738 2739 2740 \leftline{\textbf{算法讨论}} 2741 首先第一步是枚举六个调用过程分别调用的是什么,然后我们需要判断当前的调用是否能够输出指定的前序、中序、后序遍历。如果此时存在前序或者后序遍历的话,那么根是可以确定的,我们也可以在中序遍历中找到根的位置然后向左向右递归检验。如果此时都不存在前序和后序遍历的话,那么我们是无法确定根是什么的,所以这个时候我们枚举根是哪一个,这样的话我们就能够确定当前的左子树和右子树再递归检验即可。在代码实现上有比较多的细节,不在这里赘述。注意到由于我们每次需要枚举根的位置,这样有可能会导致同样一个部分的答案被计算了多次,所以我们使用记忆化搜索来优化复杂度。\\ 2742 2743 2744 2745 2746 \leftline{\textbf{时空复杂度}} 2747 时间复杂度 $O(26^4*log{26^3})$ 2748 2749 2750 2751 空间复杂度 $O(26^3)$ 2752 2753 \newpage 2754 2755 2756 2757 2758 \end{CJK*} 2759 \end{document}