• ACM-ICPC 2018 徐州赛区网络预赛


    A. Hard to prepare

    #include <bits/stdc++.h>
    using namespace std;
    const int MOD = 1e9+7;
    long long bit[1000010];
    long long f[1000010];
    
    int main() {
        int T;
        int n,k;
        bit[0] = 1;
        for (int i = 1; i <= 1000000; i++) {
            bit[i] = 2*bit[i-1]%MOD;
        }
        scanf("%d", &T);
        while (T--) {
            scanf("%d%d", &n, &k);
            f[1] = bit[k];
            long long t1 = (bit[k]-1+MOD)%MOD;
            long long t2 = (bit[k]-2+MOD)%MOD;
            f[2] = f[1]*t1%MOD;
            for (int i = 3; i <= n; i++) {
                f[i] = (f[i-2]*t1%MOD+(f[i-1]-f[1])*t2%MOD)%MOD;
                f[i] = (f[i] + MOD)%MOD;
            }
            printf("%d
    ", (int)f[n]);
        }
        return 0;
    }
    View Code

     B. BE, GE or NE

    #include <bits/stdc++.h>
    using namespace std;
    
    int n;
    int dp[1010][210];
    int a[1010][3];
    const int INF = 0x3f3f3f3f;
    
    int gao(int i, int now) {
        if (i >= n) return now-100;
        if (dp[i][now] != INF) {
            return dp[i][now];
        }
        if (i%2 == 0) {
            int ans = -100;
            int tmp = now-100;
            if (a[i][0] > 0) {
                int nn = min(tmp+a[i][0], 100);
                ans = max(ans, gao(i+1, nn+100));
            }
            if (a[i][1] > 0) {
                int nn = max(tmp-a[i][1], -100);
                ans = max(ans, gao(i+1, nn+100));
            }
            if (a[i][2] > 0) {
                ans = max(ans, gao(i+1, -tmp+100));
            }
            dp[i][now] = ans;
            return ans;
        } else {
            int ans = 100;
            int tmp = now-100;
            if (a[i][0] > 0) {
                int nn = min(tmp+a[i][0], 100);
                ans = min(ans, gao(i+1, nn+100));
            }
            if (a[i][1] > 0) {
                int nn = max(tmp-a[i][1], -100);
                ans = min(ans, gao(i+1, nn+100));
            }
            if (a[i][2] > 0) {
                ans = min(ans, gao(i+1, -tmp+100));
            }
            dp[i][now] = ans;
            return ans;
        }
    }
    
    int main() {
        int m,k,l;
        while(scanf("%d%d%d%d", &n, &m, &k, &l) == 4) {
            for (int i = 0; i < n; i++) {
                scanf("%d%d%d", &a[i][0], &a[i][1], &a[i][2]);
            }
            for (int i = 0; i <= n; i++)
                for (int j = 0; j <= 200; j++)
                    dp[i][j] = INF;
            int ans = gao(0, m+100);
            if (ans >= k)puts("Good Ending");
            else if(ans <= l) puts("Bad Ending");
            else puts("Normal Ending");
        }
        return 0;
    }
    View Code

     C. Cacti Lottery

    #include <bits/stdc++.h>
    using namespace std;
    
    int getScore(int s) {
        switch(s) {
            case 6: return 10000;
            case 7: return 36;
            case 8: return 720;
            case 9: return 360;
            case 10: return 80;
            case 11: return 252;
            case 12: return 108;
            case 13: return 72;
            case 14: return 54;
            case 15: return 180;
            case 16: return 72;
            case 17: return 180;
            case 18: return 119;
            case 19: return 36;
            case 20: return 360;
            case 21: return 1080;
            case 22: return 144;
            case 23: return 1800;
            case 24: return 3600;
        }
    }
    
    char mp[10][10];
    
    int a[3][3];
    
    double sum;
    double num;
    
    long long cnt = 0;
    double r[3];
    double c[3];
    double dd[2];
    
    void gao(bool used[], int x, int y) {
        /*
        if (x >= 3) {
        printf("*** x %d y %d
    ",x, y);
        for (int i = 1; i <= 9; i++)
            printf("%d ", used[i]);
        printf("
    ");
        for(int i = 0;  i < 3; i++) {
            for(int j = 0;j < 3; j++)
                printf("%d ", a[i][j]);
            printf("
    ");
        }
        }
        */
    
        if (x >= 3) {
            for (int i = 0; i < 3; i++) {
                int tmp = 0;
                for (int j = 0; j < 3; j++)
                    tmp += a[i][j];
                r[i] += getScore(tmp);
            }
            for (int j = 0; j < 3; j++) {
                int tmp = 0;
                for (int i = 0; i < 3; i++) {
                    tmp += a[i][j];
                }
                c[j] += getScore(tmp);
            }
            dd[0] += getScore(a[0][0] + a[1][1] + a[2][2]);
            dd[1] += getScore(a[2][0] + a[1][1] + a[0][2]);
            cnt++;
            return;
        }
        int nx = x;
        int ny = y+1;
        if (ny >= 3) {
            ny = 0;
            nx++;
        }
        if (mp[x][y] != '#') {
            gao(used, nx, ny);
        } else {
            for (int i = 1; i <= 9; i++) {
                if (!used[i]) {
                    used[i] = true;
                    a[x][y] = i;
                    gao(used, nx, ny);
                    a[x][y] = 0;
                    used[i] = false;
                }
            }
        }
    }
    
    void dfs(bool used[], int x, int y) {
        /*
        if (x >= 3) {
        printf("x %d y %d
    ",x, y);
        for (int i = 1; i <= 9; i++)
            printf("%d ", used[i]);
        printf("
    ");
        for(int i = 0;  i < 3; i++) {
            for(int j = 0;j < 3; j++)
                printf("%d ", a[i][j]);
            printf("
    ");
        }
        }
        */
        if (x >= 3) {
            cnt = 0;
            for (int i = 0; i < 3; i++) {
                r[i] = 0;
                c[i] = 0;
            }
            dd[0] = 0;
            dd[1] = 0;
            gao(used, 0, 0);
            double tmp = 0;
            for (int i = 0; i < 3; i++) {
                tmp = max(tmp, r[i]);
                tmp = max(tmp, c[i]);
            }
            tmp = max(tmp, dd[0]);
            tmp = max(tmp, dd[1]);
            sum += tmp/cnt;
            num += 1;
            return;
        }
        int nx = x;
        int ny = y+1;
        if (ny >= 3) {
            nx++;
            ny = 0;
        }
        if (mp[x][y] != '*') {
            dfs(used, nx, ny);
        } else {
            for (int i = 1; i <= 9; i++) {
                if (!used[i]) {
                    used[i] = true;
                    a[x][y] = i;
                    dfs(used, nx, ny);
                    a[x][y] = 0;
                    used[i] = false;
                }
            }
        }
    }
    
    int main() {
        int T;
        scanf("%d", &T);
        while (T--) {
            for (int i = 0; i < 3; i++)
                scanf("%s", mp[i]);
            sum = 0;
            num = 0;
            bool used[10];
            memset(used, false, sizeof(used));
            memset(a, 0, sizeof(a));
            for(int i = 0; i < 3; i++)
                for (int j = 0; j < 3; j++) {
                    if (mp[i][j] >= '1' && mp[i][j] <= '9') {
                        used[mp[i][j] -'0'] = true;
                        a[i][j] = mp[i][j]-'0';
                    }
                }
            dfs(used, 0, 0);
            printf("%.10f
    ", sum/num);
        }
        return 0;
    }
    View Code

    D. Easy Math

    E. End Fantasy VIX

    F. Features Track

    #include<iostream>
    #include<string>
    #include<map>
    #include<vector>
    #include<set>;
    using namespace std;
    typedef long long ll;
    const int inf = 0x3f3f3f3f;
    const int maxn = 1e6 + 1;
    
    int t;
    int n, m;
    pair<int,int>s;
    map<pair<int, int>, int>sum;
    map<pair<int, int>, int>flag;
    set<pair<int,int> >v;
    
    int main()
    {
        scanf("%d", &t);
        while(t--)
        {
            int ans = 0;
            v.clear();
            sum.clear();
            scanf("%d", &n);
            while(n--)
            {
                flag.clear();
                scanf("%d", &m);
                if(m == 0)
                {
                    v.clear();
                    sum.clear();
                }
                for(int i = 0; i < m; i++)
                {
                    int a, b;
                    scanf("%d %d", &a, &b);
                    s.first = a;
                    s.second = b;
                    if(!flag[s])
                        sum[s]++;
                    flag[s] = 1;
                    v.insert(s);
                    ans = max(ans, sum[s]);
                }
                pair<int, int> cnt[110000];
                int d = 0;
                for(set<pair<int,int> >::iterator it = v.begin();it != v.end();it++)
                {
                    if(flag[*it] == 0)
                        cnt[d++] = *it;
                }
                for(int i = 0; i < d; i++)
                {
                    v.erase(cnt[i]);
                    sum[cnt[i]] = 0;
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code

    G. Trace

    #include <bits/stdc++.h>
    using namespace std;
    
    long long gao(vector<int> vec) {
        int sz = vec.size();
        set<int>st;
        long long ans = 0;
        for (int i = sz-1; i >= 0; i--) {
            set<int>::iterator it = st.lower_bound(vec[i]);
            if (it == st.begin()) {
                ans += vec[i];
            } else {
                it--;
                ans += vec[i] - *it;
            }
            st.insert(vec[i]);
        }
        return ans;
    }
    int main() {
        int n;
        while(scanf("%d", &n) == 1) {
            vector<int>vec1, vec2;
            int x,y;
            while(n--) {
                scanf("%d%d", &x, &y);
                vec1.push_back(x);
                vec2.push_back(y);
            }
            cout<<gao(vec1) + gao(vec2)<<endl;
        }
    }
    View Code

    H. Ryuji doesn't want to study

    #include <iostream>
    #include <stdio.h>
    #define ll long long
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    using namespace std;
    int n;
    const int MAXN = 1e5 + 10;
    ll sum[MAXN << 2];
    ll add[MAXN << 2];
    
    void push_up(int rt){//向上更新
        sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
    }
    
    void push_down(int rt, int m){
        if(add[rt]){//若有标记,则将标记向下移动一层
            add[rt << 1] += add[rt];
            add[rt << 1 | 1] += add[rt];
            sum[rt << 1] += (m - (m >> 1)) * add[rt];
            sum[rt << 1 | 1] += (m >> 1) * add[rt];
            add[rt] = 0;//取消本层标记
        }
    }
    
    void build(int l, int r, int rt){//建树
        add[rt] = 0;
        if(l == r){
            scanf("%lld", &sum[rt]);
            return;
        }
        int mid = (l + r) >> 1;
        build(lson);
        build(rson);
        push_up(rt);//向上更新
    }
    
    void update(int L, int R, ll key, int l, int r, int rt){//区间更新
        if(L <= l && R >= r){
            sum[rt] = (r - l + 1) * key;
            add[rt] = key;
            return;
        }
        push_down(rt, r - l + 1);//向下更新
        int mid = (l + r) >> 1;
        if(L <= mid) update(L, R, key, lson);
        if(R > mid) update(L, R, key, rson);
        push_up(rt);//向上更新
    }
    
    ll query(int L, int R, int l, int r, int rt){//区间求和
        if(L <= l && R >= r) return sum[rt];
        push_down(rt, r - l + 1);//向下更新
        int mid = (l + r) >> 1;
        ll ans = 0;
        if(L <= mid) ans += query(L, R, lson);
        if(R > mid) ans += query(L, R, rson);
        return ans;
    }
    //-----------------------------------
    ll sum2[MAXN << 2];
    ll add2[MAXN << 2];
    
    void push_up2(int rt){//向上更新
        sum2[rt] = sum2[rt << 1] + sum2[rt << 1 | 1];
    }
    
    void push_down2(int rt, int m){
        if(add2[rt]){//若有标记,则将标记向下移动一层
            add2[rt << 1] += add2[rt];
            add2[rt << 1 | 1] += add2[rt];
            sum2[rt << 1] += (m - (m >> 1)) * add2[rt];
            sum2[rt << 1 | 1] += (m >> 1) * add2[rt];
            add2[rt] = 0;//取消本层标记
        }
    }
    
    void build2(int l, int r, int rt){//建树
        add2[rt] = 0;
        if(l == r){
            sum2[rt]=sum[rt]*(n-l+1);
            return;
        }
        int mid = (l + r) >> 1;
        build2(lson);
        build2(rson);
        push_up2(rt);//向上更新
    }
    
    void update2(int L, int R, ll key, int l, int r, int rt){//区间更新
        if(L <= l && R >= r){
            sum2[rt] = (r - l + 1) * key;
            add2[rt] = key;
            return;
        }
        push_down2(rt, r - l + 1);//向下更新
        int mid = (l + r) >> 1;
        if(L <= mid) update2(L, R, key, lson);
        if(R > mid) update2(L, R, key, rson);
        push_up2(rt);//向上更新
    }
    
    ll query2(int L, int R, int l, int r, int rt){//区间求和
        if(L <= l && R >= r) return sum2[rt];
        push_down2(rt, r - l + 1);//向下更新
        int mid = (l + r) >> 1;
        ll ans = 0;
        if(L <= mid) ans += query2(L, R, lson);
        if(R > mid) ans += query2(L, R, rson);
        return ans;
    }
    
    int main(void){
        int m;
        scanf("%d%d", &n, &m);
        build(1, n, 1);
        build2(1, n, 1);
        while(m--){
            ll x, y;
            ll z;
            scanf("%lld%lld%lld",&x,&y,&z);
            if(x==1){
                ll ans=query(y,z,1,n,1);
                ll ans2=query2(y,z,1,n,1);
                printf("%lld
    ",ans2-ans*(n-z));
            }else{
                update(y,y,z,1,n,1);
                update2(y,y,z*(n-y+1),1,n,1);
            }
        }
    }
    View Code

     I. Characters with Hash

    #include<iostream>
    #include<string>
    using namespace std;
    typedef long long ll;
    const int inf = 0x3f3f3f3f;
    const int maxn = 1e6 + 1;
    
    int t;
    int n;
    char ch[2];
    string str;
    
    int main()
    {
        scanf("%d", &t);
        while(t--)
        {
            int num;
            ll ans = 0;
            int cnt = 0;
            scanf("%d %s", &n, ch);
            cin>>str;
            int len = str.size();
            int flag=0;
            for(int i = 0;i < len; i++)
            {
                num = abs(str[i]- ch[0]);
                if(flag==0) {
                    if (num != 0) {
                        if (num / 10 == 0) {
                            ans += 1;
                        } else if (num / 100 == 0) {
                            ans += 2;
                        }
                        flag = 1;
                    }
                }else{
                    ans+=2;
                }
            }
            if(ans == 0)
                ans++;
            printf("%lld
    ",ans);
        }
        return 0;
    }
    View Code

    J. Maze Designer

    #include <bits/stdc++.h>
    using namespace std;
    
    const int MAXN = 250010;
    const int DEG = 20;
    
    struct Edge{
        int to,next;
        int w;
    }edge[MAXN*2];
    int head[MAXN],tot;
    void addedge(int u,int v, int w){
        edge[tot].to = v;
        edge[tot].next = head[u];
        edge[tot].w = w;
        head[u] = tot++;
    }
    void init(){
        tot = 0;
        memset(head,-1,sizeof(head));
    }
    int fa[MAXN][DEG];//`fa[i][j]琛ㄧず缁撶偣i鐨勭�`2^j`涓��鍏坄
    int deg[MAXN];//`娣卞害鏁扮粍`
    
    
    void BFS(int root){
        queue<int>que;
        deg[root] = 0;
        fa[root][0] = root;
        que.push(root);
        while(!que.empty()){
            int tmp = que.front();
            que.pop();
            for(int i = 1;i < DEG;i++)
                fa[tmp][i] = fa[fa[tmp][i-1]][i-1];
            for(int i = head[tmp]; i != -1;i = edge[i].next){
                int v = edge[i].to;
                if(v == fa[tmp][0])continue;
                deg[v] = deg[tmp] + 1;
                fa[v][0] = tmp;
                que.push(v);
            }
    
        }
    }
    int LCA(int u,int v){
        if(deg[u] > deg[v])swap(u,v);
        int hu = deg[u], hv = deg[v];
        int tu = u, tv = v;
        for(int det = hv-hu, i = 0; det ;det>>=1, i++)
            if(det&1)
                tv = fa[tv][i];
        if(tu == tv)return tu;
        for(int i = DEG-1; i >= 0; i--){
            if(fa[tu][i] == fa[tv][i])
                continue;
            tu = fa[tu][i];
            tv = fa[tv][i];
        }
        return fa[tu][0];
    }
    
    
    struct Node {
        int u,v,w;
    }node[501000];
    bool cmp(Node a, Node b) {
        return a.w > b.w;
    }
    
    int F[501000];
    int find(int x) {
        if(F[x] == -1)return x;
        else return F[x] = find(F[x]);
    }
    void bing(int x,  int y) {
        int t1 = find(x);
        int t2 = find(y);
        if (t1 != t2)F[t1] = t2;
    }
    
    int main() {
        int n,m;
        while(scanf("%d%d", &n, &m) == 2) {
            int cnt = 0;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++) {
                    int u = i*m + j;
                    char op[4];
                    int w;
                    for(int t = 0; t<2; t++) {
                        scanf("%s%d", op, &w);
                        if (op[0] == 'X')continue;
                        int v;
                        if (op[0] == 'D' && i < n-1) {
                            v = (i+1)*m + j;
                        } else if (op[0] == 'R' && j < m-1) {
                            v = i*m+j+1;
                        } else {
                            continue;
                        }
                        node[cnt].u = u;
                        node[cnt].v = v;
                        node[cnt++].w = w;
                    }
                }
            sort(node, node+cnt, cmp);
    
    
    
            init();
            memset(F, -1, sizeof(F));
            for (int i = 0; i < cnt; i++) {
                int u = node[i].u;
                int v = node[i].v;
                if (find(u) != find(v)) {
                    bing(u, v);
                    addedge(u,v,node[i].w);
                    addedge(v,u,node[i].w);
                }
            }
            BFS(0);
    
            int Q;
            scanf("%d", &Q);
            int x1,y1,x2,y2;
            while(Q--) {
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                int u = (x1-1)*m+y1-1;
                int v = (x2-1)*m + y2-1;
                int lca = LCA(u,v);
                printf("%d
    ", deg[u]+deg[v] - 2*deg[lca]);
            }
    
            return 0;
    
        }
        return 0;
    }
    View Code

    K. Morgana Net

  • 相关阅读:
    高可用网站多点部署架构实战经验总结
    使用阿里云发送邮件完美解决 端口 25 465
    阿里云 SSL 证书 总结
    支付宝支付接入流程
    阿里云服务器ECS的环境部署和安装
    对接 第三方物流APP 手机版
    智付支付接入心得
    二次开发本地配置域名
    从1到n整数中1出现的次数:O(logn)算法
    MongoDB——增删改查
  • 原文地址:https://www.cnblogs.com/smallhester/p/9615417.html
Copyright © 2020-2023  润新知