C
做法1
进行任意操作,每个位置的奇偶性是不会变化的
也就是奇数位置的A与偶数位置的B永远不能相互消除,偶数位置的A与奇数位置的B永远不能相互消除
令奇数位置的A有(a)个,偶数位置的B有(b)个,即偶数位置的非B有(frac{n}{2}-b)个
必要条件为(ale frac{n}{2}-bLongrightarrow a+ble frac{n}{2})
令偶数位置的A有(c)个,奇数位置的B有(d)个
同理得(c+dle 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{sumlimits_{i=1}^k b_i-a_i|kin[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|sumlimits_{i=1}^k b_i-a_i=sum,kin[1,n]})
(b_i-a_i> 0)一定在([1,mx])
在([1,mx])中的元素确定的情况下,最优化整数部分(k)(即上述代码中最大的(k)满足sum>=B[i])
(k)最大的充要条件为(sumlimits_{i=1}^k b_ile sumlimits_{i=1}^{mx}b_i-a_i),我们将([1,mx])分为(S,T)两个部分
若将(S)中的元素加入([1,k]),(b_xle sumlimits_{iin S}b_i-a_iLongrightarrow 0le (sumlimits_{iin S}b_i-a_i)-b_x(xin S))
若将(S)外的元素加入([1,k]),(b_xle (sumlimits_{iin S}b_i-a_i)+b_x-a_xLongrightarrow 0le (sumlimits_{iin S}b_i-a_i)-a_x(xin T))
那么问题描述成,已知(sum),最大化(|Z|),(sum-sumlimits_{iin 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(dge 2))
- (d=0)
考虑统计操作序列的方案数
操作一的次数为(B),且将操作序列中操作三全部去除,不会影响操作二的限制条件
枚举操作二的次数(k)
考虑先将操作一、操作二排列,再插入操作三,考虑操作三能插入的条件
下面的((x,d))均为仅考虑操作一、操作二的(d)
- 若在((x,d))后插入操作三,((x,d))后面的所有状态的(d')均需大于(d)。否则不满足最终序列进行操作二时(dge 2)
- 最终的(d=B-A)
考虑第二个条件
仅考虑操作一和操作二,最终的(d=B-k)。我们在((x,d))后插入操作三,令(d)为最大的插入操作三的((x,d))中的(d),意义是最终的(d'=B-A-d)。
故我们只能在(dle A-k)的位置后插入操作三,且(A-k)后必须插入至少一个操作三
将第一个条件描述成:((x,d))为((?,d))最后出现的位置(随(d)增大,(d)最后出现的位置是递增的((dle A-kle B-k)))
总结一下就是:在最后出现的(d)插入任意数量的操作三((dle A-k)),(A-k)后至少有一个
显然插入操作三 与 排列操作一、操作二是独立的,分开做即可