AtCoder Beginner Contest 365 题解
AtCoder Beginner Contest 365
擦,F 假了
A
判断闰年
B
输出次大值的下标
用 pair 排序后即可
C
给定一个数组 \(A_n\) 和整数 \(M\),尝试找到一个最大的 \(m\),使得:
不等号左边显然随着 \(m\) 的增大而增大,所以可以二分一个 \(m\),然后判断即可
D
两个人玩 \(n\) 局剪刀石头布。已知 A 的每一局的决策,求 B 的决策在满足下面条件的情况下,最多能赢几局:
- B 的连续两局决策不同
- B 任意一把都不能输给 A
直接设计状态 f[i][0/1/2]
表示玩了前 \(i\) 局游戏,第 \(i\) 局出 剪刀/石头/布 时最多能赢几局,直接转移即可。
E
给定序列 \(A_n\),统计如下式子的值:
首先拆分成前缀和,记 \(B_n\) 为 \(A_n\) 的异或前缀和,等价于求:
观察发现就是求所有 \(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\) 最优。
本文来自博客园,作者:lingfunny,转载请注明原文链接:https://www.cnblogs.com/lingfunny/p/18341173