比赛链接Dashboard - Codeforces Round 1052 (Div. 2) - CodeforcesEqual Occurrences题目描述思路开个map记录每个数字出现的次数两重循环暴力遍历第一重遍历选取的数量第二重遍历满足的数量代码#include bits/stdc.h using namespace std; typedef pairint, int PII; #define x first #define y second #define int long long #define endl \n const int mod 1e9 7; int dx[3] {1, 0, 0}; int dy[3] {0, 1, -1}; void solve() { int n; cin n; mapint, int mp; for(int i 0, x; i n; i ) { cin x; mp[x] ; } int ans -1; for(auto t : mp) { int sum t.y, cnt 0; for(auto tt : mp) if(sum tt.y) cnt ; ans max(ans, cnt * sum); } cout ans endl; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T 1; cin T; while(T -- ) { solve(); } return 0; }Merging the Sets题目描述思路贪心的想最优的情况肯定是把所有的集合都取到如果都取到还不能全覆盖则无解然后循环遍历每次把对应集合的贡献剔除题目数据范围所有集合中的数量之和不超过2e5暴力遍历可行。代码#include bits/stdc.h using namespace std; typedef pairint, int PII; #define x first #define y second #define int long long #define endl \n const int mod 1e9 7; int dx[3] {1, 0, 0}; int dy[3] {0, 1, -1}; void solve() { int n, m; cin n m; vectorint v(m 1); vectorsetint s(n); for(int i 0; i n; i ) { int k, x; cin k; while(k -- ) { cin x; s[i].insert(x); v[x] ; } } int cnt 0; bool f false; for(int i 1; i m; i ) if(v[i] 0) { f true; break; } cnt !f; if(cnt 0) { cout NO endl; return ; } for(int i 0; i n; i ) { f false; for(auto t : s[i]) { v[t] -- ; if(v[t] 0) f true; } for(auto t : s[i]) v[t] ; if(!f) cnt ; if(cnt 3) { cout YES endl; return ; } } cout NO endl; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T 1; cin T; while(T -- ) { solve(); } return 0; }Wrong Binary Search题目描述思路假设情况成立可以发现s[i] ‘1’的位置p[i] i小于i的索引x当s[x] ‘0’时p[x]一定小于p[i]大于i索引的x则一定大于p[i]于是我们发现只要s中字符0连续出现或不出现时则一定有解对于这个区间的构造我们可以直接将这一区间的数翻转。代码#include bits/stdc.h using namespace std; typedef pairint, int PII; #define x first #define y second #define int long long #define endl \n const int mod 1e9 7; int dx[3] {1, 0, 0}; int dy[3] {0, 1, -1}; void solve() { int n; string s; cin n s; vectorint ans(n 1); for(int i 1; i n; i ) ans[i] i; s s; for(int i 1; i n; i ) { if(s[i] 0) { int j i; while(j 1 n s[j 1] 0) j ; if(j - i 1 1) { cout NO endl; return ; } reverse(ans.begin() i, ans.begin() j 1); i j; } } cout YES endl; for(int i 1; i n; i ) cout ans[i] ; cout endl; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T 1; cin T; while(T -- ) { solve(); } return 0; }Max Sum OR (Hard Version题目描述思路相较于简单版本数据范围变大了情况处理起来也更复杂但是核心思路是不变的。对于两个数or在二进制上我们尽可能的要0 1或 1 0这样配对。题目给的区间是连续的对于一段区间直到不能匹配。特殊的如果这一段区间最高位的1都在同一位就先把最高位的1剪掉递归完之后再加回来。代码#include bits/stdc.h using namespace std; typedef pairint, int PII; #define x first #define y second #define int long long #define endl \n const int mod 1e9 7; int dx[3] {1, 0, 0}; int dy[3] {0, 1, -1}; void solve() { int L, R; cin L R; int n R - L 1; vectorint res(n); functionvoid(int, int, int) dfs [](int l, int r, int st) - void { if(l r) return ; if(l r) { res[st] l; return ; } if(bit_width(unsigned(l)) bit_width(unsigned(r))) { int w bit_width(unsigned(l)) - 1; dfs(l - (1LL w), r - (1LL w), st); for(int i l; i r; i ) res[i - l st] | 1LL w; return ; } int w bit_width(unsigned(r)) - 1; int mid 1LL w; if(mid - l r - mid 1) { for(int i l; i mid; i ) { int x i, y mid - 1 mid - i; res[x - l st] y; res[y - l st] x; } dfs(mid - l mid, r, st (mid - l) * 2); } else { for(int i mid; i r; i ) { int x mid mid - i - 1, y i; res[x - l st] y; res[y - l st] x; } dfs(l, mid mid - r - 2, st); } }; dfs(L, R, 0); int ans 0; for(int i L; i R; i ) ans res[i - L] | i; cout ans endl; for(auto t : res) cout t ; cout endl; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T 1; cin T; while(T -- ) { solve(); } return 0; }