Codeforces Ozon Tech Challenge 2020 (Div.1 + Div.2) A-D 题解

又上分了,好像打的还可以就会懒得补后面的题

A.Kuroni and the Gifts

sort一下,没什么好说的

B.Kuroni and Simple Strings

很容易(并非)可以看出最多只需要一次就可以了,举个例子假设你两次删除的分别是(())和 (),你会发现你只需要删除( ( ) ) ( ) 这几个,剩下的就一定不能再删了,如果)前面还有能配对的那一定就能一次删掉,所以只需要一次,从两端循环不停的找配对的就可以了

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
priority_queue < int, vector < int >, greater<int> > ans;
char s[1010];
int main() {
    scanf("%s", s);
    int len = strlen(s);
    int l = 0, r = len - 1;
    while (l < r) {
    //    printf("%d %d\n", l, r);
        while (s[l] != '(' && l < r && l < len)
            l++;
        while (s[r] != ')' && l < r && r > 0)
            r--;
        if (l >= r)
            break;
        ans.push(l); ans.push(r);
        l++, r--;
    }
    if (ans.empty())
        printf("0");
    else {
        puts("1");
        printf("%d\n", ans.size());
        while (!ans.empty()) {
            printf("%d ", ans.top() + 1);
            ans.pop();
        }
    }
    return 0;
}

 

C.Kuroni and Impossible Calculation

被C卡了半天(丢人),可以发现模很小,那么当n>m的时候,一定会存在ai 和 aj 使ai % m == aj % m,那这两个数相减就是0了,所以n>m,答案一定是0,那1000一下直接暴力就好了

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 2 * 1e5 + 10;
int a[N], b[N];
int maxn[N], minn[N], flag[N];
int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    sort(a, a + n);
    long long ans = 1;
    if (n > m + 10) {
        puts("0");
        return 0;
    }
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            ans = (1ll * ans * ((a[j] - a[i]) % m)) % m;
    printf("%lld", ans);
}

 

D.Kuroni and the Celebration

交互题?至少有两年没做过了,oi退役之后再也没见过交互题,没想到cf会出这种题,不过我随便水了一下没想到过了,思路就是先找到一个只连了一条边的节点,开始往上搜索,每次询问连着三个的两端两个,然后就能至少排除两个,所以可以在n/2的时间内完成,具体细节参考代码(我也不知道我怎么过的)

#include <cstdio>
#include <vector>
using namespace std;
const int N = 1010;
vector < int > e[N];
bool flag[N];
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        e[u].push_back(v); 
        e[v].push_back(u);
    }
    int u = 0;
    for (int i = 1; i <= n; i++)
        if (e[i].size() == 1)
            u = i;
    flag[u] = true;
    while (true) {
        int a = 0, b = 0;
        for (int i = 0; i < e[u].size(); i++)
            if (!flag[e[u][i]])
                a = e[u][i];
        if (a == 0) {
            printf("! %d", u);
            break;
        }
        flag[a] = true;
        for (int i = 0; i < e[u].size(); i++)
            if (!flag[e[u][i]])
                b = e[u][i];
        if (b == 0) {
            for (int i = 0; i < e[a].size(); i++)
                if (!flag[e[a][i]])
                    b = e[a][i];
            if (b == 0)
                printf("? %d %d\n", u, a);
            else
                printf("? %d %d\n", u, b);
            fflush(stdout); 
        }
        else {
            printf("? %d %d\n", a, b);
            fflush(stdout); 
        }
        flag[b] = true;
        scanf("%d", &u);
    }
    return 0;
}

 

posted @ 2020-03-04 15:53  cminus  阅读(135)  评论(0编辑  收藏  举报