AGC040
C
做法1
进行任意操作,每个位置的奇偶性是不会变化的
也就是奇数位置的A与偶数位置的B永远不能相互消除,偶数位置的A与奇数位置的B永远不能相互消除
令奇数位置的A有\(a\)个,偶数位置的B有\(b\)个,即偶数位置的非B有\(\frac{n}{2}-b\)个
必要条件为\(a\le \frac{n}{2}-b\Longrightarrow a+b\le \frac{n}{2}\)
令偶数位置的A有\(c\)个,奇数位置的B有\(d\)个
同理得\(c+d\le \frac{n}{2}\)
进一步的,这是充要条件
证明:
若序列中有C,我们强制每次C与A/B消掉,稍微分析一下,会发现消掉C或消掉A和B后,仍然能满足
令现在序列长度为\(m\)
\(a'+b'\le \frac{m}{2}\)
\(c'+d'\le \frac{m}{2}\)
进一步还有\(a'+d'=b'+c'=\frac{m}{2}\)
综合得:\(a'+c'=b'+d'=\frac{m}{2}\),故每次一定能找到一对合法的删掉,显然删掉后仍然满足原条件
那么只需要统计不合法的情况即可
做法2
将奇数位置的A换成B,B换成A,那么操作转化为不能删AA或BB
显然,A或B的数量大于\(\frac{n}{2}\)则无解,否则有解
D
考虑确定的顺序的答案,\(sum=max\{\sum\limits_{i=1}^k b_i-a_i|k\in[1,n]\}\)
for (int i = 1; i <= n; i++) {
if (sum >= B[i]) {
sum -= B[i];
ans += 1;
} else {
ans += 1.0 * sum / B[i];
break;
}
}
考虑最优解的排列
令\(mx\)满足\(max\{k|\sum\limits_{i=1}^k b_i-a_i=sum,k\in[1,n]\}\)
\(b_i-a_i> 0\)一定在\([1,mx]\)
在\([1,mx]\)中的元素确定的情况下,最优化整数部分\(k\)(即上述代码中最大的\(k\)满足sum>=B[i])
\(k\)最大的充要条件为\(\sum\limits_{i=1}^k b_i\le \sum\limits_{i=1}^{mx}b_i-a_i\),我们将\([1,mx]\)分为\(S,T\)两个部分
若将\(S\)中的元素加入\([1,k]\),\(b_x\le \sum\limits_{i\in S}b_i-a_i\Longrightarrow 0\le (\sum\limits_{i\in S}b_i-a_i)-b_x(x\in S)\)
若将\(S\)外的元素加入\([1,k]\),\(b_x\le (\sum\limits_{i\in S}b_i-a_i)+b_x-a_x\Longrightarrow 0\le (\sum\limits_{i\in S}b_i-a_i)-a_x(x\in T)\)
那么问题描述成,已知\(sum\),最大化\(|Z|\),\(sum-\sum\limits_{i\in Z}max(a_i,b_i)\ge 0\)
但还要考虑小数部分,我们枚举\(mx+1\)所在的位置,然后二分\(k\)看是否满足
E
只考虑操作1,我们有个很显然的贪心,从后往前能选多大选多大
一开始的想法是将同类操作调整到开头,枚举操作1的次数,然后直接贪心,再贪心的进行操作2
这样是错的:
仅考虑操作1,操作次数为\(a_i>a_{i+1}\)的个数(\(a_{n+1}=0\))
令操作1造成的贡献为\(x_i\),操作2造成的贡献为\(y_i\),操作次数为\(x_i>x_{i+1},y_i<y_{i+1}\),那么贪心的话会让每个\(x_i\)尽量大,也就是\(y_i\)尽量小,可能会造成不必要的操作次数
考虑dp,令\(f_{i,j}\)为\(x_i=j\)的\(x_{i...n},y_{i...n}\)造成的最小操作次数
\(f_{i,j}=min(f_{i+1,k}+[j>k]+[a_i-j<a_{i+1}-k])\)
固定\(f_{i+1,k}\),极差为\(2\),且\(f_{i,j}\)随\(j\)增大单调不升
维护分界线即可
F
令\((x,d)\)为当前较大值所在位置为\(x\),次大值距离其\(d\)
将变化描述成三种操作
- \(++x,++d\)
- \(--d(d\ge 2)\)
- \(d=0\)
考虑统计操作序列的方案数
操作一的次数为\(B\),且将操作序列中操作三全部去除,不会影响操作二的限制条件
枚举操作二的次数\(k\)
考虑先将操作一、操作二排列,再插入操作三,考虑操作三能插入的条件
下面的\((x,d)\)均为仅考虑操作一、操作二的\(d\)
- 若在\((x,d)\)后插入操作三,\((x,d)\)后面的所有状态的\(d'\)均需大于\(d\)。否则不满足最终序列进行操作二时\(d\ge 2\)
- 最终的\(d=B-A\)
考虑第二个条件
仅考虑操作一和操作二,最终的\(d=B-k\)。我们在\((x,d)\)后插入操作三,令\(d\)为最大的插入操作三的\((x,d)\)中的\(d\),意义是最终的\(d'=B-A-d\)。
故我们只能在\(d\le A-k\)的位置后插入操作三,且\(A-k\)后必须插入至少一个操作三
将第一个条件描述成:\((x,d)\)为\((?,d)\)最后出现的位置(随\(d\)增大,\(d\)最后出现的位置是递增的\((d\le A-k\le B-k)\))
总结一下就是:在最后出现的\(d\)插入任意数量的操作三(\(d\le A-k\)),\(A-k\)后至少有一个
显然插入操作三 与 排列操作一、操作二是独立的,分开做即可