Atcoder Beginner Contest 289

Contest Result

做出了 \(\texttt{A} \sim \texttt{F}\)\(\texttt{G}\) 题有点思路,但时间不够了。

\(\texttt{E}\) 题状态设计太慢,复杂度其实也没算明白,\(\texttt{F}\) 题大思路来的很快,但被 \(a=b \and c=d\) 的 Corner Case 创飞了。

Solution

A flip

#include<bits/stdc++.h>
using namespace std;

char s[1000000];

int main() {
    scanf("%s", s + 1);
    int n = strlen(s + 1);
    for(int i = 1; i <= n; i++) {
        if(s[i] == '0') putchar('1');
        else putchar('0');
    }
}

B V

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 100 + 7;

int N, M;
int a[MAXN];

vector <int> vec[MAXN];
int vis[MAXN];
int cnt;

void work(int x) {
    queue <int> Q;
    Q.push(x);
    vis[x] = x;
    while(Q.size()) {
        int y = Q.front();
        for(auto to : vec[y]) {
            if(vis[to]) continue;
            vis[to] = x;
            Q.push(to);
        }
        Q.pop();
    }
}
int main() {
    cin >> N >> M;
    for(int i = 1; i <= M; i++) {
        cin >> a[i];
        vec[a[i]].push_back(a[i] + 1);
        vec[a[i] + 1].push_back(a[i]);
    }
    for(int i = 1; i <= N; i++) {
        if(vis[i]) continue;
        work(i);
        for(int j = N; j >= 1; j--) {
            if(vis[j] != i) continue;
            ++cnt;
            printf("%d%c", j, " \n"[cnt == N]);
        }
    }
}

C Coverage

#include<bits/stdc++.h>
using namespace std;

int N, M;
int a[20];

int main() {
    cin >> N >> M;
    for(int i = 1; i <= M; i++) {
        int K; cin >> K;
        for(int j = 1; j <= K; j++) {
            int x; cin >> x;
            a[i] |= (1 << (x - 1));
        }
    }
    int ans = 0;
    for(int p = 0; p < (1 << M); p++) {
        int status = 0;
        for(int i = 1; i <= M; i++) {
            if(((p >> (i - 1)) & 1) == 0) continue;
            status |= a[i];
        }
        if(status == ((1 << N) - 1)) ++ans;
    }
    cout << ans << endl;
}

D Step Up Robot

#include<bits/stdc++.h>
using namespace std;

const int MAXW = 100000 + 7;

bool trap[MAXW], f[MAXW];
int N, M, a[20], K;

int main() {
    cin >> N;
    for(int i = 1; i <= N; i++) cin >> a[i];
    cin >> M;
    for(int i = 1, x; i <= M; i++) {
        cin >> x;
        trap[x] = true;
    }
    f[0] = true;
    cin >> K;
    for(int i = 1; i <= K; i++) {
        for(int j = 1; j <= N; j++) {
            if(a[j] > i) continue;
            f[i] |= f[i - a[j]];
        }
        if(trap[i]) f[i] = false;
    }
    if(f[K]) puts("Yes");
    else puts("No");
    return 0;
}

E Swap Places

#include<bits/stdc++.h>
using namespace std;

int T;
const int MAXN = 2000 + 7;
const int INF = 0x3f3f3f3f;
vector <int> vec[MAXN];
int N, M;
int f[MAXN][MAXN], c[MAXN];

void Reset(void) {
    for(int i = 1; i <= N; i++) {
        vec[i].clear();
    }
}

void Init(void) {
    scanf("%d%d", &N, &M);
    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= N; j++) f[i][j] = INF;
    }
    for(int i = 1; i <= N; i++) {
        scanf("%d", &c[i]);
    }
    for(int i = 1, x, y; i <= M; i++) {
        scanf("%d%d", &x, &y);
        vec[x].push_back(y);
        vec[y].push_back(x);
    }
}

void Work(void) {
    f[1][N] = 0;
    queue < pair<int, int> > Q;
    Q.push(make_pair(1, N));
    while(Q.size()) {
        int x = Q.front().first, y = Q.front().second;
        Q.pop();
        // if(x == N && y == 1) break;
        for(auto tox : vec[x]) {
            for(auto toy : vec[y]) {
                if(c[tox] == c[toy]) continue;
                if(f[tox][toy] != INF) continue;
                f[tox][toy] = f[x][y] + 1;
                Q.push(make_pair(tox, toy));
                // if(tox == N && toy == 1) break;
            }
        }
        if(f[N][1] != INF) break;
    }
    if(f[N][1] == INF) puts("-1");
    else printf("%d\n", f[N][1]);
}

int main() {
    scanf("%d", &T);
    while(T--) {
        Reset();
        Init();
        Work();
    }
}

F Teleporter Takahashi

#include<bits/stdc++.h>
using namespace std;

int sx, sy, tx, ty, a, b, c, d;

void ot(void) {

}

vector <int> xx, yy;

int main() {
    cin >> sx >> sy >> tx >> ty >> a >> b >> c >> d;
    // if(a == b || c == d) {
    //     ot();
    //     // return 0;
    // }
    int dx = tx - sx, dy = ty - sy;
    int mx = sx + tx, my = sy + ty;
    if(dx % 2 != 0 || dy % 2 != 0) {
        puts("No"); return 0;
    }

    if(a == b && c == d) {
        if(mx / 2 == a && my / 2 == c) {
            puts("Yes");
            printf("%d %d\n", a, c);
        }
        else puts("No");
        return 0;
    }
    //2x - sx, 2y - sy  odd & even not change
    if(dx != 0 && a == b) {
        if((sx + tx) / 2 != a) {
            puts("No"); return 0;
        }
        xx.push_back(a);
        yy.push_back(c);
        sx = 2 * a - sx, sy = 2 * c - sy;
        dx = tx - sx, dy = ty - sy;
    }
    if(dy != 0 && c == d) {
        if((sy + ty) / 2 != c) {
            puts("No"); return 0;
        }
        xx.push_back(a);
        yy.push_back(c);
        sx = 2 * a - sx, sy = 2 * c - sy;
        dx = tx - sx, dy = ty - sy;
    }
    puts("Yes");
    for(int i = 0; i < (int)xx.size(); i++) {
        printf("%d %d\n", xx[i], yy[i]);
    }
    if(dx > 0) {
        while(dx > 0) {
            printf("%d %d\n%d %d\n", a, c, a + 1, c);
            dx -= 2;
        }
    }
    else {
        while(dx < 0) {
            printf("%d %d\n%d %d\n", b, c, b - 1, c);
            dx += 2;
        }
    }
    if(dy > 0) {
        while(dy > 0) {
            printf("%d %d\n%d %d\n", a, c, a, c + 1);
            dy -= 2;
        }
    }
    else {
        while(dy < 0) {
            printf("%d %d\n%d %d\n", a, d, a, d - 1);
            dy += 2;
        }
    }
    return 0;
}
posted @ 2023-02-11 21:39  览遍千秋  阅读(240)  评论(0编辑  收藏  举报