• 【AtCoder】ARC078


    C - Splitting Pile

    枚举从哪里开始分的即可

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define space putchar(' ')
    #define enter putchar('
    ')
    #define MAXN 200005
    #define eps 1e-12
    //#define ivorysi
    using namespace std;
    typedef long long int64;
    typedef unsigned int u32;
    typedef double db;
    template<class T>
    void read(T &res) {
        res = 0;T f = 1;char c = getchar();
        while(c < '0' || c > '9') {
            if(c == '-') f = -1;
            c = getchar();
        }
        while(c >= '0' && c <= '9') {
            res = res * 10 + c - '0';
            c = getchar();
        }
        res *= f;
    }
    template<class T>
    void out(T x) {
        if(x < 0) {x = -x;putchar('-');}
        if(x >= 10) {
            out(x / 10);
        }
        putchar('0' + x % 10);
    }
    int N;
    int64 s[MAXN];
    void Solve() {
        read(N);
        for(int i = 1 ; i <= N ; ++i) read(s[i]);
        for(int i = 1 ; i <= N ; ++i) s[i] += s[i - 1];
        int64 ans = abs(s[N] - 2 * s[1]);
        for(int i = 1 ; i < N ; ++i) {
            ans = min(ans,abs(s[N] - 2 * s[i]));
        }
        out(ans);enter;
    }
    int main() {
    #ifdef ivorysi
    	freopen("f1.in","r",stdin);
    #endif
        Solve();
    }
    

    D - Fennec VS. Snuke

    看树上这段链从Fennec开始数第K / 2和K / 2+1的边断开之后,分成的两个子树哪个结点多
    Fennec只有当节点数大于Snuke才会胜利

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define space putchar(' ')
    #define enter putchar('
    ')
    #define MAXN 100005
    #define eps 1e-12
    //#define ivorysi
    using namespace std;
    typedef long long int64;
    typedef unsigned int u32;
    typedef double db;
    template<class T>
    void read(T &res) {
        res = 0;T f = 1;char c = getchar();
        while(c < '0' || c > '9') {
            if(c == '-') f = -1;
            c = getchar();
        }
        while(c >= '0' && c <= '9') {
            res = res * 10 + c - '0';
            c = getchar();
        }
        res *= f;
    }
    template<class T>
    void out(T x) {
        if(x < 0) {x = -x;putchar('-');}
        if(x >= 10) {
            out(x / 10);
        }
        putchar('0' + x % 10);
    }
    struct node {
        int to,next;
    }E[MAXN * 2];
    int head[MAXN],sumE,N;
    int dep[MAXN],fa[MAXN],siz[MAXN];
    void add(int u,int v) {
        E[++sumE].to = v;
        E[sumE].next = head[u];
        head[u] = sumE;
    }
    void dfs(int u) {
        dep[u] = dep[fa[u]] + 1;
        siz[u] = 1;
        for(int i = head[u] ; i ; i = E[i].next) {
            int v = E[i].to;
            if(v != fa[u]) {
                fa[v] = u;
    
                dfs(v);
                siz[u] += siz[v];
            }
        }
    }
    void Solve() {
        read(N);
        int u,v;
        for(int i = 1 ; i < N ; ++i) {
            read(u);read(v);
            add(u,v);add(v,u);
        }
        dfs(1);
        int t = dep[N] / 2 - 1;
        u = N;
        while(t--) {u = fa[u];}
        if(N - siz[u] > siz[u]) puts("Fennec");
        else puts("Snuke");
    }
    int main() {
    #ifdef ivorysi
    	freopen("f1.in","r",stdin);
    #endif
        Solve();
    }
    

    E - Awkward Response

    如果不为1后面接的只有0的形式,那么问出第一个(10^k)为N则证明数字有k位,然后可以通过二分,判断中间值是否小于当前值可以把mid扩大10倍,这样可以知道中间值的字典序是否大于还是小于n,因为长度相等字典序顺序就是大小顺序,所以可行
    如果是1后面接的只有0,那么问出第一个合法的k个9,这个数就是(10^{k - 1})

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define space putchar(' ')
    #define enter putchar('
    ')
    #define MAXN 100005
    #define eps 1e-12
    //#define ivorysi
    using namespace std;
    typedef long long int64;
    typedef unsigned int u32;
    typedef double db;
    template<class T>
    void read(T &res) {
        res = 0;T f = 1;char c = getchar();
        while(c < '0' || c > '9') {
            if(c == '-') f = -1;
            c = getchar();
        }
        while(c >= '0' && c <= '9') {
            res = res * 10 + c - '0';
            c = getchar();
        }
        res *= f;
    }
    template<class T>
    void out(T x) {
        if(x < 0) {x = -x;putchar('-');}
        if(x >= 10) {
            out(x / 10);
        }
        putchar('0' + x % 10);
    }
    bool Query(int64 t) {
        putchar('?');space;out(t);enter;fflush(stdout);
        char s[5];scanf("%s",s);
        return s[0] == 'Y';
    }
    void Solve() {
        int64 v = 1;
        bool f = 0;
        for(int i = 1 ; i <= 10 ; ++i) {
            if(!Query(v)) {f = 1;v /= 10;break;}
            v *= 10;
        }
        if(!f) {
            v = 1;
            for(int i = 1 ; i <= 10 ; ++i) {
                if(Query(v * 10 - 1)) {putchar('!');space;out(v);enter;return;}
                v *= 10;
            }
        }
        int64 L = v,R = min(v * 10 - 1,(int64)1e9);
        while(L < R) {
            int64 mid = (L + R + 1) >> 1;
            if(!Query(mid * 10)) L = mid;
            else R = mid - 1;
        }
        putchar('!');space;out(L + 1);enter;
    }
    int main() {
    #ifdef ivorysi
    	freopen("f1.in","r",stdin);
    #endif
        Solve();
    }
    

    F - Mole and Abandoned Mine

    为啥算完2s跑出来不到0.1s???
    atc扩充我的想象力系列???
    这个就是把这唯一一条路径挑出来,肯定是希望这条路径和路径上每个点上挂的一个联通块价值最大,然后用总路径价值减掉
    然后dp[i][S]表示当前走到第i个点,已经扩充的点集是S,就是每次路径往下走一个点,或者扩充一个包括i其余的点不在S中的点集即可,复杂度(O(N imes 3^{N}))
    然后我过于智障写错了好几遍,cao

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define space putchar(' ')
    #define enter putchar('
    ')
    #define MAXN 10005
    #define eps 1e-12
    //#define ivorysi
    using namespace std;
    typedef long long int64;
    typedef unsigned int u32;
    typedef double db;
    template<class T>
    void read(T &res) {
        res = 0;T f = 1;char c = getchar();
        while(c < '0' || c > '9') {
            if(c == '-') f = -1;
            c = getchar();
        }
        while(c >= '0' && c <= '9') {
            res = res * 10 + c - '0';
            c = getchar();
        }
        res *= f;
    }
    template<class T>
    void out(T x) {
        if(x < 0) {x = -x;putchar('-');}
        if(x >= 10) {
            out(x / 10);
        }
        putchar('0' + x % 10);
    }
    int N,M;
    struct node {
        int to,next,val;
    }E[1005];
    int sumE,head[25],pos[(1 << 15) + 5];
    int f[16][(1 << 15) + 5],h[16][(1 << 15) + 5],sum[(1 << 15) + 5];
    void add(int u,int v,int c) {
        E[++sumE].to = v;
        E[sumE].next = head[u];
        E[sumE].val = c;
        head[u] = sumE;
    }
    inline int lowbit(int x) {
        return x & (-x);
    }
    void Init() {
        read(N);read(M);
        int u,v,c;
        for(int i = 1 ; i <= M ; ++i) {
            read(u);read(v);read(c);
            add(u,v,c);add(v,u,c);
            h[u][1 << v - 1] = c;
            h[v][1 << u - 1] = c;
        }
        for(int i = 1 ; i <= N ; ++i) {
            for(int j = 1 ; j < (1 << N) ; ++j) {
                if(lowbit(j) == j) continue;
                h[i][j] = h[i][j - lowbit(j)] + h[i][lowbit(j)];
            }
        }
        for(int i = 1 ; i <= N ; ++i) pos[(1 << i - 1)] = i;
        for(int i = 1 ; i < (1 << N) ; ++i) {
            sum[i] = sum[i - lowbit(i)] + h[pos[lowbit(i)]][i - lowbit(i)];
        }
    }
    void Solve() {
        for(int i = 1 ; i <= N ; ++i) {
            for(int j = 0 ; j < (1 << N) ; ++j) {
                f[i][j] = -1e9;
            }
        }
        f[1][1] = 0;
    
        for(int j = 0 ; j < (1 << N - 1) ; ++j) {
            for(int i = 1 ; i <= N ; ++i) {
                int S = j << 1 | 1;
                if(!(S & (1 << i - 1))) continue;
                int L = S ^ (1 << i - 1);
                for(int T = L; T ; T = (T - 1) & L) {
                    if(f[i][S ^ T] >= 0)
                        f[i][S] = max(f[i][S],f[i][S ^ T] + sum[T ^ (1 << i - 1)]);
                }
                if(f[i][S] >= 0) {
                    for(int k = head[i] ; k ; k = E[k].next) {
                        int v = E[k].to;
                        if(!(S & (1 << v - 1))) {
                            f[v][S ^ (1 << v - 1)] = max(f[v][S ^ (1 << v - 1)],f[i][S] + E[k].val);
                        }
                    }
                }
            }
        }
        out(sum[(1 << N) - 1] - f[N][(1 << N) - 1]);enter;
    }
    int main() {
    #ifdef ivorysi
    	freopen("f1.in","r",stdin);
    #endif
        Init();
        Solve();
    }
    
  • 相关阅读:
    (兼容)IE9 以下版本浏览器兼容HTML5的方法
    使用ORACLE 中ROWNUM方法实现数据库分批获取
    更新上传到github的代码
    Spring-AOP
    C++结构体的应用_YCOJ
    基本类型数据封装
    sessionStorage 封装
    Vue国际化四 -- 本地缓存
    Vue国际化三【在下拉框中使用】
    Vue国际化二 【在表格中的使用】
  • 原文地址:https://www.cnblogs.com/ivorysi/p/10507718.html
Copyright © 2020-2023  润新知