冰茶姬

无线通讯网

  1. 二分DD,对于每一个DD,将两个距离不超过DD的点连边,连边后检查连通块的个数是否不大于SS(必须两边都有卫星电话才能通话),当只有一个连通块时不需要卫星电话。O(n2logx)\text{O}(n^2 \log x)

  2. 对边排序,找到位于最小生成树上的第PSP-S条边(仍然注意只有一个连通块时不需要卫星电话),它的长度即为DD的最小值。O(n2logn)\text{O}(n^2\log n)

穿越走廊

  1. 二分球体直径。对障碍物(包括圆和上下墙壁)进行两两的枚举,如果这两个障碍物之间的最小距离(两圆间距离/球与墙壁距离/两墙壁间距离)小于球的直径,就在这两个障碍物之间连边。如果最后上、下墙壁是连通的(可以视为有一堵贯穿上下墙壁的墙),就不可行;否则可行。

  2. 连边方法同上。把边按从小到大排序,依次加入图中,则球体的最大直径就是恰使上下墙壁连通的那一条边的长度ll减去11l1l-1)。

货车运输

本蒟蒻的极度暴力方法:直接O(n3)\text{O}(n^3)Floyd\text{Floyd}

3030分方法:

  1. 二分限重,判断是否连通。O(qmlogz)\text{O}(qm\log z)
  2. 对边排序,从大到小将边加入图中,直到起点和终点连通为止。O(mlogm+qm)\text{O}(m\log m+qm)

带权冰茶姬

关押罪犯

  1. 对答案进行二分,对某个答案xx,对所有怨气值大于xx的罪犯连边,如果最后得到的图是二分图,则xx可行。O((n+m)logc)\text{O}((n+m)\log c)

  2. 对边排序,从大到小按上述方法连边,直到图不是二分图时,加入的最后一条边的权值即为答案。O(mlogm)\text{O}(m\log m)
    (带权)冰茶姬判二分图

搜索

逛公园

1010分:先Dijkstra\text{Dijkstra}计算最短路长度,再dfs\text{dfs}枚举简单路径(无剪枝)。

2020分:先Dijkstra\text{Dijkstra}计算最短路长度,再dfs\text{dfs}枚举简单路径(当前已走路径长超过dis(1,n)+k\text{dis}(1,n)+k时剪枝)。

3030分:

  1. Dijkstra\text{Dijkstra}计算每个点到11nn的距离,再dfs\text{dfs}枚举简单路径(dis(1,u)+w+dis(v,n)\text{dis}(1,u)+w+\text{dis}(v,n)超过dis(1,n)+k\text{dis}(1,n)+k时剪枝)。其实只能过k=0k=0的点。
  2. 注意到有33个点k=0k=0。先Dijkstra\text{Dijkstra}计算最短路长度,再做一遍最短路计数。判断每个点是否在最短路上,重新建图,插入在最短路上的边(边权设为11),新图应该是一个DAG\text{DAG},接着dp\text{dp}即可(应该是O(\text{O}(能过)))。

国王游戏

2020分:正序枚举排列并剪枝。

5050分:因为后面的人得到的金币数一般多于前面的,因此倒序枚举排列可以让最大值尽早暴露出来从而便于剪枝。

飞扬的小鸟

dp好烦啊,不想写dp

5050分:dfs(x,y,t)\text{dfs}(x,y,t)表示到达(x,y)(x,y),点了tt次。枚举点了多少次即可。稍加可行性和最优性剪枝。

愤怒的绿鸟小鸟

这题据说搜索可以拿满分,久仰久仰

现在是亲自证明搜索可以满分了

对于每一个状态,强制要求消灭当前编号最小的猪,再枚举另一只猪,如果过这两只猪的抛物线满足题目要求,则扫描所有猪,把在这条抛物线上的所有猪删除,继续搜索。

关键是“强制要求消灭当前编号最小的猪”,因为抛物线没有先后之别,因此作如上处理可以减少状态数。

为方便判断边界,可以dfs(x,k)\text{dfs}(x,k)表示当前编号最小的猪是xx,已经发射了kk只鸟。

upd\text{upd}:没想到这题比预料中好写。用了记忆化状压搜索,先预处理每一条抛物线可以消灭的猪,再搜索。

宝藏

先枚举根,再枚举生成树的形态。

如何枚举生成树的形态呢?只需枚举每一个点在第几层即可。第kk层的点可以连向第k1k-1层的任意一个与它有连边的点,为了使这个方案最优,应该往上一层中与它距离最小的点连边。上述优化极其有效,大大降低了枚举的生成树的数量。

其实这个也没有我想象中的那么难实现嘛 废话你都看过老师代码了

换教室

什么?期望dp?

先用Floyd\text{Floyd}算出任意两点最短路。再枚举提出更换教室申请的方案,对于每一种申请方案,计算出这种方案下的期望,加上剪枝即可。dfs(x,t)\text{dfs}(x,t)表示当前计算到第xx个教室,已经提出申请的次数是tt

斗地主

极其繁琐。

注意到对于30%30\%的数据,n4n\le 4。因此只能出火箭、炸弹、单张、对子、三张和三带一。因此就比较简单。

Mayan游戏

30%30\%数据为一维,不会有连锁反应。

翻转棋

这道题是去年NOIP\text{NOIP}初赛的问题求解呢……当时我什么都不懂~~,现在也还是什么都不懂~~。

首先发现每个格子只有可能翻0011次。接着我们发现,第一行的方案确定后,第二行的方案也确定了(如果上方的格子是11,就必须翻;否则不能翻),整个棋盘的翻转方案也确定了。因此只需要O(2n)\text{O}(2^n)

狗哥玩木棒

因为木棒全用完,因此正方形边长为l4\frac{\sum l}{4}

小木棍

枚举原来木棍的段数(注意不能二分)。

剪枝要点:

木棍段数是总长的因数,还有许多极其难以想到的优化。

字符串

字符串 蛤 习

蛤 习 基 本 法

  1. 不要把数字映射到00,要不然有没有都不知道

  2. 基底要大于字符种数(否则会被冒充)

  3. 膜 数还是选一个质数(比较simple\text{simple}的数)吧,比如某些88位质数,或者998244353,993244853,998244853,109+7,109+9998244353,993244853,998244853,10^9+7,10^9+9

时间复杂度O(n)+1s\text{O}(n) + 1\text{s}

子串的 蛤 习

记录前缀 蛤 习 数组hash[x]\text{hash}[x]表示到xx的前缀串的 蛤 习,则任意子串s[i...j]s[i...j]的 蛤 习 值就是(hash[j]eji+1hash[i1])%p(\text{hash}[j]-e^{j-i+1}\text{hash}[i-1])\% p。时间复杂度O(1)+1s\text{O}(1) + 1\text{s}

蛤 习 求周期

枚举循环节长度LL,判断s[1...L],s[L+1...2L],s[2L+1...3L]...s[1...L],s[L+1...2L],s[2L+1...3L]...的子串 蛤 习 是否相等,注意最后一个循环节可能不满。时间复杂度i=1nni=O(nlogn)\sum_{i=1}^{n}\frac{n}{i}=\text{O}(n\log n)

KMP\text{KMP}可以O(n)\text{O}(n)

求每个字符为中心的回文串的最大长度

Manacher\text{Manacher}那里借一个方便的转化:在相邻两字符之间插入一个奇怪的字符~~,比如男魂~~,最后答案除以22即可。

做正向和逆向两个 蛤 习 ,对每一个中心,二分最大回文串长度。

O(nlogn)\text{O}(n\log n)

字符串匹配

枚举位置。

优秀的拆分

  1. 枚举子串,对每一个子串枚举AAO(n3)\text{O}(n^3)

  2. 不枚举子串,转而枚举A,BA,B的分界线,在分界线两端分别枚举AABB,再用乘法原理计算总方案数,O(n2)\text{O}(n^2)

虽然这是一道NOI\text{NOI}的题目,但是仅用 蛤 习 再加上一些可以理解的暴力手段,就可以拿到9595分!因此 蛤 习 大法好!坚持 MoHf\text{MoHf}

评论