2021.6做题记录

ISIJ 2019 Training Contest 1 Task D: Antimatter

题意

现在有 \(n\) 种实验,第 \(i\) 种消耗 \(c_i\) 个正物质,获得 \(l_i\sim r_i\) 中任意一个整数的反物质
如果你做完第 \(i\) 个实验,获得了 \(x\) 个反物质,那么可以获得 \(10^9x-c_i\) 的价值
你需要用一个容量为 \(m\) 的容器去保存生成的反物质,但是因为反物质非常危险,所以如果你当前有 \(x\) 个反物质,\(x+r_i>m\),那么就不能做第 \(i\) 个实验,否则可能会出现严重的爆炸事故
你现在有无数个正物质,问你最多能获得多少价值

\(n\leq 100,m\leq 2\times 10^6\)
时间限制:2s
空间限制:128M

样例

input1:
1 17
4 6 10
output1:
11999999970
input2:
2 11
2 2 100
3 5 5
output2:
9999999890

题解

考虑一个显而易见的 dp,用 \(f[x]\) 表示拿到 \(x\) 个反物质时的最大价值

\[f[x]=\max_{x-r_i\geq 0}\{\min_{l_i\leq j\leq r_i}\{f[i-j]+10^9j-c_i\}\} \]

显然这个式子可以边做边维护一个ST表,直接解决问题
时间复杂度 \(\mathcal O(nm)\),空间复杂度 \(\mathcal O(m\log m)\),发现会 MLE
考虑进一步优化
我们考虑维护一个单调栈,在 \(x\) 的时候,我们更新 \(f[x+l_i]\) 的信息
我们做单调栈的同时可以把单调栈中的两个元素之间的元素全部连到靠右边的元素上,用并查集维护,这样 \(x\) 指向的元素就是 \([x,i]\) 中的最小值
这样我们直接调用 \(fa[x+l_i-r_i]\) 就可以找到最优转移位置了
时间复杂度 \(\mathcal O(na)\),空间复杂度 \(\mathcal O(m)\)

CF1495D BFS Trees

题意

一个图的一个以 \(x\) 为根的生成树是bfs树当且仅当对于他上面的任意一个点 \(y\)\(x,y\) 满足在原图上的最短路等于在 bfs 树上的最短路
现在要求对于这个图的每一个点对 \((x,y)\),求 既是以 \(x\) 为根的 bfs 树,又是以 \(y\) 为根的 bfs 树的生成树的个数

\(n\leq 400,m\leq 600\)
时间限制:2.5s

样例

题解
显然如果 \(a_i\) 求和比 \((n-1)x\)还要小,显然是 NO
否则一定 YES
并且肯定任意一棵生成树都是可行的
然后我们对于每个点能缩就缩,按照顺序输出
否则对于不能缩的边放到一个栈里面,倒序输出
考虑这样为什么是对的
因为如果 \((u,v)\) 现在选不了,只能被剩下的救,而救兵只能从父亲方向来
所以倒序输出即可

CF1493E Enormous XOR

题意

\(f(x,y)\) 表示 \(xorsum(x,x+1,\cdots y-1,y)\)\(g(l,r)\)\(f(x,y),l\leq x\leq y\leq r\) 的最大值
给定两个 \(n\) 位二进制数 \(l,r\),求 \(g(l,r)\)

\(n\leq 10^6\)

题解

如果 \(l,r\) 位数不同,那么显然是 \(n\)\(1\),因为 $2^{n-1}\ xor\ (2^{n-1}-1) $ 即可
如果 \(l,r\) 位数相同,注意到 \(i\ xor \ i+1=1(i=2k)\),所以对于 \(r\) 是奇数的情况,答案最大就是 \(r\),对于 \(r\) 是偶数的情况,答案有可能是 \(r\) 或者 \(r+1\)
如果 \(r-l\geq 3\) 并且 \(r\) 是偶数,那么答案就是 \(r+1\)

CF1516E Baby Ehab Plays with Permutations

题意
现在有一个长度为 \(n\) 的排列,每次交换其中的任意两个位置,问交换 \(x(1\leq x\leq k)\) 次之后的排列有多少种不同的可能的情况
\(n\leq 10^9,k\leq 200\)

题解

神仙数数题。。。
首先发现正着考虑不太好搞,所以倒过来考虑。。。
转化成有多少个长度为 \(n\) 的排列经过 \(x\) 次交换可以变回去
这样的好处是我们只需要保证最小的交换次数可以回去,同时再随便把两个来回跳偶数次就可以了
\(f[i][j]\) 表示 \(i\) 个数,最少 \(j\) 次可以回去的排列数是多少
对于新加进来的这个数,如果 \(p_i=i\),那么就不需要交换,否则需要和前面任选 \((i-1)\) 中的一个交换,转移为

\[f[i][j]=f[i-1][j]+(i-1)f[i-1][j-1] \]

这个转移其实还可以从另一个角度来考虑
我们用 \(i\) 连向 \(p_i\),这样会形成一些环,在最少交换次数的时候我们要每次把一个环拆成两个环,最后变成每个点都是一个自环
那么相当于是 \(i\) 个点 \(i-j\) 个环计数,也就是第一类斯特林数 \(s(i,i-j)\)
有了这个我们还是不太好解决这个问题,因为答案无法表示
\(n\) 特别大所以第一类斯特林数没法直接预处理
注意到 \(k\) 特别的小,所以最多只会有 \(2k\) 个位置是错开的,所以我们想到枚举这些位置
我们用 \(g[i][j]\) 表示 \(i\) 个点,要求是一个完全错排,要用 \(j\) 步解决,这样我们的答案就可以表示了
枚举这些位置,枚举需要多少步调回来

\[ans=\sum_{i=0}^{\min(n,2k)}\binom{n}{i}\sum_{j=0}^{\lfloor\frac{x}{2}\rfloor}g[i][x-2\times j] \]

考虑 \(g\) 怎么解决,发现 \(f\) 是至多有 \(i\) 个错开,\(g\) 是恰好又 \(i\) 个错开,直接二项式反演

\[g[i][j]=\sum_{k=0}^i (-1)^{i-k}\binom{i}{k}f[k][j] \]

然后问题就愉快的在 \(\mathcal O(k^3)\) 的时间内解决了

P4594 [COCI2011-2012#5] BLOKOVI

题意
给定一些宽度为 \(2\) ,高度为 \(h\),质量为 \(m_i\) 的矩形,现在要叠一座塔,要求每个矩形上面的矩形的重心在这个矩形的底边上,这样塔不会塌,问最靠右的矩形-最下面的矩形的差是多少
重心定义为中心的质量加权平均数

贪心,从上往下放,每次矩形的一边肯定落在上面矩形的重心上
考虑放上一个矩形之后重心的偏移量,设 \(S_i\) 表示上面 \(i\) 个矩形的质量和,\(T_i\) 表示上面 \(i\) 个矩形的质量加权中心的和

\[\Delta x=\dfrac{T_i+m_{i+1}(\frac{T_i}{S_i}+1)}{S_i+1}-\dfrac{T_i}{S_i}=\dfrac{m_{i+1}}{S_{i+1}} \]

这个时候可以分两类讨论,我们要维护的相当于是最靠右的-重心的最大值
感性理解可以得到不会是一直拐弯的,要么不停的往左,要么先往右在往左
考虑往左的情况,最靠右的不变,重心 \(-\Delta x\)\(ans+=\Delta x\)
往右的情况,设重心为 \(C\),最右边的变成 \(C+2\),重心变成 \(C+\Delta x\)\(ans=2-\Delta x\)
这两种取个最大值就可以了

CF1498F Christmas Game

题意
一棵树,每次可以任意挪动一个位置上的任意数量的石子到他的 \(k\) 级祖先,对于每一个点作为根的情况,问先手赢还是后手赢
\(n\leq 10^5,k\leq 20\)

题解
对于深度 \(\bmod k\) 不同的点,我们分开考虑,最后把 SG 异或起来就可以了
接下来的问题相当于是一个树上 nim 游戏
考虑类似阶梯博弈的做法,对于如果先手选取了深度为偶数的点(从0开始编号深度),那么我们接着把他挪下来的再往上挪一层,对于奇数层的没有任何变化,如果先手选取了深度为奇数的点,相当于在奇数层中取走了一些
所以答案相当于是所有的奇数层的权值异或起来,这就是阶梯博弈的做法
回到本题,我们用 \(f[u][i][0/1]\) 表示子树中距离 \(u\)\(kt+i\) 的点的异或和,其中 \(t\) 为奇数/偶数
换根 dp 即可
\(\mathcal O(nk)\)

CF1503D Flip the Cards

题意
一些牌,正反面各有一个数,这些数为 \(1\sim 2n\) 且互不相同
现在可以把一些牌正反面交换,并任意交换位置,使得正面的数 \(a_i\) 单调递增,\(b_i\) 单调递减,问最少要交换多少次
\(n\leq 2\times 10^5\)

题解
显然一张卡片上必须一个 \(\leq n\) 一个 \(>n\),否则一定不行
所以一定存在一个位置 \(x\),使得 \(x\) 左边的 \(\leq n\) 的单增,右边的 \(\leq n\) 的单减,\(>n\) 的相反
我们考虑先让 \(a_i<b_i\)
然后对于 \(b_i\),我们用单调栈维护一个连通块里面的最小值
对于 \(i\) 往前面的比 \(b_i\) 小的位置连边,这样我们连出来的是矛盾图的一个生成树
在这个生成树上二分图染色,取最优的染色方案
判断 \(b\) 是否满足单调的条件,如果可以,这就是最优的方案,否则一定无解
\(\mathcal O(n)\)

CF1526E Oolimry and Suffix Array

题意
求长度为 \(n\),字符集大小为 \(m\),后缀数组为给定的数组 \(sa_i\) 的字符串的方案数
\(n,m\leq 2\times 10^5\)

题解
这道题开始没什么想法,但是仔细想一想其实非常简单
套了一个后缀数组的环境,注意到 \(m\)\(2\times 10^5\) 而不是 \(10^9\),所以大概率是需要枚举用了多少个不同的字符的
所以我们考虑最少需要多少个不同的字符
根据后缀数组的性质,如果 \(rk[sa[i]+1]>rk[sa[i+1]+1]\),那么显然 \(sa[i]\)\(sa[i+1]\) 这两个位置上不能有一个字符,这里是必须换的
这样我们就可以得到有多少个这样的位置 \(least\),这样我们再枚举使用的字符的个数是,我们在剩下的 \(n-1-least\) 的空位上选出几个位置跳到下一个字符上即可

\[ans=\sum_{i=least+1}^m \binom{m}{i}\binom{n-1-least}{i-least-1} \]

CF1528D It's a bird! No, it's a plane! No, it's AaParsa!

题意
\(n\) 个点 \(m\) 条边的有向图,每条边有长度 \(c_i\),即经过这条边需要 \(c_i\)
一条 \((x_i,y_i)\) 的边在第 \(t\) 秒会指向 \((y_i+t)\bmod n\)(点从0开始编号)
问任意两点之间的最短路
\(n\leq 600,n\leq m\leq n^2\)

题解
floyd不太可做,因此枚举起点使用 \(\mathcal O(n^2)\) 的dij做到 \(\mathcal O(n^3)\)
如果 dij 的话发现没法考虑等待的情况
这个时候自然想到连虚边,如果我们某个时刻从 \((x,y)\) 走过去,但是实际上我们要走 \(z\),那么我们需要 \(z-y\) 秒,相当于从 \(y,y+1,y+2\cdots z\) 一路走过去
所以我们从 \(i\)\(i+1\) 连一条长度为 \(1\) 的虚边即可
但是注意起点不能直接走虚边,所以在dij外面把这一层循环走完

P1606 [USACO07FEB]Lilypad Pond G

题意
\(n\times m\) 的网格,0表示水,1表示莲花,2表示石头,3表示起点,4表示终点
起点和终点都有莲花,现在要从起点跳到终点,只能跳马字形,并且只能跳到莲花上,问最少还要在水上放几片莲花可以让他跳过去,并输出放莲花的方案数
\(n,m\leq 30\)

题解
不难把这题转化成一个最短路问题,第一问是最短路,第二问是最短路计数
发现第二问不太好处理,因为已经放了的莲花会影响我们不能直接最短路计数
所以最开始想的是把莲花缩到一起,但是这样同样会出现问题
注意到 \(n,m\) 非常的小,所以实际上应该不是 \(\mathcal O(nm)\)
其实我们可以绕开莲花,假设 4 没有莲花,那么我们可以预处理每个点放一片莲花可以到的地方,但是注意这些地方不包括一开始有莲花的地方
那么我们这样可以新建出来一个图,在这个图上跑最短路计数就是最后的答案了
\(\mathcal O(n^2m^2)\)

Cowboy

题意
\(n\) 个位置,用 \(1\sim m\) 去填,数可以重复,要求 \(a_i<a_{i+2}\) 并且 \(a_i<a_{i+3}\),问方案数
\(n,m\leq 1000\)

input:
4 4
output:
31

题解
\(\mathcal O(n^4)\) 的方案非常好想
先搞一个 \(\mathcal O(n^3)\) 的,用 \(f[i][x_1][x_2]\) 表示第 \(i\) 个位置是 \(x_1\),第 \(i-1\) 个位置是 \(x_2\) 的方案数
那么显然 \(f[i][x_1][x_2]\) 要包括 \(f[i-1][x_2][x_3](x_3<x_1)\),但是这样我们会算重复,我们还要减去 \(f[i-2][x_3][x_4](x_3<x_1,x_1\leq x_4<x_2)\),注意 \(x_4\geq x_2\) 的情况我们是不需要减掉的,因为他们本来就不包括在 \(f[i][x_1][x_2]\) 里面
利用二维前缀和优化 dp 转移就可以了
然后我们把 \(n,m\leq 20\) 的表打出来,观察一些性质
\(f[n][m]\) 表示答案,根据一些分析加上连蒙带猜
如果 \(m\) 放在 \(n-1\) 上,那么可以从 \(\sum_{k=1}^m \sum_{j<k}f[i-2][j]\)
如果 \(m\) 放在 \(n\) 上,那么可以从 \(\sum_{j<m}f[i-1][j]\)
分别处理前缀和和二阶前缀和优化转移即可

CF1517E Group Photo

题意
给一个数列 \(a_i\),把它恰好划分成两个互不相交的集合 \(C,P\),把 \(C,P\) 中的下标从小到大排序为 \(c_i,p_i\)
那么有 \(c_i-c_{i-1}\leq c_{i+1}-c_i\)\(p_i-p_{i-1}\geq p_{i+1}-p_i\),并且要求 \(C\) 中元素之和小于 \(P\) 中元素之和,问方案数
题解
在纸上画画图可以发现,大致能够分成这样几类

  • PPP...PC...CCC
  • CCC...CPCPC...CPCPPPP
  • CCC...CPCPC...CPCPPPPC
  • PCCC...CPCPC...CPCPPPP
  • PCCC...CPCPC...CPCPPPPC

对于第一类情况,我们可以直接二分找到最左边那个 C 最靠左可以到哪个位置
对于第 2~5 类情况,仔细观察之后发现,删掉第一位和最后一位之后,中间部分的结构是一样的,都是
连着 \(A\)C + 连着 \(B\)PC + 连着 \(C\)P
其中 \(A,B,C\) 均可以为空
不难证明这样的分组方法是可以做到不重不漏的
这样的话后四类相当于是一个问题
以第二类为例,设 \(A\) 部分的右端点为 \(l\)\(B\) 部分的右端点为 \(r\),用 \(sum1[i]\) 表示前 \(i\) 个位置中下标为奇数的位置的和,\(sum2[i]\) 表示下标为偶数的
我们枚举 \(l\),假设 \(l\) 是奇数,此时有
\(val(C)=a_1+sum1[r]-sum1[1]+sum2[l]-sum2[1]\)
\(val(P)=a_n+sum1[n-1]-sum1[r]+sum2[n-1]-sum2[l]\)
\(2sum2[r]<sum1[1]+sum1[n-1]+sum2[1]+sum2[n-1]-2sum2[l]-a_1+a_n\)
这个时候右边时一个定值,所以我们可以二分找到 \(r\)
对于 \(l\) 是偶数的情况,同理

CF1497D Genius

题意
显然有 \(n\) 个点,每个点有参数 \(c_i,tag_i,s_i\),其中 \(c_i=2^i\)
现在从任意一点出发开始跳,有一个值 \(w\),开始等于 \(0\)
\(x\) 可以跳到 \(y\) 当且仅当 \(tag_x\neq tag_y,|c_x-c_y|>w\),获得 \(|s_x-s_y|\) 的价值,\(w\) 将更新为 \(|c_x-c_y|\)
问最大收益
一个点可以重复经过
\(n\leq 5000\)
题解
首先不难想到使用 dp
观察这个特殊的 \(c_i\) 的给定方式,我们可以想到挖掘他的一些性质
注意到,如果当前在 \(x\)\(x\) 可以从 \(y\) 跳过来
如果 \(x<y\),那么 \(x\) 只能跳到比 \(y\) 大的
否则是 \(x,y\) 两边的
也就是说,一个点最多只会从左边跳过来一次
有了这个性质,我们就可以做 dp 了,第一层循环我们枚举现在哪个点被从左边跳过来了
我们倒序枚举 \(j\),同时更新 \(f[i]\)\(f[j]\)

AT1999 [AGC002E] Candy Piles

博弈论神题
同时记录一个 idea
\(n\) 个 0,1 的数 \(a_i\)
Alice 和 Bob 博弈
每次可以从以下操作中选一个操作

  • 当剩下的数 \(geq 2\) 时,可以扔掉任意一个数
  • 让所有剩下的数取反

当某人操作后只剩下一个 \(0\) 的时候这个人就输了

sol:
如果 \(n\) 为偶数,如果 \(0\) 的数量 \(\leq\) \(1\),那么先手胜
如果 \(n\) 为奇数,如果 \(1\) 的数量 \(<\) \(0\),那么先手胜

CF1492E Almost Fault-Tolerant Database

题意
\(n\) 个长度为 \(m\) 的数组,试构造一数组 \(A\),使得 \(a_i\)\(A\) 最多有 2 位不同
\(n\times m\leq 2.5\times 10^5\)
题解
显然,答案和 \(a_1\) 不会差超过两位,不妨设 \(a_1\)\(A\)
然后查找所有数组中和 \(A\) 相差最多的个数 \(\Delta\) 和那个位置 \(id\)
如果 \(\Delta\leq 2\),那么 \(A\) 就是答案
如果 \(\Delta >4\) 那么一定无解
如果 \(\Delta =4\),那么我们枚举这 4 个位置中的哪两个是保留在 \(A\) 处的,这样最多只有 \(\binom{4}{2}\) 次重新 check们就可以找到正确答案
如果 \(\Delta =3\),那么我们 \(A\)\(id\) 里分别会有一个位置和最终答案是一样的,我们枚举这两个位置,然后 check,如果 \(\Delta^\prime\) 还是 3,那么把第三个位置设成 \(a_{id^\prime}\) 的值就可以了

\(\mathcal O(12nm)\)

CF1539E Game with Cards

题意
最开始左手右手都是 \(0\)
每一轮必须将左手或者右手中的一只手上的数变成 \(a_i\)
要求第 \(i\) 轮结束后左手上的数在 \([l_l,r_l]\) 之间,右手上的数在 \([l_r,r_r]\) 之间
问是否有方案,如果有,构造
题解
我们用 \(f[i][0/1]\) 表示第 \(i\) 轮我们换了左手/右手,并且下一轮我们一定换右手/左手是否可行
那么 \(f[i][0]\) 转移的时候我们枚举 \(j\),让 \((j,i]\) 这一部分全部都换左手
那么不难发现要求 \(a_j\) 可以适合左手在 \([j,i]\) 中的每次询问,同时右手每次换都是可以满足的,这样是可以转移的
这样转移是 \(\mathcal O(n^2)\) 的,并且无法优化,因为离 \(i\) 最近的 \(j\) 因为 \(a_j\) 的限制不一定最优
所以我们倒着转移,每次从最近的 \(j\) 转移就可以了

CF671D Roads in Yusland

题意
给定一棵 \(n\) 个点的树,有 \(m\)\(x\)\(y\) 的路径,保证 \(x=y\)\(x,y\) 有祖先关系,每条路径有权值 \(c\),要求选最小的权值,使得树上每条边都至少被一条路径覆盖
\(n,m\leq 3\times 10^5\)
题解
考虑 dp,我们用 \(f[u][i]\) 表示 \(u\) 的子树里所有边都被覆盖,目前选了的路径最长可以延伸到深度为 \(i\) 的位置
\(g(u)=\min_{i=1}^{dep[u]-1} f[u][i]\)
如果选择一条以 \(u\) 为起点的路径,有

\[f[u][i^\prime]=c+\sum_{v\in son(u)}g(v) \]

如果不选择,有

\[f[u][i]=\min_{v\in son(u)}\{f[v][i]+\sum_{w\in son(u),w\neq v}g(v)\}=\sum_{v\in son(u)}g(v)+\min_{v\in son(u)} \{f[v][i]-g(v)\} \]

不难发现这个东西是可以线段树合并维护的
但是注意到只涉及到求最小值和全局减法,所以我们用可并堆来维护,惰性删除即可
\(\mathcal O(n\log n)\)

posted @ 2021-05-21 14:08  YuukiYumesaki  阅读(170)  评论(0编辑  收藏  举报