Codeforces Round #803 (Div. 2)
这场真的巨思维,~~ 沙雕死了~~ 真的。。。把ABCD题解写了吧。
A. XOR Mixup
Solution
整一个无语住,直接输出任意一个就行,因为你要形成缺掉的那个数,n - 1 个数 ^ 后得等于剩下那个数。
Code
int n, a[N];
void solve()
{
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> a[i];
}
cout << a[1] << "\n";
}
B. Rising Sand
Solution
如果k >= 2对答案没有影响,k = 1的时候可以形成最大的答案(n - 1) / 2个。
Code
int n, k, a[N];
void solve()
{
cin >> n >> k;
for(int i = 1; i <= n; ++i) cin >> a[i];
if(k >= 2)
{
int cnt = 0;
for(int i = 2; i <= n - 1; ++i)
{
if(a[i] > a[i - 1] + a[i + 1] ) cnt++;
}
cout << cnt << "\n";
}
else
{
cout << (n - 1) / 2 << "\n";
}
}
C. 3SUM Closure
Solution
不能出现三个正数,或者三个负数以上,否则会出现一直累加,无法形成闭环。将出现的数,扔到一个数组里面跑暴力循环就行,因为有重复的数,扔的时候最多扔三次就行了,多了也没用,只会增加常数。
Code
int n, a[N];
void solve()
{
int x;
cin >> n;
map<int, int > mp;
int cnt0 = 0, cnt1 = 0;
for(int i = 1; i <= n; ++i)
{
cin >> a[i];
cnt0 += (a[i] < 0);
cnt1 += (a[i] > 0);
}
if(cnt0 >= 3 || cnt1 >= 3) cout << "NO\n";
else
{
vector<int> v;
for(int i = 1; i <= n; ++i)
{
if(mp[a[i]] <= 3)
{
v.push_back(a[i]);
mp[a[i]]++;
}
}
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(!mp[v[i] + v[j] + v[k]])
{
cout << "NO\n";
return;
}
}
}
}
cout << "YES\n";
}
}
D. Fixed Point Guessing
Solution
交互题,15次一眼二分,我们分成两个区间,看有无性质可以确定没改变的数在哪个区间,统计交换后[l, r]中的每一个数是否还在该区间的次数
1、区间内交换,次数+2
2、交换到另外一个区间次数不变
3、如果没有交换,则次数+1
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int query(int l, int r)
{
cout << "? " << l << " " << r << endl;
//fflush(stdout);
int x, cnt = 0;
for(int i = l; i <= r; ++i)
{
cin >> x;
if(x >= l && x <= r) cnt++;
}
return (cnt & 1);
}
void solve()
{
cin >> n;
int l = 1, r = n;
while(l < r)
{
int mid = (l + r) >> 1;
if(query(1, mid)) r = mid;
else l = mid + 1;
}
cout << "! " << l << endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0);
int t;
cin >> t;
for(int i = 0; i < t; ++i) solve();
return 0;
}

浙公网安备 33010602011771号