【Atcoder】AGC026 B-F简要题解

本文解析了多项算法竞赛题目,包括区间转移、动态规划等核心策略。针对不同问题提出了有效解决方案,并通过代码示例详细展示了实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**B.rng_10s

特判A&lt;BA&lt;BA<BD&lt;BD&lt;BD<B的情况。

问题转化为初始坐标为A−BA-BAB,每次可以移动−B-BB+D−B+D-B+DB,要求点始终落在[C−B+1,C−B+D][C-B+1,C-B+D][CB+1,CB+D]中。
发现可达坐标在模gcd⁡(B,D)\gcd(B,D)gcd(B,D)意义下与AAA同余,那么找到最小的一个x≡A(modgcd⁡(B,D))x\equiv A\pmod {\gcd(B,D)}xA(modgcd(B,D))x≥C−B+1x\geq C-B+1xCB+1的数,x≥0x\geq 0x0则输出"Yes",否则输出"No"。

p.s 具体实现时,可以直接找到第一个&lt;0&lt;0<0xxx,判断其是否≥C−B+1\geq C-B+1CB+1


C.String Coloring

2n,n≤182n,n\leq 182n,n18,明示折半枚举

2n2^n2n枚举前nnn个字符的颜色,两个串的具体值都能够被确定, 然后n2n^2n2DP求出后nnn个字符颜色匹配的方案数即可。


*D.Histogram Coloring

一开始10910^9109还以为是矩阵快速幂什么的,好zz。。。

考虑相邻两行(假设列数相同),它们要么对应位置颜色都相同(两行都是颜色交错的),要么都全部不同。按高度DPDPDP即可。

pair<int, int> solve(int l, int r, int base, vector<int> &a) {
  int x = *min_element(a.begin() + l, a.begin() + r), coef = 1, all = 1, number = 0;
  for (int i = l; i < r; ++i) {
    if (a[i] != x) {
      int j = i;
      while (j + 1 < r && a[j + 1] != x) {
        ++j;
      }
      pair<int, int> value = solve(i, j + 1, x, a);
      i = j;
      coef = mul(coef, value.first);
      all = mul(all, add(value.first, value.second));
    } else {
      ++number;
    }
  }
  return make_pair(mul(coef, power(2, x - base)), add(mul(all, power(2, number)), mul(coef, sub(power(2, x - base), 2))));
}

//ans=solve(0, n, 0, a).second

*E.Synchronized Subsequence

设第iiiaaa的位置为aia_iai,第iiibbb的位置为bib_ibi
可以把序列分成若干个极小段,满足每段内cnta=cntbcnt_a=cnt_bcnta=cntb,且所有ai&lt;bia_i&lt;b_iai<bi或所有ai&gt;bia_i&gt;b_iai>bi

ai&lt;bia_i&lt;b_iai<bi,这一段的最优解必然形如ababab...ababab...ababab...(去掉其中连续的aaa)
ai&gt;bia_i&gt;b_iai>bi,这一段的最优解必然是一段后缀。

若选择了某段,必然选择了这段的最优解,所以求出每段最优解后dpdpdp即可


*F.Manju Game

考虑先手第一次从序列中间选择了一个格子,将序列分成了左右两部分,则接下来的操作必然是从当前位置出发向左/右交替选完,只剩下另一部分。

设奇数格子的∑ai=A\sum a_i=Aai=A,偶数格子的∑ai=B\sum a_i=Bai=B

  • nnn为偶数。若先手从中间选了一个格子,剩下的格子必然分成了一个奇数段和一个偶数段,后手选择偶数段往下走,到奇数段时就变成了后手可以先决策,答案不会比先手一开始选定一种奇偶性的格子走更优。所以nnn为偶数时的先手答案为max⁡(A,B)\max(A,B)max(A,B)
  • nnn为奇数。若先手选择了一个偶数格子,剩下的格子必然分成了两个奇数段,后手任意去掉一边后转成了另一边的子问题;否则先手选择了一个奇数格子,能保证的最优答案为AAA
    可以将每次选择的偶数格子看做关键点,最终序列会被这些关键点划分成若干段,且有且仅有一段,先手选择了其中所有奇数格子,其它段先手都选择了其中偶数格子。先手的答案就是关键点加上每段选择的值的和。
    先手可以决策出段的划分:构造一个决策二叉树,每次往后手选择的另一侧走;后手可以决策出哪一段先手选择奇数格子:控制在决策二叉树上向下走的路线。
    考虑二分答案midmidmid,判断先手的答案是否≥B+mid\geq B+midB+mid,相当于判断是否存在一种划分方式,使得每一段中奇数格子值-偶数格子值≥mid\geq midmid
    贪心判断即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值