Codeforces Round 983 (Div. 2)

1|0A. Circuit


#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<int>; using pii = pair<int,int>; void solve() { int n; cin >> n; int cnt = 0; for(int i = 1, x, N = n * 2; i <= N; i ++ ) { cin >> x; cnt += (x == 1); } int res = cnt & 1; int ret = cnt; if(cnt > n) ret = n - (cnt - n); cout << res << " " << ret << "\n"; } i32 main(){ ios::sync_with_stdio(false), cin.tie(nullptr); int T; cin >> T; while(T --) solve(); return 0; }

2|0B. Medians


只分成三段,且中间一段的中位数是 k 就好了。中间一段的长度只有 1,3两种情况。

#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<int>; using pii = pair<int,int>; void solve() { int n, k; cin >> n >> k; if(k * 2 - 1 == n) { cout << 1 << "\n"; cout << 1 << "\n"; } else if(k % 2 == 0) { cout << 3 << "\n"; cout << 1 << " " << k << " " << k + 1 << "\n"; } else { if(k - 1 >= 2 and k + 2 <= n) { cout << 3 << "\n"; cout << 1 << " " << k - 1 << " " << k + 2 << "\n"; } else { cout << "-1\n"; } } return; } i32 main(){ ios::sync_with_stdio(false), cin.tie(nullptr); int T; cin >> T; while(T --) solve(); return 0; }

3|0C. Trinity


考虑枚举最大值,次大值一定满足大于最大值的一半,然后再单独考虑一下最小值。

#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<int>; using pii = pair<int,int>; void solve() { int n; cin >> n; vi a(n); for(auto &i: a) cin >> i; ranges::sort(a); int res = 0; for(int i = 0, j, x, t; i < n; i ++) { x = a[i] / 2; j = ranges::upper_bound(a,x) - a.begin(); t = i - j + 1; if(j - 1 >= 0 and a[j - 1] + a[j] > a[i]) t ++; res = max(res, t); } cout << n - res << "\n"; return; } i32 main(){ ios::sync_with_stdio(false), cin.tie(nullptr); int T; cin >> T; while(T --) solve(); return 0; }

4|0D. Genokraken


其实根据题目可以确定两个限制,每一条链都是递增的,BFS 层序遍历也是递增的,除了根之外每个点至多只有一个儿子。

我们用队列记录叶子点,然后按照递增顺序枚举,每次从队列中取出一个点。如果这个点没有子节点,则这个点将不会有子节点。如果有子节点,则不满足 BFS 序递增。

#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<int>; using pii = pair<int,int>; void solve() { int n; cin >> n; vector<int> p(n + 1); p[1] = 0; queue<int> q; int t = -1; for(int i = 2; i < n; i ++){ cout << "? 1 " << i << endl << flush; int r; cin >> r; if(r == 0) { p[i] = 1; q.push(i); t = i; break; } else { p[i] = 0; q.push(i); } } for(int i = t + 1; i < n; i ++){ while(true) { int x = q.front(); q.pop(); cout << "? " << x << " " << i << endl << flush; int r; cin >> r; if(r) continue; p[i] = x; q.push(i); break; } } cout << "!"; for(int i = 1; i < n; i ++) cout << " " << p[i]; cout << endl << flush; return; } i32 main(){ int T; cin >> T; while(T --) solve(); return 0; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/18523565.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-11-03 AtCoder Beginner Contest 169
点击右上角即可分享
微信分享提示