NOIAC 部分题题解
NOIAC 部分题题解
看 EA 神仙推荐而做的。都是最近的省选模拟那几套。
D2T2 zyb的密码匹配
将所有没出现的排列和 \(a_i\) 排序,发现现在变成了一个匹配问题,考虑新的每一段的贡献,发现如果之前的没有配对一定是跟后面配对了,也就意味着一定要跨过这一段,因此我们的贡献是可以提前算的。设 dp 状态 \(f[i][j][k]\) 表示考虑了前 i 个数,配对成功 j 组,总贡献是 k 的方案数。转移时看看最后一对是之前的还是结尾匹配而成即可。妙啊!
D3T1 SA
我们建出来正反两个后缀自动机,然后枚举当前串不匹配的位置,这样我们只用找出扣去某个位置的答案减去完整串的出现次数即可,找出 \(x-1\) 所在的第一个自动机上的节点 a,\(x+1\) 所在的第二个自动机上的节点 b,那么枚举所有的原串中的位置 \(y,y+1\),看看是不是分别在两个节点中,这样会对答案有 1 的贡献,这样太慢,不妨用另外的角度考虑,对两颗 parent 树 dfs 以获得 dfs 序,那么即可转化位二维偏序问题,\(y, y+1\) 变成 \(dfn[y], dfn'[y+1]\) 的点,求出矩形内有多少个点即可。要注意的是,当匹配串在文本串中出现时会被统计 \(|T|\) 次,对答案的贡献应该是 0,所以我们直接减去即可。
D3T2 A
一开始想了个假 dp 😭。
考虑网络流最小割模型,最大变最小?用 100 - x 代替来割掉即可。
每个人的一天连向下一天,流量为收益,割断表示这个人在下一天工作,要新建 0 节点,s 向 0 连 inf 边,最后一天向 t 连 inf 边。
如何表示 x 比 y 先做的限制,很简单,我们只要把 x 的 \(a\) 节点连向 y 的 \(a+1\) 节点即可。容易发现如果 x 割了 k,而 y 割了小于 k 的天,那么还是可以继续流下去的。
D3T3 逆序对
简单题?先把已确定元素逆序对加上,然后用 \(p[x][y]\) 表示第 x 个不确定位置填 y 会和初始已确定位置产生的贡献。容易发现填的数字是单调不降的,所以设 \(dp[x][y]\) 表示第 x 个不确定位置填 y 的收益是多少。
有 \(dp[i][j] = \max(dp[t][j+1] + (i-t)*t+\sum_{p<l\le i}p[l][j])\)
容易发现其可以斜率优化,直接做就行了。
cont