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\) 个数选了几次进行转移。

\[f_{i,j,k} = \sum_{x} f_{i-1,j-x,k-[x>0]} \times \binom{j}{x} \times c_i^x \]

然后就做完了。。。

时间复杂度 \(\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\) 时的方案数。则有

\[f_{i,j,k}=\sum f_{i-1.j-1,k} [a_i < k] \\ f_{i,j,\min \{ a_i,k\}}=\sum f_{i-1,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\) 的方案数。

则有转移方程:

\[f_{i,x,k,l} = \sum_{x \le j} f_{i,j,k,l} \\ f_{i,j,x,l} = \sum_{j < x \le k} f_{i,j,k,l} \\ f_{i,j,k,x} = \sum_{k < x \le l} f_{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 是

\[f_{i} = \sum_{j=0}^{i-1} f_j \times (\max_{j<k \le i} a_k - \min_{j<k\le i} a_k) \]

考虑把 \(\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)\)

posted @ 2022-03-18 15:17  Suzt_ilymtics  阅读(71)  评论(0编辑  收藏  举报