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;
}
posted @ 2022-06-29 09:06  std&ice  阅读(70)  评论(0)    收藏  举报