AtCoder Beginner Contest 365 题解

AtCoder Beginner Contest 365

擦,F 假了

A

判断闰年

B

输出次大值的下标

用 pair 排序后即可

C

给定一个数组 \(A_n\) 和整数 \(M\),尝试找到一个最大的 \(m\),使得:

\[\sum_{i=1}^n \min(A_i, m)\le M \]

不等号左边显然随着 \(m\) 的增大而增大,所以可以二分一个 \(m\),然后判断即可

D

两个人玩 \(n\) 局剪刀石头布。已知 A 的每一局的决策,求 B 的决策在满足下面条件的情况下,最多能赢几局:

  1. B 的连续两局决策不同
  2. B 任意一把都不能输给 A

直接设计状态 f[i][0/1/2]表示玩了前 \(i\) 局游戏,第 \(i\) 局出 剪刀/石头/布 时最多能赢几局,直接转移即可。

E

给定序列 \(A_n\),统计如下式子的值:

\[\sum_{l=1}^{n-1}\sum_{r = l+1}^n\oplus_{i=l}^r A_i \]

首先拆分成前缀和,记 \(B_n\)\(A_n\) 的异或前缀和,等价于求:

\[\sum_{l=1}^{n-1}\sum_{r=l+1}^n B_{r}\oplus B_{l-1} \]

观察发现就是求所有 \(y - x\ge 2\)\(B_y\oplus B_x\)

拆位,每次统计第 \(i\) 位的贡献。

按顺序从左到右计算,每次枚举一个 \(i\),变成统计有多少 \(j < i - 1\) 满足 \(B_j = 0, B_i = 1\)\(B_j = 1, B_i = 0\)

就是数 \(0\)\(1\) 的个数,前缀和即可。

F

不难发现贪心地往右走直线是对的。

然后考虑用线段树上二分处理出 \(i\) 的上/下边界向右最多能走到哪里。到了极限之后,肯定就直接往上或往下走到边界

然后这个东西,你再加个倍增,就可以回答询问了。感觉不难吧,这个套路以前在 CF 见过。

赛时想的差不多,不过有个细节假了。

G

发现这是一道怎么看都不可能非多项式写的题。

考虑根号分治,对于段数小的,暴力统计,总共有 \(O(n)\) 种,统计复杂度 \(O(B)\),时间复杂度 \(O(nB)\)

对于段数多的,暴力统计他和别的段的答案,总共有 \(O(\frac{n}{B})\) 个,统计复杂度 \(O(n)\),时间复杂度 \(O(\frac{n^2}{B})\)

均值不等式,\(B=\sqrt n\) 最优。

posted @ 2024-08-03 21:53  lingfunny  阅读(107)  评论(0编辑  收藏  举报