Codeforces Round #803 (Div. 2)
A. XOR Mixup
思路:
因为X是n-1个数的异或,所以这n个数异或起来等于0。所以任意一个数都是其他剩下的数异或起来的值
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010; int n; int a[110]; void solve() { cin >> n; for (int i = 1; i <= n; i ++ ) cin >> a[i]; sort(a + 1, a + 1 + n); cout << a[(n + 1) / 2] << endl; } int main() { int T; cin >> T; while(T -- ) { solve(); } return 0; }
B. Rising Sand
思路:
如果k是1,那么每次三个数中间的数可以无限堆高,而最边上两个又不算,所以答案就是(n-1)/2,剩下的情况因为就算只有相邻的两个一块加一那中间的也不会比两边加起来更高。所以就看原来是不是中间比两头高
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010; int a[N]; void solve() { int n, k; cin >> n >> k; for (int i = 1; i <= n; i ++ ) cin >> a[i]; if(k == 1) { cout << (n - 1) / 2 << endl; } else { int res = 0; for (int i = 2; i < n; i++) { if(a[i] > a[i - 1] + a[i + 1]) res++; } cout << res << endl; } } int main() { int T; cin >> T; while(T -- ) { solve(); } return 0; }
C. 3SUM Closure
思路:
数据范围看着很大,但分析一下,如果正数的个数大于2或负数的个数大于2,那么集合要存在的正数或负数会无限增长,所以直接pass掉。而再考虑0的个数,因为很多个0和只有1个0效果是一样的,所以防止集合中0数量过多我们只考虑1个0。这样集合中最多只有5个元素。直接三重循环即可
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010; int a[N]; void solve() { int n; cin >> n; vector<int> v; set<int> s; int zheng = 0, fu = 0, zero = 0; for (int i = 1; i <= n; i ++ ) { cin >> a[i]; if(a[i] > 0) zheng++; if(a[i] < 0) fu++; if(a[i] == 0) zero++; } if(zheng > 2 || fu > 2) { cout << "NO" << endl; return; } for (int i = 1; i <= n; i ++ ) { if(a[i]) v.push_back(a[i]); s.insert(a[i]); } if(zero) v.push_back(0); for (int i = 0; i < v.size(); i ++ ) for (int j = i + 1; j < v.size(); j ++ ) for (int k = j + 1; k < v.size(); k ++ ) if(!s.count(v[i] + v[j] + v[k])) { cout << "NO" << endl; return; } cout << "YES" << endl; } int main() { int T; cin >> T; while(T -- ) { solve(); } return 0; }