ATCoder 1600-2400 乱做
ABC234E [dif:1637]
给你一个 \(n\) 个点 \(m\) 条边的图,设 \(dis_{u,v}\) 表示 \(u,v\) 之间的最短路,问最多删几条边 \(dis_{u,v}\) 仍然不变。\(n \le 300, m \le \frac{n(n-1)}{2}\)。
跑 \(\text{Floyd}\) 然后枚举每条边,对于每条边 \((u,v)\) 枚举每个点 \(x\) 判断是否有满足 \(dis_{u,x} + dis_{x,v} \le w(u,v)\) ,如果有的话这边就可以拜拜了。
注意 \(\text{Floyd}\) 初始化时不要把 \(dis_{0,0}\) 赋为 \(0\)。这样的话如果满足上面这个判断条件,说明存在一条经过两条边或更多边的路径的长度和比这条边短。
如果一条最短路的话边肯定越多越好,考虑一下两条边 \((u,x)\) 和 \((x,v)\) 的和如果和 \((u,v)\) 等长,那么 \(w(u,x)\) 和 \(w(x,v)\) 一定比 \(w(u,v)\) 小,那样删掉 \(w(u,v)\) 一定比删剩下两条中的一条优。
时间复杂度 \(\mathcal O(n^3 + mn)\)。
ABC234F [dif:2125]
\(n\) 个数,第 \(i\) 个数的权值为 \(w_i\),一个数被选中的概率为 \(\frac{w_i}{\sum_j w_j}\)。
求选择 \(K\) 次,恰好有 \(M\) 个不同的数的概率。对 \(998244353\) 取模。
设 \(f_{i,j,k}\) 表示前 \(i\) 个数选了 \(j\) 次有 \(k\) 个不同的数的概率。考虑枚举第 \(i\) 个数选了几次进行转移。
有
然后就做完了。。。
时间复杂度 \(\mathcal O(nmK^2)\)。
ABC234G [dif:2032]
\(T\) 组询问,每次询问给定一个序列,初始只有一个数 \(x\),每次向序列末尾加一个数 \(y\) ,设当前末尾的数为 \(z\),则 \(1 \le y \le \sqrt z\) ,一共要加 \(10^{100}\) 次,求可能产生多少种不同的序列。
\(T \le 20, x \le 9 \times 10^{18}\)。
考虑预处理出 \(1 \sim \sqrt[4]{x}\) 的答案,然后做一个前缀和,然后去枚举 \(i, 1 \le i \le \sqrt[4]{x}\) (这一步是在确定第三个数可以填啥),然后对于每个 \(i\) 对应第二位可以填的数是 \([i^2, (i+1)^2)\) ,可直接算出有多少个数,直接暴力枚举一下即可。
时间复杂度 \(\mathcal O(T \sqrt[4]{X})\)。
ABC238F [dif:2058]
有 \(n\) 个人,每个人有两个权值 \(p_i, q_i\),保证序列 \(p,q\) 是一个 \(1 \sim n\) 的排列。
现在让你选 \(K\) 个人,问方案数,对 \(998244353\) 取模。限制是不存在一个未选的人 \(x\) 和一个已选的人 \(y\) 满足 \(p_x > p_y\) 且 \(q_x > q_y\)。
\(K \le n \le 300\)。
先按照第一关键字从小到大排序。
设 \(f_{i,j,k}\) 表示前 \(i\) 和里面选了 \(j\) 个未选择的人的最小值为 \(k\) 时的方案数。则有
答案为 \(\sum_{i=1}^{n} f_{n,K,i}\)。
第一维可以用滚动数组优化掉。
时间复杂度 \(\mathcal O(n^3)\)。
ABC237F [dif:1857]
求满足下列条件的序列有多少种:长度为 \(n\);每个元素的值满足 \(1 \le x \le M\);最长上升子序列的长度恰好为 \(3\)。
\(3 \le n \le 1000, 3 \le m \le 10\)。
设 \(f_{i,j,k,l}\) 表示前 \(i\) 个数,最长上升子序列为 \(j,k,l\) 的方案数。
则有转移方程:
考虑求 LIS (最长上升子序列)时那个 \(\mathcal O(n \log n)\) 的做法,维护 LIS 每个位置的最小值。
由于这里 LIS 长度只有 \(3\) 且值域很小,直接将其设为状态维护即可。
时间复杂度为 \(\mathcal O(nm^4)\)。
ABC237G [dif:2088]
给你一个长度为 \(n\) 的排列,\(Q\) 次操作,一个数 \(x\)。
操作分两种:区间升序排序 和 区间降序排序。
求最后 \(x\) 所在位置。
\(1 \le N,Q \le 2 \times 10^5\)
发现我们只需要关注与 \(x\) 的大小关系即可。
考虑这样一个做法,把 $ \ge x$ 的数置为 \(1\),其他为 \(0\),然后用线段树维护区间覆盖和求和就可以简单维护。
再取一个序列把 \(>x\) 的数置为 \(1\),其他为 \(0\),其他做法同上。
发现只有一处不同的地方,那便是 \(x\) 所在。
时间复杂度 \(\mathcal O(n + Q \log n)\)。
ARC134D [dif:1998]
给你一个长度为 \(2n\) 的序列 \(a\),每次要同时选择 \(a_i\) 和 \(a_{i+n}\),问得到的子序列(下标必须递增)的字典序最小是多少?
设 \(a_x = \min_{1 \le i \le n} \{a_i\}\) ,若 \(a_x > a_{x+n}\) 那么选它即可。
若 \(a_x \le a_{x+n}\),把所有 \(=a_x\) 的元素选上是最优的。
再考虑选完这些元素之后,如果有 \(a_j = a_{x+n}\) 那么还要确定选他会不会更优。
时间复杂度 \(\mathcal O(n + n \log n)\)。
ABC235F [dif:2129]
告诉你有那几个数能用,然后求有多少 \(x \le n\) ,满足 \(x\) 中存在所有能用的数。
\(n \le 10^{10^4}\)。
数位 DP 狗都不做。
(逮捕)
ABC234G [dif:2306]
给你一个长度为 \(n\) 的序列 \(a\),可以把它随意分成若干段。设分成了 \(B_1, B_2,...,B_k\) 这几段,那么这次划分的贡献为:
\[\prod_{i=1}^{k} (\max \{ B_i \} - \min \{B_i\}) \]其中 \(\max \{B_i\}\) 表示 \(B_i\) 这段中的最大值,\(\min\) 同理。
计算所有划分方案的价值和对 \(998244353\)。
\(n \le 3 \times 10^5, 1 \le a_i \le 10^9\)。
设 \(f_i\) 表示前 \(i\) 个元素构成的序列的所有划分方案的贡献和,则答案为 \(f_n\)。
一个显然的 \(\mathcal O(n^2)\) DP 是
考虑把 \(\max\) 和 \(\min\) 拆开,一个加一个减。
单独考虑 \(\max\) 的贡献,每个 \(a_k\) 可以影响的是一段区间,可以对这段区间的 \(f\) 用前缀和处理然后直接 \(\mathcal O(1)\) 查询区间和。对于每个有贡献的 \(a_k\),直接用单调栈维护即可。\(\min\) 的贡献同理。
时间复杂度 \(\mathcal O(n)\)。
ARC136E [dif:3100]
给你 \(n\) 个点,每个点有点权。如果两个点 \(i,j\) 满足 \(i<j\) 且 \(\gcd(i,j) > 1\) ,则有连边 \(i \to j\)。选择一些点,使他们之间不可达,点权和尽可能大。求这个最大点权和。
\(n \le 10^6\)。
\(1\) 可能能选。
剩下的,奇偶分类,偶数之间肯定有连边。对于奇数,设 \(f(x)\) 表示 \(x\) 的最小质因数。
最先和他联通的偶数是 \(x-f(x)\) 和 \(x + f(x)\)。
如果一个奇数 \(y\) 和他联通,那么 \(x+f(x) \le y-f(y)\)。
那奇数位置有贡献的区间为 \((x-f(x), x+f(x))\)。
偶数位置有贡献的区间为 \([x,x]\)。
在值域数组上差分统计,然后做个前缀和求最大值即可。
时间复杂度可以做到 \(\mathcal O(n)\)。