即时笔记——Day 2
Sweetlemon
2018-10-21 08:04:46
### 冰茶姬
#### [无线通讯网](https://www.luogu.org/problemnew/show/P1991)
1. 二分$D$,对于每一个$D$,将两个距离不超过$D$的点连边,连边后检查连通块的个数是否不大于$S$(必须两边都有卫星电话才能通话),当只有一个连通块时不需要卫星电话。$\text{O}(n^2 \log x)$。
2. 对边排序,找到位于最小生成树上的第$P-S$条边(仍然注意只有一个连通块时不需要卫星电话),它的长度即为$D$的最小值。$\text{O}(n^2\log n)$。
#### 穿越走廊
1. 二分球体直径。对障碍物(包括圆和上下墙壁)进行两两的枚举,如果这两个障碍物之间的最小距离(两圆间距离/球与墙壁距离/两墙壁间距离)小于球的直径,就在这两个障碍物之间连边。如果最后上、下墙壁是连通的(可以视为有一堵贯穿上下墙壁的墙),就不可行;否则可行。
2. 连边方法同上。把边按从小到大排序,依次加入图中,则球体的最大直径就是恰使上下墙壁连通的那一条边的长度$l$减去$1$($l-1$)。
#### [货车运输](https://www.luogu.org/problemnew/show/P1967)
~~本蒟蒻的极度暴力方法:直接$\text{O}(n^3)$跑$\text{Floyd}$。~~
$30$分方法:
1. 二分限重,判断是否连通。$\text{O}(qm\log z)$。
2. 对边排序,从大到小将边加入图中,直到起点和终点连通为止。$\text{O}(m\log m+qm)$。
### 带权冰茶姬
#### [关押罪犯](https://www.luogu.org/problemnew/show/P1525)
1. 对答案进行二分,对某个答案$x$,对所有怨气值大于$x$的罪犯连边,如果最后得到的图是二分图,则$x$可行。$\text{O}((n+m)\log c)$
2. 对边排序,从大到小按上述方法连边,直到图不是二分图时,加入的最后一条边的权值即为答案。$\text{O}(m\log m)$
**[(带权)冰茶姬判二分图](https://sweetlemon.blog.luogu.org/bipartite-graph)**。
### 搜索
#### [逛公园](https://www.luogu.org/problemnew/show/P3953)
$10$分:先$\text{Dijkstra}$计算最短路长度,再$\text{dfs}$枚举简单路径(无剪枝)。
$20$分:先$\text{Dijkstra}$计算最短路长度,再$\text{dfs}$枚举简单路径(当前已走路径长超过$\text{dis}(1,n)+k$时剪枝)。
$30$分:
1. 先$\text{Dijkstra}$计算每个点到$1$和$n$的距离,再$\text{dfs}$枚举简单路径($\text{dis}(1,u)+w+\text{dis}(v,n)$超过$\text{dis}(1,n)+k$时剪枝)。其实只能过$k=0$的点。
2. 注意到有$3$个点$k=0$。先$\text{Dijkstra}$计算最短路长度,再做一遍[最短路计数](https://www.luogu.org/problemnew/show/P1608)。判断每个点是否在最短路上,重新建图,插入在最短路上的边(边权设为$1$),新图应该是一个$\text{DAG}$,接着$\text{dp}$即可(应该是$\text{O}($能过$)$)。
#### [国王游戏](https://www.luogu.org/problemnew/show/P1080)
$20$分:正序枚举排列并剪枝。
$50$分:因为后面的人得到的金币数一般多于前面的,因此倒序枚举排列可以让最大值尽早暴露出来从而便于剪枝。
#### [飞扬的小鸟](https://www.luogu.org/problemnew/show/P1941)
~~dp好烦啊,不想写dp~~
$50$分:$\text{dfs}(x,y,t)$表示到达$(x,y)$,点了$t$次。枚举点了多少次即可。稍加可行性和最优性剪枝。
#### [愤怒的~~绿鸟~~小鸟](https://www.luogu.org/problemnew/show/P2831)
~~这题据说搜索可以拿满分,久仰久仰~~
~~现在是亲自证明搜索可以满分了~~
对于每一个状态,强制要求消灭当前编号最小的猪,再枚举另一只猪,如果过这两只猪的抛物线满足题目要求,则扫描所有猪,把在这条抛物线上的所有猪删除,继续搜索。
关键是“强制要求消灭当前编号最小的猪”,因为抛物线没有先后之别,因此作如上处理可以减少状态数。
为方便判断边界,可以$\text{dfs}(x,k)$表示当前编号最小的猪是$x$,已经发射了$k$只鸟。
$\text{upd}$:没想到这题比预料中好写。用了记忆化状压搜索,先预处理每一条抛物线可以消灭的猪,再搜索。
#### [宝藏](https://www.luogu.org/problemnew/show/P3959)
先枚举根,再枚举生成树的形态。
如何枚举生成树的形态呢?只需枚举每一个点在第几层即可。第$k$层的点可以连向第$k-1$层的任意一个与它有连边的点,为了使这个方案最优,应该往上一层中与它距离最小的点连边。上述优化极其有效,大大降低了枚举的生成树的数量。
其实这个也没有我想象中的那么难实现嘛 ~~废话你都看过老师代码了~~
#### [换教室](https://www.luogu.org/problemnew/show/P1850)
~~什么?期望dp?~~
先用$\text{Floyd}$算出任意两点最短路。再枚举提出更换教室申请的方案,对于每一种申请方案,计算出这种方案下的期望,加上剪枝即可。$\text{dfs}(x,t)$表示当前计算到第$x$个教室,已经提出申请的次数是$t$。
#### [斗地主](https://www.luogu.org/problemnew/show/P2668)
极其繁琐。
注意到对于$30\%$的数据,$n\le 4$。因此只能出火箭、炸弹、单张、对子、三张和三带一。因此就比较简单。
#### [Mayan游戏](https://www.luogu.org/problemnew/show/P1312)
$30\%$数据为一维,不会有连锁反应。
#### [翻转棋](https://www.luogu.org/problemnew/show/P1985)
这道题是去年$\text{NOIP}$初赛的问题求解呢……当时我什么都不懂~~,现在也还是什么都不懂~~。
首先发现每个格子只有可能翻$0$或$1$次。接着我们发现,第一行的方案确定后,第二行的方案也确定了(如果上方的格子是$1$,就必须翻;否则不能翻),整个棋盘的翻转方案也确定了。因此只需要$\text{O}(2^n)$。
#### [狗哥玩木棒](https://www.luogu.org/problemnew/show/P2383)
因为木棒全用完,因此正方形边长为$\frac{\sum l}{4}$。
#### [小木棍](https://www.luogu.org/problemnew/show/P1120)
枚举原来木棍的段数(注意不能二分)。
剪枝要点:
木棍段数是总长的因数,还有许多极其难以想到的优化。
## 字符串
### 字符串 蛤 习
#### 蛤 习 基 本 法
1. 不要把数字映射到$0$,要不然有没有都不知道
2. 基底要大于字符种数(否则会被冒充)
3. 膜 数还是选一个质数(比较$\text{simple}$的数)吧,比如某些$8$位质数,或者$998244353,993244853,998244853,10^9+7,10^9+9$。
时间复杂度$\text{O}(n) + 1\text{s}$。
#### 子串的 蛤 习
记录前缀 蛤 习 数组$\text{hash}[x]$表示到$x$的前缀串的 蛤 习,则任意子串$s[i...j]$的 蛤 习 值就是$(\text{hash}[j]-e^{j-i+1}\text{hash}[i-1])\% p$。时间复杂度$\text{O}(1) + 1\text{s}$。
#### 蛤 习 求周期
枚举循环节长度$L$,判断$s[1...L],s[L+1...2L],s[2L+1...3L]...$的子串 蛤 习 是否相等,注意最后一个循环节可能不满。时间复杂度$\sum_{i=1}^{n}\frac{n}{i}=\text{O}(n\log n)$。
$\text{KMP}$可以$\text{O}(n)$。
#### 求每个字符为中心的回文串的最大长度
从$\text{Manacher}$那里借一个方便的转化:在相邻两字符之间插入一个奇怪的字符~~,比如男魂~~,最后答案除以$2$即可。
做正向和逆向两个 蛤 习 ,对每一个中心,二分最大回文串长度。
$\text{O}(n\log n)$。
#### 字符串匹配
枚举位置。
#### [优秀的拆分](https://www.luogu.org/problemnew/show/P1117)
1. 枚举子串,对每一个子串枚举$A$,$\text{O}(n^3)$。
2. 不枚举子串,转而枚举$A,B$的分界线,在分界线两端分别枚举$A$和$B$,再用乘法原理计算总方案数,$\text{O}(n^2)$。
虽然这是一道$\text{NOI}$的题目,但是仅用 蛤 习 再加上一些可以理解的暴力手段,就可以拿到$95$分!因此 蛤 习 大法好!坚持 $\text{MoHf}$!