0
点赞
收藏
分享

微信扫一扫

whp 6 - Codeforces Round #767 (Div. 2)

ZMXQQ233 2022-01-23 阅读 66

Codeforces Round #767 (Div. 2)

Codeforces Round #767 (Div. 2)

A. Download More RAM

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll N = 110;

struct node {
    ll a, b;
};

node mp[N];

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    ll T;
    cin >> T;
    while (T--) {
        ll n, k;
        cin >> n >> k;
        for (ll i = 1; i <= n; ++i) {
            cin >> mp[i].a;
        }
        for (ll i = 1; i <= n; ++i) {
            cin >> mp[i].b;
        }
        sort(mp + 1, mp + n + 1, [&](node x, node y) {
            return x.a < y.a;
        });
        for (ll i = 1; i <= n; ++i) {
            if (mp[i].a <= k) {
                k += mp[i].b;
            }
        }
        cout << k << endl;
    }
    return 0;
}

B. GCD Arrays

题意:给出l和r表示有从l到r这些数,一次操作可以选择两个数取出然后将他们的乘积放回去,问能否在k次操作内使得剩余数的gcd大于1

使得gcd包含2将所有的奇数和任意一个偶数合并的操作数为奇数的个数

判断k是否大于等于奇数的个数

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;


signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    ll T;
    cin >> T;
    while (T--) {
        int l, r, k;
        cin >> l >> r >> k;
        int num = (r - l + 1)/ 2;
        if((l & 1) && (r & 1)) num ++;
        if(k >= num)  {
            cout << "YES" << endl;
            continue;
        }
        if(r == l && r > 1) {
            cout << "YES" << endl;
            continue;
        }
        cout <<"NO" << endl;

    }
    return 0;
}

C. Meximum Array

题意:给一个数组a,每次可以从头选择若干连续的数字从a中删去,将他们的mex值加入到b的末尾,要求使得b数组尽可能的大,输出b数组

统计所有数字出现的次数和位置(这里使用了队列因为我觉得删的方便

对于每个mex将数字出现的位置维护

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 2e5 + 10;
int a[N];
queue<int> g[N];
vector<int> res;

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    ll T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        res.clear();
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
            g[a[i]].push(i);
        }
        int pos = 0;
        while(pos < n) {
            for (int i = 0; i <= n; ++i) {
                if (g[i].empty()) {
                    res.push_back(i);
                    break;
                }
                pos = max(pos, g[i].front());
            }
            if(res[res.size() - 1] == 0) {
                pos ++;
                continue;
            }
            for(int i=0; i < res[res.size() - 1]; ++ i) {
                while(g[i].size() && g[i].front() <= pos) g[i].pop();
            }
        }

        cout << res.size() << endl;
        for(auto tmp : res) cout << tmp <<" ";
        cout << endl;

        //init
        for (int i = 0; i <= n; ++i) {
            while(!g[i].empty()) g[i].pop();
        }
    }
    return 0;
}

D. Peculiar Movie Preferences

题意:有n个字符串(长度不超过3),要求保留至少一个,使得他们连接起来形成回文串

如果一个串本身就是回文,直接留它就行,除去该情况之后

不然只要是两个拼起来是回文就行,即

(AB)(BA)

(ABC)(BA)

(AB)(CBA)

(ABC)(CBA)

对这些情况直接进行判断就行,对于BA和CBA可以构造出AB和ABC等,用set维护,剩下的一个ABC在前BA在后的额外倒过来扫一次

(至于为什么不用判别的不会证明但好像就是不用判,

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

set<string> st;
string a[N];

inline bool check(string s) {
    if (s.size() == 1) return 1;
    if (s.size() == 2)
        return (s[0] == s[1]);
    if (s.size() == 3)
        return (s[0] == s[2]);
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        st.clear();
        bool flag = 0;
        for (int i = 1; i <= n; ++i) {
            string s;
            cin >> s;
            a[i] = s;
            if (check(s)) flag = 1;
            if (s.size() == 2) {
                string t = "";
                t = t + s[1] ;
                t = t + s[0];
                if (st.count(t)) flag = 1;
            }
            if (s.size() == 3) {
                string t = "";
                t = t + s[2];
                t = t + s[1];
                if (st.count(t)) flag = 1;
                t = t + s[0];
                if (st.count(t)) flag = 1;
            }
            st.insert(s);
        }
        if (flag) {
            cout << "YES" << endl;
            continue;
        }

        st.clear();
        for (int i = n; i >= 1; --i) {
            string s = a[i];
            if (s.size() == 3) {
                string t = "";
                t = t+ s[1];
                t = t + s[0];
                if (st.count(t)) {
                    flag = 1;
                    break;
                }
            }
            st.insert(s);
        }
        if (flag) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
}

E. Grid Xor

题意: n × n n \times n n×n 的格子里每个格子有一个数,现在告诉每个格子周围格子的异或和,问整个格子的总异或和是多少

直接转换成翻格子游戏(黑变白-白变黑那个)

相邻两个格子可以凑成六边形,然后六边形可以无缝拼接,只要再处理一下边角就行

在这里插入图片描述

照常谢谢hoshimi同学,明天补代码,眠了

举报

相关推荐

0 条评论