CodeForces 1776C Library game
orz p_b_p_b。
下文令 为原题面中的 。
拿到题目无从下手,不妨简化一下。
考虑 怎么做。不妨设 。发现若 时 A 必胜,否则 B 必胜。
于是我们大胆猜测结论是将 从大到小排序后, 时 A 必胜,否则 B 必胜。
证明是容易的。根据抽屉原理,第 轮开始前不包含选过的元素的极长连续段长度的最大值最小是 。因此:
- 如果不满足 ,设 为使得 的位置,那么 A 选择长度 的区间时,Bob 一定可以在这个区间内找到 的 等分点(即 的点),这样 A 选完 的区间后,B 一定能获胜。
- 否则,第 轮 A 随便选一个长度 的未被覆盖的区间即可。因为满足 ,所以第 轮一定存在一个长度 的未被覆盖的区间。
交互就直接按上面模拟即可。
code
// Problem: C. Library game // Contest: Codeforces - SWERC 2022-2023 - Online Mirror (Unrated, ICPC Rules, Teams Preferred) // URL: https://codeforces.com/problemset/problem/1776/C // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ldb; typedef pair<int, int> pii; const int maxn = 5050; int n, m, a[maxn]; namespace Sub1 { struct cmp { inline bool operator () (const pii &a, const pii &b) { return a.scd - a.fst > b.scd - b.fst; } }; void solve() { puts("Alessia"); fflush(stdout); multiset<pii, cmp> st; st.emplace(1, m); for (int i = 1; i <= n; ++i) { pii p = *st.begin(); int l = p.fst, r = p.scd; st.erase(st.begin()); printf("%d %d\n", a[i], l); fflush(stdout); int x; scanf("%d", &x); if (l < x) { st.emplace(l, x - 1); } if (x < r) { st.emplace(x + 1, r); } } } } namespace Sub2 { bool vis[maxn]; void solve() { puts("Bernardo"); fflush(stdout); int p = -1; for (int i = 1; i <= n; ++i) { if (a[i] > m / i) { p = i; break; } } for (int i = 1, l, r; i <= n; ++i) { scanf("%d%d", &r, &l); r += l - 1; int len = r - l + 1; if (len < a[p]) { printf("%d\n", l); fflush(stdout); vis[l] = 1; continue; } for (int j = l; j <= r; ++j) { if (j % a[p] == 0) { printf("%d\n", j); fflush(stdout); vis[j] = 1; break; } } } } } void solve() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); } sort(a + 1, a + n + 1, greater<int>()); bool flag = 1; for (int i = 1; i <= n; ++i) { if (a[i] > m / i) { flag = 0; break; } } if (flag) { Sub1::solve(); } else { Sub2::solve(); } } int main() { int T = 1; // scanf("%d", &T); while (T--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)