BYRBT

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}
View Code

 

 

posted @ 2013-09-26 11:08  zhonghaoxi  阅读(2111)  评论(0编辑  收藏  举报
BYRBT