01 2019 档案
摘要:题目描述 题解: 这道题比较特殊,要求将棋子都移动到最后一堆。 所以我们的状态不是这一堆有多少棋子,而是这个棋子在第几堆。 然后对于棋子求一下$SG$函数。 此时$ans$本应等于所有棋子$SG$函数值的异或和,但是a^a=0,相当于偶数自己和自己约掉, 那么ans^=sg[i](a[i]&1)即可
阅读全文
摘要:题目描述: $100*100$的棋盘上有$n$个$Queen$,每个$Queen$可以向左,向下,向左下移动。 两人轮流操作,将任何一个$Queen$移动到$(0,0)$的人获胜。 一个位置上可以有很多$Queen$,$Queen$移动时不需要考虑经过路径上是否有$Queen$。 题解: 这个很像$
阅读全文
摘要:题目描述 题解: $n=1$或$n=2$时,先手直接取完,先手必胜; $n=3$时,先手必败; $n>3$时,若$n$为偶数,先手在一个位置上取了一个/两个,后手就在对称位置上取一个/两个。 若$n$为奇数,第一轮先手在一个位置上取了一个/两个,后手就在对称位置上取两个/一个,接下来按对称取。 所以
阅读全文
摘要:题目描述 题解: 2e9的博弈肯定要先打表找规律。 求$SG$函数就不说了,直接上表。 乍一看看到了一堆$0$。 仔细一看发现每个$2*2$的方框中只有左上是$0$,其余是同一个数字。 然后增大间隔打表,发现…… 代码:
阅读全文
摘要:题目描述 题解: 一道非常简单的$SG$函数应用。 对于一个长度求它的$SG$函数,然后判断是否为$0$即可。 代码:
阅读全文
摘要:题目描述 题解: 假设当前局势为$(a,b)$,其中$a<b$。 分类讨论。 $b-a<a$,此时先手只能将$b$减去一个$a$,状态只与$(a,b-a)$有关。 $b-a>a$,设有$x$满足$0<b-ax<a$,且一定有$x>=2$。 若$(a,b%a)$为必胜,那先手可以让$b$减去$a(x-
阅读全文
摘要:题目描述 题解: 数据范围这么大当然先打表了。 然后发现$P-position$分布极为稀疏。 不妨设$x<y$,则$P-position$为:$(0,0)$,$(1,2)$,$(3,5)$,$(4,7)$…… 有两个规律: 1.所有正整数出现且仅出现一次。 2.第$k$个点的$y-x=k$。 所以
阅读全文
摘要:题目描述 题解: 博弈搜索,后继状态中有一个为$P-position$则当前为$N-position$,否则为$P-position$。 有益于陶冶情操。 代码:
阅读全文
摘要:一个蒟蒻来口胡$SG$函数与$SG$定理。 要是发现有不对之处望指教。 首先我们来了解一下$Nim$游戏。 $Nim$游戏是公平组合游戏的一种,意思是当前可行操作仅依赖于当前局势。 而经典$Nim$游戏是指,一个地方放了$n$堆棋子,每堆棋子数目$a_i$给定。 两人轮流操作,每次操作从一堆中拿出任
阅读全文
摘要:题目描述 题解: 题目的描述比较长,理解起来也有一定难度。仔细读题后我们发现整个任务可以分成两个部分:找出咒语机之间所有的升级关系、求最长升级序列。 1、 求升级关系: 容易看出,咒语机i可以抽象成一个图Gi,其顶点集Vi为ni个元件,每个顶点发出两条边——“0”边和“1”边,分别表示将信号加“0”
阅读全文
摘要:题目描述 题解: 考试的时候手画打表,然后半个小时磨了个式子:$$f[i][j]=f[i-1][j-1]+f[i][j-1]$$ 交上去$A$的时候都蒙了。 考后才知道原因。 考虑$n$维空间内原来有$i-1$个“球”,所以$f[i][j]+=f[i][j-1]$; 然后为了划分最多,“截面”还是一
阅读全文
摘要:2019年1月20日20:44:08 我在给威佐夫博弈打表的时候,无意中发现了一个数列。 它的前$100$位是:$$12122121221221212212122122121221221212212122122121221212212212122122121221212212212122122121
阅读全文
摘要:题目描述: $zhx$有一个棵$n$个点的树,每条边有个权值。 定义一个连通块为一个点集与使这些点连通的所有边(这些点必须连通)。 定义一个连通块的权值为这个连通块的边权和(如果一个连通块只包含一个点,那么它的权值为$0$)。 $zhx$想找一个包含$1$号点的连通块送给他的妹子,所以他希望你求出包
阅读全文
摘要:题目描述 题解: 明显的$k$短路问题,这里提供两种方法。 1.$A$*算法 $A$*可以解决一般的$k$短路问题,但是并不如可持久化可并堆优秀。 $A$*的本质是$f+g$,而估价函数可以用终止节点到终点的最短路表示。 所以先反向建图$dij$,然后小根堆跑$A$*即可。 优化一下,总代价/起点终
阅读全文
摘要:题目描述 题解: 可并堆优化$dp$。 由于$ans$只由$l$与派遣人数决定,我们可以贪心选取总和$<=m$的人。 有两种选择,一种是维护小根堆,一直$pop$到弹出的总和$>m$; 另一种是维护大根堆,一直$pop$到剩下总和$<=m$; 这两种比较一定是维护大根堆更优,因为每次$pop$后剩下
阅读全文
摘要:题目描述 题解: 将所有骑士放在$ci$上,然后树上$dfs$。 每个节点维护一个小根堆,一直$pop$直到$top>=hi$。 然后放加法、乘法标记,将剩下的骑士回溯带回父节点。 代码:
阅读全文
摘要:题目描述 题解: 左偏树,一棵向左倾斜的二叉树。 板子: $upd:$ 之前版本被$luogu$数据卡掉了,$get_top$操作是$O(n)$的。(0_0) 更新路径压缩的做法。 首先合并两棵树就并一下,删除操作要求删除堆顶元素。 肯定是不能直接删的。 怎么做呢,合并儿子后将自己的指针指向新的堆顶
阅读全文
摘要:题目描述 题解: 岛屿之间的边砍/不砍情况有$2^n$种, 但是需要剪掉所有的岛上都首尾相连的情况。 $dp$一下对于完全图没有限制($f$)/有限制($g$)的情况数。 方程:$$f[i]=\sum(C(i-1,j-1)*j^{(j-2)}*f[i-j])$$ $$g[i]=\sum(C(i-2,
阅读全文
摘要:题目描述 题解: 放完前$i-1$个数之后,$i$会让前面的数变成一个整体,而且与后面没有影响。 就有了$dp$方程:$$dp[i]=\sum(k^2*dp[i-k]*(k-1)!*C(i-1,k-1))$$ 拆开组合数之后有这个东西:$$\frac{dp[i]}{(i-1)!}=\sum(\fra
阅读全文
摘要:众所周知$FFT$是一个功能多但是不开$O2$常数吓人的算法。 这里介绍一下$FFT$如何搞字符串匹配。 其实我第一次是字符暴力匹配$52$次,结果$T$了一下午。 后来上网找发现有个更好的算法。 如果有两个数判相等,我们可以相减,判断是否为$0$; 但是字符串匹配相当于多对数判相等,相减加和肯定不
阅读全文
摘要:题目描述: 给一个文本串和一个模式串,模式串中有通配符$'?'$, 问匹配多少次,哪里可以匹配。 题解: 极为暴力,$FFT$单字符匹配$26$次,总计$26*3=78$次$FFT$。 其实有更好的方法我放在下一篇博客里 代码:
阅读全文
摘要:题目描述 题解: $FFT$字符串匹配。 但是容错常数怎么处理? 其实很简单,比如说我们正在匹配$'A'$,原式是$$AGCTATCGACA$$容错常数$k=1$, 在我们眼中$'A'$可以这样匹配:$$AA-AAA-AAAA$$ 因为$'A'$在这些地方都是合法的。 字符集为$4$就做$4$遍。
阅读全文
摘要:题目描述 题解: 能看出来的是,每一组数只能改最后一位,所以前$7$位动不了。 所以$KMP$跑一跑。 重点在于最后一位怎么搞。 如果$KMP$跑完了还没找到合适的位置,直接$puts("No")$就好了。 剩下个匹配问题。 (要不是数据范围拦着我我都想建图跑费用流了) 这个匹配可以用$FFT$求。
阅读全文
摘要:题目描述 题解: 首先一看区间和就知道是预处理前缀和。 区间$[l,r]$求和是$s[r]-s[l-1]$。(废话) 然后感觉这道题好毒瘤啊。。。 好像是构造。 后来才知道官方题解真的给了个多项式。 具体实现就是,有两个多项式$A,B$, 第一次,对于这个前缀和$s$,我们让$A[s]+=s_{le
阅读全文
摘要:题目描述 题解: 第一眼满眼骚操作,然后全部否掉。 然后屈服于题解,才发现这题这么执掌。 首先,如果这个东西是普通的车,那我们可以记录一下$x,y$的覆盖情况,然后减一下; 但是这个可以斜着走。 所以我们可以转一下$x/y$,记录哪一行哪一列没有被覆盖,然后求一下卷积。 得到的是每一条对角线上没有被
阅读全文
摘要:题目描述 题解: 很吊的容斥+$FFT$,但是并不难。 首先,由于有重复,我们要容斥。 怎么办? 记录三个多项式, 只取一个:$w1$; 相同物体拿两个:$w2$; 相同物体拿三个:$w3$; 然后答案能推出来是$(w1*w1*w1-3*w1*w2+2*w3)/6$; 然后$FFT$瞎搞就行了。 注
阅读全文
摘要:题目描述 题解: 认为大爷讲的最好。 代码:
阅读全文
摘要:题目描述: 请计算$C[k]=\sum(a[i]*b[i-k])$ 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。 题解: 由于卷积的式子是:$$C[k]=\sum(a[i]*b[k-i])$$ 其中满足的性质是后面$i+(k-i)=
阅读全文
摘要:题目描述 题解: 由于干每棵植物之前需要先干掉它右面的植物和保护他的植物, 我们可以发现这是最大权闭合子图问题。 简单提一下。 闭合子图,指这个子图中所有的点只会指向子图中的点。 最大权,指这些点有点权,要求得到的闭合子图点权之和最大。 解决办法是,$S$向正点权的点连容量为点权的边,负点权的点向$
阅读全文
摘要:题目描述 题解: 由于线段可以出现平行于$y$轴的情况, 我们要拆点。 然后分情况讨论。 具体方法不赘述。 代码:
阅读全文
摘要:题目描述 题解: 当然上来就离散咯。 先建一条数轴,每个点向后一个点建容量为$k$的边; 然后对于每一个区间,左端点向右端点建容量为$1$的边,费用为离散之前的$l-r$。代表可以跳过这段区间。 代码:
阅读全文
摘要:题目描述 题解: 最大费用流。 每个点向后面不小于它的点建一条容量为$1$,费用$-1$的边。 $S$向所有点建容量为$1$的入边(费用为$-1$),所有点向$T$建容量为$1$的出边(费用为$0$)。 然后最大费用流。 由于第一次得到的通路是费用最小的,这个费用的相反数就是问题一的答案。 然后继续
阅读全文
摘要:题目描述 题解: 其实这道题才是最裸的因为它把建图都交代了 相当于每个点出边唯一,入边唯一。 然后发现这是二分图匹配。 代码:
阅读全文
摘要:题目描述 题解: 分操作讨论一下。 操作$1$: 两条路径走到同一个点原地爆炸。 由于要求点只能取一次,我们可以将点拆为入点和出点。 1.入点->出点,容量为$1$,费用为点权相反数; 2.上面的出点->下面的入点,容量为$1$,费用为0; 3.$S$->最上面一排入点,最下面一排出点->$T$,处
阅读全文
摘要:题目描述 题解: 网络流二十三题中比较有意思的一道题。 正常能想到的建图方法是: 1.拆点,将每一天拆成早上和晚上; 2.早上向晚上连边,容量为当天所需餐巾数; 3.今天晚上向明天晚上连边,容量为正无穷; 4.$S$向早上连边,容量正无穷,费用为买餐巾费用; 5.每天晚上向慢洗后的那一天早上连边,容
阅读全文
摘要:题目描述 题解: 将所有点拆开。 $0$点的拆点之间费用为$0$; $2$点的拆点之间费用为$-1$。 所有点不能到$1$上。 然后最大费用流。 代码:
阅读全文
摘要:题目描述 题解: 图就是题解。 黄色格子只能跳到红色格子上。 于是就和方格取数问题一样了。 代码:
阅读全文
摘要:题目描述 题解: 裸的最小割。 相邻的块不能被同时选中,所以需要将棋盘分成两类。 一类是$x+y$为奇,一类是$x+y$为偶。 然后一类与$S$建边,一类与$T$建边。 最后最大流。用总和减去最大流(即最小割)即为答案。 代码:
阅读全文
摘要:题目描述 题解: 相当于找两条起点到终点的路径。 所以拆点后只有起点和终点的$x$和$y$之间容量为$2$,其余为$1$。 直接最大费用流即可。 代码:
阅读全文
摘要:题目描述 题解: 裸如飞行员的二分图匹配问题。 直接上代码:
阅读全文
摘要:题目描述 题解: 个人认为网络流二十三题中比较有意思的一道。 先枚举球数。 每加一个球,从$S$向$xi$连一条容量为$1$的边,从$yi$向$T$连一条容量为$1$的边。 然后从$xi$向满足$i+j$为完全平方数的$yj$连容量为$1$的边。 在残余网络上跑$EK$或$Dinic$,如果得到的最
阅读全文
摘要:题目描述 题解: 最大流。 建图即$S$向各单位建边,容量为单位人数; 各单位向所有餐桌建边,容量都为$1$,指每张桌只能有一个人来自这个单位; 所有餐桌向$T$建边,容量为餐桌容量。 若最后得到的最大流为总人数,代表所有人都吃上饭了。 就可以遍历出边输出了。 代码:
阅读全文
摘要:题目描述 题解: 最大费用最大流。 建图很简单,就是将机器人作为流,进入就从$S$向内流,出来就从图向$T$流。 代码:
阅读全文
摘要:题目描述 题解: 裸的最小、大费用最大流。 其实和最小费用最大流一样,只是推进去时费用取反,输出也取反。 代码:
阅读全文
摘要:题目描述 题解: 很裸的一道最小费用流。 求一下平均数,然后原数-=平均数。 若得到值为正,则从$S$向该点连一条流量为得到值,费用为$0$的边, 若为负,则从该点连一条流量为得到值绝对值,费用为$0$的边。 然后相邻的点互相建流量$inf$,费用为$1$的边。 然后最小费用最大流裸上。 代码:
阅读全文
摘要:题目描述 题解: 很玄学的一道数位$dp$,看了很多篇题解才懂。 直接挂$l$的题解。 代码:
阅读全文
摘要:题目描述 题解: 数位$dp$模板题。 只需要记录上升下降,还有是否在边界上即可。 其中$f,g$是前缀和和后缀和。 代码:
阅读全文
摘要:题目描述 题解: 一看$n$就知道是矩乘加速递推。 问题是怎么推。 不妨认为生成树的边是大号指向小号的。 首先,对于一般节点$x$,$x$可以连到$x-k$,但是连不到$x-k-1$。(废话) 所以我们处理点$x$时要确保$x-k$已经在前面的生成树里面了。 然后就是状态的问题。 由于$x$只能连到
阅读全文
摘要:题目描述: 数据范围:2<=n,m<=8 题解: 很明显需要状压。但是怎么压不知道,压什么不知道。 然后从条件下手。 条件1要求黑色在一起白色在一起,记录轮廓线很容易做到。 条件2要求不能出现$2*2$的同色方格。我们还需要再记录当前位置的左上角。 所以这道题的轮廓线长这样。 丑图。 我们需要确定一
阅读全文
摘要:题目描述 题解: 一道极水的插头$dp$。 根本不需要左右括号分开看,直接都当作括号。 什么三进制四进制,二进制就可做。 讨论比模板要少。 (luogu丧心出题人有hack点。。。) 代码:
阅读全文
摘要:题目描述 题解: 插头$dp$中经典的回路问题。 首先了解一下插头。 一个格子,上下左右四条边对应四个插头。就像这样: 四个插头。 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头。 所以所有被回路经过的格子有六种状态,即左上,左右,左下,上右,上下,右下。 这几个就是插头$dp$的基本。 然
阅读全文
摘要:题目描述: 给出一棵$n(n<=200000)$的树。每个点有一个权值$w$,表示堵上这个点的花费。 $m$组操作,操作一为将点$x$的权值加上一个非负整数$d$,操作二为询问以点$x$为根的子树内堵上所有根到叶节点路径的最小花费。 题解: 设$h[x]$为$x$的所有子节点的最小花费之和。 一眼看
阅读全文
摘要:题目描述 题解: 一个看起来非常人畜无害的$dp$:$$f[i][k]=min(f[j][k]+cost(j,i))+c[i]$$ 中间那个$cost(j,i)$可以通过$cost(j,i-1)$得到,这个东西是动态的。 用线段树维护一下就好了。 代码:
阅读全文
摘要:题目描述 题解: $dp$。 有$$f[r[i]]=min(f[k]+1)$$。 然后用线段树优化转移就好了。 代码:
阅读全文
摘要:题目描述 题解: 很明显总体路径可以是一直向左/向右,或者先向一个方向跑几步,然后反向跑。 所以我们可以得到四种基本运动方式: LGL:一直向左; RGR:一直向右; LGR:先向左,然后向右回到原点; RGL:先向右,然后向左回到原点。 然后决策单调,分治求解上面四个东西,最后合并出结果。 代码:
阅读全文
摘要:题目描述 题解: 答案显然是$max((q-p)*(e-d))$ 依然先贪心。 对于工厂,我们倾向于$pi<pj,di<dj$的; 对于买家,我们倾向于$qi>qj,ei>ej$的。 于是将一定不是最优解的工厂和买家划掉。 然后我们发现这个东西是满足决策单调性的。 问我怎么证?画一个二维坐标系,然后
阅读全文
摘要:题目描述 题解: 我们可以考虑这样一种情况,有一块$10*10$的土地,还有一块$1*1$的土地。 当然将$1*1$的土地合到$10*10$的土地中了。 所以我们可以先按土地$x$值从大到小排序,然后从前向后扫一边,只将不会被完全覆盖的放到处理的集合里。 这样就可以$dp$了。 有$$dp[i]=m
阅读全文
摘要:题目描述 题解: 这是个多重背包,但是一般的复杂度是过不去这题的。 所以有二进制优化和单调队列优化。 二进制优化是将数量$n$化为多个数,而且这些数能表示出$1~n$中的任意数。 怎么保证? 想起二进制,我们可以将$n$分为$1+2+4+8+……+k$,$k$可以是任意数。 单调队列怎么优化? 我们
阅读全文
摘要:题目描述 题解: 应该是个$dp$; $dp[i][j]$表示第$i$个人涂到第$j$块的最大收益。 推一下式子:$$dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][k]+(j-k)*p[i])$$ 对于最后面那个式子可以化一下:$$max(dp[i-1][k]
阅读全文
摘要:题目描述 题解: 由于$p<=10$,我们可以暴力枚举覆盖频道状态为$s$的特殊点,每次跑一遍斯坦纳树, 最后合并,方程和斯坦纳树的状态合并方程几乎一样。 代码:
阅读全文
摘要:题目描述 题解: 这道题是斯坦纳树的典型例题。 首先看一眼数据范围发现$10$的范围不状压对不起出题人,然后考虑转移。 设$f[i][j][s]$表示当前在点$(i,j)$,覆盖特殊节点状态为$s$的最小花费。 转移有: 1.$s$不变,此时有$f[i][j][s]=min(f[i'][j'][s]
阅读全文