Loading

Codeforces Round #803 (Div. 2) A - D

传送门

考试周也快结束了,想打一场 cf 找一找手感,结果惨不忍睹,大寄

刚好这场前 4 题都是思维题,直接卡死

A - XOR Mixup

这样构造出来的数组异或和一定为 0,说明每一个数都是答案

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define endl "\n"
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
int num[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        for(int i=0; i<n; i++)
            cin >> num[i];
        cout << num[0] << endl;
        
    }

    return 0;
}

B - Rising Sand

如果 \(k = 1\),则贪心地找答案即可

如果 \(k \geq 2\),则无论怎么修改都是没有用的,因为 \(a_i > a_{i-1} + a_{i+1}\)\(k\) 的修改一定会修改到相邻的,所以无效

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define endl "\n"
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
int num[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        int n, k;
        cin >> n >> k;
        for(int i=0; i<n; i++) cin >> num[i];
        int ans = 0;
        for(int i=1; i<n-1; i++)
            ans += (num[i] > num[i-1] + num[i+1]);
        if(k == 1) ans = (n - 1) / 2;
        cout << ans << endl;
    }
    return 0;
}

C - 3SUM Closure

如果存在 3 个或 3 个以上的正数或者负数,则必然不成立:可以直接选取三个正数或者三个负数

因此,直接判断,如果满足上述要求,则加入不大于 1 个 0,进行暴力求解即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
// #define endl "\n"
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        vector<int>num;
        int cnt = 0;
        for(int i=0; i<n; i++)
        {
            int x;
            cin >> x;
            if(x == 0) cnt++;
            else num.push_back(x);
        }
        int f = 1;
        if(num.size() >= 5) f = 0;
        else
        {
            cnt = min(cnt, 2);
            for(int i=0; i<cnt; i++) num.push_back(0);
            for(int i=0; i<num.size() && f; i++)
            {
                for(int j=i+1; j<num.size() && f; j++)
                {
                    for(int k=j+1; k<num.size() && f; k++)
                    {
                        int now = num[i] + num[j] + num[k];
                        int x = 0;
                        for(int u=0; u<num.size(); u++)
                        {
                            if(now == num[u])
                            {
                                x = 1;
                                break;
                            }
                        }
                        if(x == 0) f = 0;
                    }
                }
            }
        }
        
        if(f) cout << "yes" << endl;
        else cout << "no" << endl;
    }

    return 0;
}

D - Fixed Point Guessing

二分

考虑利用奇偶性

如果在一个区间 \([l,r]\) 内,若有一组数交换后,有一个数字在该区间,则说明另一个数也在该区间里

因此考虑对询问后给出的被交换数字 \(x\) 进行检查,如果 \(l \leq x \leq r\),则说明有两个数在这个区间内,cnt += 2

如果区间内全是被交换的数字,有 cnt 必然为偶数,否则 cnt 为奇数

根据上述的性质进行二分查询答案即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        int l = 1, r = n;
        while(l < r)
        {
            int mid = l + r >> 1;
            cout << "? " << l << " " << mid << endl;
            int cnt = 0;
            for(int i=l; i<=mid; i++)
            {
                int x;
                cin >> x;
                if(x >= l && x <= mid) cnt++;
            }
            if(cnt % 2 == 0) l = mid + 1;
            else r = mid;
        }
        cout << "! " << l << endl;
    }
    return 0;
}
posted @ 2022-07-01 23:55  dgsvygd  阅读(59)  评论(0编辑  收藏  举报