首页 > 其他分享 >Educational Codeforces Round 169 (Rated for Div. 2)

Educational Codeforces Round 169 (Rated for Div. 2)

时间:2024-08-29 16:47:44浏览次数:9  
标签:Educational Rated const int res Codeforces i64 return using

A. Closest Point

有解的情况,当且仅当只有两个点且不相邻是,把新加入的点放在中间。

#include<bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const i32 inf = INT_MAX / 2;
const i64 INF = LLONG_MAX / 2;

void solve() {
    int n;
    cin >> n;
    vi a(n);
    for (auto &i: a) cin >> i;
    if (n == 2 and a[0] + 1 != a[1]) cout << "YES\n";
    else cout << "NO\n";
    return;
}


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

B. Game with Doors

对于重合的部分,是必须全部都分开,能够和重合部分联通的部分也要加一扇门分开。

如果完全没有重合的部分,在中间加一个门即可。

#include<bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const i32 inf = INT_MAX / 2;
const i64 INF = LLONG_MAX / 2;

void solve() {
    int l, r, L, R;
    cin >> l >> r >> L >> R;
    int a = max(l, L), b = min(r, R);
    if (b < a) cout << "1\n";
    else {
        int res = b - a;
        if (l < a) res++;
        if (L < a) res++;
        if (r > b) res++;
        if (R > b) res++;
        cout << res << "\n";
    }


    return;
}


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

C. Splitting Items

我们可以从大到小排序,这样的话,两个人就是轮流拿,后手在保证不产生逆序对的情况下,尽可能多的给自己加就好了。

#include<bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const i32 inf = INT_MAX / 2;
const i64 INF = LLONG_MAX / 2;

void solve() {
    int n, k;
    cin >> n >> k;
    vi a(n);
    for (auto &i: a) cin >> i;
    ranges::sort(a, greater<int>());
    for (int i = 1, x; i < n and k > 0; i += 2) {
        x = min(k, a[i - 1] - a[i]);
        a[i] += x, k -= x;
    }
    vi cnt(2);
    for (int i = 0; i < n; i++)
        cnt[i & 1] += a[i];
    cout << cnt[0] - cnt[1] << "\n";
    return;
}


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

D. Colored Portals

如果两个城市有相同的颜色,一定可以一步直达。否则的话,最多经过一个点中转一定可以拿到。

#include<bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

//#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const i32 inf = INT_MAX / 2;
const i64 INF = LLONG_MAX / 2;

int sgn(char c) {
    if (c == 'B') return 0;
    if (c == 'G') return 1;
    if (c == 'R') return 2;
    if (c == 'Y') return 3;
}

void solve() {
    int n, q;
    cin >> n >> q;

    vector<array<int, 2>> a(n);
    for (string s; auto &[x, y]: a) {
        cin >> s;
        x = sgn(s[0]), y = sgn(s[1]);
    }

    vector cnt(4, vector<vi>(4));
    for (int i = 0; i < n; i++) {
        const auto &[x, y] = a[i];
        cnt[x][y].push_back(i);
    }


    for (int st, ed, res; q; q--) {
        cin >> st >> ed, res = inf, st--, ed--;
        if (st > ed) swap(st, ed);
        for (auto i: a[st])
            for (auto j: a[ed]) {
                if (i == j) res = min(res, ed - st);
                else {
                    int x = i, y = j;
                    if (x > y) swap(x, y);
                    auto it = ranges::lower_bound(cnt[x][y], st);
                    if (it != cnt[x][y].end()) {
                        res = min(res, abs(st - *it) + abs(ed - *it));
                    }
                    if (it != cnt[x][y].begin()) {
                        it = prev(it);
                        res = min(res, abs(st - *it) + abs(ed - *it));
                    }
                }
            }
        if (res == inf) cout << "-1\n";
        else cout << res << "\n";
    }
    return;
}


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

E. Not a Nim Problem

这题可以用SG函数来分析,这个题目和Nim博弈还是非常接近的。

这类游戏首先需要打表,看看出SG函数的规律。

首先一个比较显然的是所有偶数的SG都是\(0\),其次\(SG[1] = 1\)。

对于奇数的情况,如果质数\(SG\)函数就是他是第几个质数。如果不是质数,如果\(x\)的最小奇质因子是\(y\),则\(SG[x] = SG[y]\)

#include<bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

//#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const i32 inf = INT_MAX / 2;
const i64 INF = LLONG_MAX / 2;

const int N = 1e7;
vi prime;
array<int, N + 1> sg, vis;

void init() {
    sg[0] = 0, sg[1] = 1;
    for (int i = 2; i <= N; i++) {
        if (i % 2 == 0) sg[i] = 0;
        if (vis[i] == 0) {
            prime.push_back(i), sg[i] = prime.size();
            if (i == 2) sg[i] = 0;
        }
        for (auto j: prime) {
            if (i * j > N) break;
            vis[i * j] = 1;
            if ((i * j) % 2 == 1) sg[i * j] = sg[j];
            if (i % j == 0) break;
        }
    }
    return;
}

void solve() {
    int n;
    cin >> n;

    int res = 0;
    for (int i = 1, x; i <= n; i++)
        cin >> x, res ^= sg[x];
    if (res != 0) cout << "Alice\n";
    else cout << "Bob\n";
    return;
}


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    init();
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

标签:Educational,Rated,const,int,res,Codeforces,i64,return,using
From: https://www.cnblogs.com/PHarr/p/18386679

相关文章

  • codeforces做题记录(1942D,1938J,1934D1,1933F)
    1942D.LearningtoPaint题目大意:给定一行白格子,可以将任意的格子染成黑色,最终形成多个黑色的连续段,对每个连续段[i,j]有一个权重(题目给定),为aij,每个染色方案的权值就是所有连续段的权值的和。要求所有染色方案中前k大的权值。注意事项:权重aij的范围是[-1e6,1e6],格子个数n<=10......
  • Codeforces Round 966 (Div. 3)
    A.PrimaryTaskif-else语句练习,判断前两个字符是否为"10",并判断之后的字符是否大于1点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglong#definepiipair<int,int>intread(){intx=0,f=0;ch......
  • Educational Codeforces Round 169 (Rated for Div. 2)
    A.ClosestPoint两个数时只要不相邻就有解,超过两个数无解点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglong#definepiipair<int,int>intread(){intx=0,f=0;charc=getchar();whi......
  • Codeforces Round 968 (Div. 2)
    题目链接:CodeforcesRound968(Div.2)-Codeforces总结:C题想到了,但是写成shi了,出得有点慢。A.TurtleandGoodStringtag:签到Solution:直接判断第一个字符是否与最后一个字符相等即可。voidsolve(){cin>>n;strings;cin>>s;if(s[0]==s[n-1]......
  • Codeforces Round 968 (Div. 2)
    题目链接:CodeforcesRound968(Div.2)-Codeforces总结:C题想到了,但是写成shi了,出得有点慢。A.TurtleandGoodStringtag:签到Solution:直接判断第一个字符是否与最后一个字符相等即可。voidsolve(){cin>>n;strings;cin>>s;if(s[0]==s[......
  • Codeforces Round 967 (Div. 2)
    题目链接:CodeforcesRound967(Div.2)-Codeforces总结:B题没测试就交wa一发,C题一直没想到怎么回溯,哎。A.MakeAllEqualtag:签到Solution:找到相同元素的最大值,将其它所有元素删去。voidsolve(){cin>>n;vector<int>a(n);map<int,int>mp;intans......
  • Codeforces Round 962 (Div. 3)
    A.Legs若只判断题,根据模4意义下分类即可。B.Scale模拟题,缩小同值矩阵即可。C.Sort对每个字母求前缀数量和,答案就是两端点的差。constintN=2e5+5;intT,n,q;chara[N],b[N];intc[N][26],d[N][26];signedmain(void){ for(read(T);T;T--){ read(......
  • Codeforces Round 968 (Div. 2)
    A.TurtleandGoodStrings题意:确定是否存在一种方案使得\(s=t_1+t_2+\cdots+t_m\),满足\(m>1\)且任意\(i<j\),\(t_i\)的第一个字母不等于\(t_j\)的最后一个字母。\(s_1\)和\(s_n\)一定不属于一个子串,因此\(s_1\nes_n\)是条件非法的必要条件。那么反......
  • Codeforces Round 968 (Div. 2)
    A.TurtleandGoodStrings思路:题意大致为把一个字符串分成若干段,要求每两段,前一段的首字符不能等于后的一段的尾字符,给你一个字符串,能不能构造出合法方案。观察到,分的段数越小,越有助于我们判断。所以,不妨分成两段,问题转化为判断首尾字符是否相等。代码:#include<bits/stdc++.......
  • Codeforces Round 968 (Div. 2)
    良心出题人给了中文题解!!!A.TurtleandGoodStrings长度为\(n\)的字符串至少分成两段,使\(\foralli<j\),第\(i\)段的首字符不等于第\(j\)段的尾字符第一个字符一定作为首字符,最后一个字符一定作为尾字符,只要判断这两个字符是否相等即可相等的话一定无解,不相等一定有......