zoukankan      html  css  js  c++  java
  • 构造

    呜呜呜,蒟蒻完全不会构造怎么办

    [CF1495C]Garden of the Sun

    考场上刚了近1h,没搞出来,发现自己这个憨憨把两个空格子没有共同点看成没有共同边

    当然我这么菜就算看对也不一定会做就是了,但yssy好做很多

    若$m equiv 0(mod 3)$,则我们把$2,5,8,11,cdots,m-1$列全部变为空格子

    若$m otequiv 0(mod 3)$,则我们把$1,4,7,10,cdots,(m or m-1)$列全部变为空格子

    然后两个相邻的空列要记得连起来

    CF1450C2

    CF(gym102900B)

    [CF1364D]Ehab's Last Corollary

    jly答辩的时候,我完全没意识到自己居然做过,还是学弟提醒我我才知道我居然做过

    #include <bits/stdc++.h>
     
    #define Mod 998244353
     
    using namespace std;
     
     
    typedef long long ll;
     
    inline int read() {
        int out = 0;
        bool flag = false;
        register char cc = getchar();
        while (cc < '0' || cc > '9') {
            if (cc == '-') flag = true;
            cc = getchar();
        }
        while (cc >= '0' && cc <= '9') {
            out = (out << 3) + (out << 1) + (cc ^ 48);
            cc = getchar();
        }
        return flag ? -out : out;
    }
     
    inline void write(int x) {
        if (x < 0) putchar('-'), x = -x;
        if (x == 0) putchar('0');
        else {
            int num = 0;
            char cc[20];
            while (x) cc[++num] = x % 10 + 48, x /= 10;
            while (num) putchar(cc[num--]);
        }
        putchar(' ');
    }
     
    ll ksm(ll x, ll y) {
        ll res = 1;
        while (y) {
            if (y & 1) res = res * x % Mod;
            x = x * x % Mod;
            y >>= 1;
        }
        return res;
    }
    
    
    int n, m, k, head[400010], to[400010], nxt[400010], cnt = -1;
    
    void add(int u, int v) {
        to[++cnt] = v;
        nxt[cnt] = head[u];
        head[u] = cnt;
    } 
    
    
    int dep[400010], fa[400010], dfn[400010];
    
    vector<int> ans, x, y;
    
    void print() {
        if (ans.size() <= k) {
            puts("2");
            cout << ans.size() << endl;
            for (auto p : ans) write(p);
        }
        else {
            puts("1");
            for (int i = 0; i < (k + 1) / 2; i++) write(ans[i * 2]);
        }
    }
    
    void dfs(int u, int fae, int opt) {
        dep[u] = dep[fa[u]] + 1;
        dfn[dep[u]] = u;
        if (opt) x.push_back(u);
        else y.push_back(u);
        for (int i = head[u]; i != -1; i = nxt[i]) {
            if ((i ^ 1) == fae) continue;
            int v = to[i];
            if (dep[v]) {
                for (int j = dep[v]; j <= dep[u]; j++) ans.push_back(dfn[j]);
                print();
                exit(0);
            }
            fa[v] = u;
            dfs(v, i, opt ^ 1);
        }
    }
    
    int main() {
        n = read(), m = read(), k = read();
        memset(head, -1, sizeof(head));
        for (int i = 1; i <= m; i++) {
            int u = read(), v = read();
            add(u, v); add(v, u);
        }
        dfs(1, -1, 0);
        if (x.size() >= (k + 1) / 2) {
            puts("1");
            for (int i = 0; i < (k + 1) / 2; i++) write(x[i]);
        }
        else {
            puts("1");
            for (int i = 0; i < (k + 1) / 2; i++) write(y[i]);
        }
        return 0;
    }
    View Code

    「IOI2019」景点划分

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 1e5 + 10, M = 2e5 + 10;
    
    int n, m, a, b, c, A = 1, B = 2, C = 3;
    
    int head[N], to[M << 1], nxt[M << 1], cnt;
    
    void add_edge(int u, int v) {
        to[++cnt] = v, nxt[cnt] = head[u], head[u] = cnt;
    }
    
    vector<int> son[N]; bool vis[N]; int fa[N];
    
    void dfs(int u) {
        vis[u] = true;
        for (int i = head[u]; i; i = nxt[i]) {
            int v = to[i];
            if (vis[v]) continue;
            dfs(v), son[u].push_back(v), fa[v] = u;
        }
    }
    
    int sze[N], g, ans[N];
    
    void find(int u) {
        bool flag = true;
        sze[u] = 1;
        for (int i = son[u].size() - 1; i >= 0; i--) {
            int v = son[u][i];
            find(v), sze[u] += sze[v];
            if (sze[v] > (n / 2)) flag = false;
        }
        if (n - sze[u] > (n / 2)) flag = false;
        if (flag) g = u;
    }
    
    int t[N];
    
    void sign(int u, int p) {
        t[u] = p;
        for (int i = son[u].size() - 1; i >= 0; i--) {
            int v = son[u][i];
            sign(v, p);
        }
    }
    
    bool pd(int u) {
        for (int i = head[u]; i; i = nxt[i]) {
            if (!t[to[i]]) return true;
        }
        for (int i = son[u].size() - 1; i >= 0; i--) {
            int v = son[u][i];
            if (pd(v)) return true;
        }
        return false;
    }
    
    void go(int u, int p, int q) {
        if (ans[u] || t[u] != q) return ;
        if (p == A) ans[u] = (a > 0 ? A : -1), a--;
        if (p == B) ans[u] = (b > 0 ? B : -1), b--;
        for (int i = head[u]; i; i = nxt[i]) {
            int v = to[i];
            go(v, p, q);
        }
    }
    
    int main() {
        scanf("%d%d", &n, &m);
        scanf("%d%d%d", &a, &b, &c);
        if (a > b) swap(a, b), swap(A, B);
        if (a > c) swap(a, c), swap(A, C);
        if (b > c) swap(b, c), swap(B, C);
        for (int i = 1; i <= m; i++) {
            int u, v; scanf("%d%d", &u, &v); u++, v++;
            add_edge(u, v), add_edge(v, u);
        }
        dfs(1), find(1);
        for (int i = son[g].size() - 1; i >= 0; i--) {
            int v = son[g][i];
            if (sze[v] >= a) {
                sign(v, 1), go(v, A, 1), go(g, B, 0);
                for (int j = 1; j <= n; j++) {
                    if (ans[j] > 0) printf("%d ", ans[j]);
                    else printf("%d ", C);
                }
                return 0;
            }
        }
        int s = n - sze[g];
        //cout << s << endl;
        sign(g, 1);
        for (int i = son[g].size() - 1; i >= 0 && s < a; i--) {
            int v = son[g][i]; //cout << sze[v] << " ";
            if (!pd(v)) continue;
            sign(v, 0), s += sze[v];
        }
        if (s < a) {
            //cout << s << " " << a << endl;
            for (int i = 1; i <= n; i++) printf("0 ");
            putchar('
    ');
            return 0;
        }
        go(fa[g], A, 0), go(g, B, 1);
        for (int i = 1; i <= n; i++) {
            if (ans[i] > 0) printf("%d ", ans[i]);
            else printf("%d ", C);
        }
        return 0;
    }
    View Code

    CF(gym101221A)

    CF1470D

    移球游戏

  • 相关阅读:
    inotify事件监控
    NFS网络文件共享服务
    Rsync数据同步服务
    SSH连接原理及ssh-key讲解
    C语言I博客作业04
    C语言l博客作业03
    C语言I博客作业02
    定义一个计算字符串高度的方法
    字典转模型
    UIScrollView和UIPageControl
  • 原文地址:https://www.cnblogs.com/Urushibara-Ruka/p/14520142.html
Copyright © 2011-2022 走看看