• AGC040


    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)后至少有一个
    显然插入操作三 与 排列操作一、操作二是独立的,分开做即可

  • 相关阅读:
    Python合集之Python循环语句(二)
    io流2
    io流
    集合工具类
    泛型
    Map
    VSCode_Extensions
    C++ in VSCode
    C# 私有字段前缀 _ 的设置(VS2019, .editorconfig)
    dotnet 跨平台编译发布
  • 原文地址:https://www.cnblogs.com/Grice/p/13297636.html
Copyright © 2020-2023  润新知