【记录】AT_agc020 模拟赛四道/26.7.15
三个小时三道题吗那比赛经验很不足了。剩下两道开另一个合集。AT_agc020_a [AGC020A] Move and Win - 洛谷 (luogu.com.cn)谁先碰到对方棋子必胜这与棋子之间距离的奇偶性有关。模下样例就好了#includebits/stdc.h using namespace std; int main () { ios::sync_with_stdio(false); cin.tie(0); int n; cin n; int a, b; cin a b; int t abs(a - b); if (t 1) { cout Borys\n; } else { cout Alice\n; } return 0; }AT_agc020_b [AGC020B] Ice Rink Game - 洛谷 (luogu.com.cn)给我一样想这题要想很久的人的题解。首先有几个要确定的性质1.一个固定的结束人数m对应的开始人数一定是一个连续的整数区间[m, m a[i] - 1]。2.对于下一轮的开始人数取值区间里的单个值 x一定是从当前轮开始区间 [x, x a[i] - 1] 转移。而 x 的值是连续的区间所以当前轮开始也一定是连续的区间。3.由上两条可知每轮开始也必为连续区间指不会有分散的解。手模样例印证。4.假设 l[i 1] 和 r[i 1] 是下一轮的开始人数区间包括第 i 轮的结束人数区间如何由此求出当前轮的开始人数区间 l[i] 和 r[i] 我们知道当前轮结束的数一定是 a[i] 的倍数。但 l[i 1] 和 r[i 1]不保证这个范围内的每个数都是a[i]的倍数。因为l[i1]和r[i1]是由更后面的轮次第 i1 轮、第 i2 轮、...、第 n 轮约束出来的它只保证从这个范围内的某个数出发能完成后面所有轮次并最终剩下 2 人。换句话说我们要从l[i1]和r[i1] 这个区间从取所有 a[i] 的倍数做第 i 轮结束的值。这些 a[i] 倍数绝对不能跳出这个区间不然不能满足后续约束最后达成 2 人。那么当前轮结束值最小的 a[i] 倍数应该为多少呢l[i] (l[i 1] a[i] - 1) / a[i] * a[i];是 l[i 1] 的上取整 a[i] 倍数。那么当前轮结束值最大应该为多少呢r[i] r[i 1] / a[i] * a[i];是 r[i 1] 的下取整 a[i] 倍数。现在我们得到 l[i] 第 i 轮结束值最小的 a[i] 倍数r[i] 第 i 轮结束值最大的 a[i] 倍数。注意这里他俩现在还不是第 i 轮的开始人数区间。5.考虑到第 i 轮最多淘汰 a[i] - 1 人所以想要得到第 i 轮的开始人数最大值。r[i] a[i] - 1;第 i 轮的开始人数最小值就是原来第 i 轮的结束人数最小值啦没有淘汰任何人。6.那什么情况下会无解即l[i1]和r[i1] 区间内没有 a[i] 的倍数的情况。也就是if (l[i] r[i]) { cout -1\n; return 0; }整体代码#includebits/stdc.h using namespace std; typedef unsigned long long LL; const int N 2e5 10; LL a[N], l[N], r[N]; int main () { ios::sync_with_stdio(false); cin.tie(0); int n; cin n; for (int i 1; i n; i ) { cin a[i]; } if (a[n] ! 2) { cout -1\n; return 0; } l[n 1] r[n 1] 2; a[n 1] 1; for (int i n; i 1; i --) { l[i] (l[i 1] a[i] - 1) / a[i] * a[i]; r[i] r[i 1] / a[i] * a[i]; r[i] a[i] - 1; if (l[i] r[i]) { cout -1\n; return 0; } } cout l[1] r[1] \n; return 0; }AT_agc020_c [AGC020C] Median Sum - 洛谷 (luogu.com.cn)暴力竟然能过不过正解也不难bitset 优化可行性 dp。而 0 和 sum 是对应的当所有 a[i] 都大于 0 时属于中位数的数值就会往数轴右边移动。所以找第一个大于等于 sum / 2 上取整的可行位置即可。#includebits/stdc.h using namespace std; typedef long long LL; const int N 2010; bitsetN * N dp; int a[N]; int main () { ios::sync_with_stdio(false); cin.tie(0); int n; cin n; LL sum 0; for (int i 1; i n; i ) { cin a[i]; sum a[i]; } dp.reset(); dp[0] 1; for (int i 1; i n; i ) { dp | (dp a[i]); } LL t 0; for (int i (sum 1) / 2; i sum; i ) if (dp[i] ! 0) { t i; break; } cout t \n; return 0; }AT_agc020_d [AGC020D] Min Max Repetition - 洛谷 (luogu.com.cn)竟然不是大分讨不过要真是就是达芬了。首先细节为什么这么多。。。。。