zoukankan      html  css  js  c++  java
  • 【组队训练】2016 ACM/ICPC Asia Regional Dalian Online

    因为不是一队……毫无晋级的压力……反正有压力也进不去呵呵呵……

    开场zr看1006我看1010。。

    1010我一直在wa。。。

    zr的1006倒是比较轻松的过了。。。然后我让他帮我看10。。。。

    跟他讲了半天我代码的逻辑。。。然后我自己看出来的。。。。比赛的代码。。。。写的十分混乱。。。。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    typedef long long ll;
    using namespace std;
    const int N = 100005;
    vector<int> G[N];
    
    int a[N], b[N];
    int low[N];
    int par[N];
    int c[N];
    int cntv;
    ll ans;
    int n;
    
    int lowbit(int x)
    {
        return x & (-x);
    }
    
    int sum(int n)                //前n个数的和
    {
        int ans = 0;
        while (n > 0) {
            ans +=  c[n];
            n -= lowbit(n);
        }
        return ans;
    }
    
    void add(int pos, int num, int n)    //在pos处加num
    {
        while (pos <= n) { 
            c[pos] += num;
            pos += lowbit(pos);
        }
    }
    
    void dfs(int u) {
        //printf("==%d %d %d
    ", u, a[u], low[ a[u] ]);
        //printf("n = %d
    ", n);
        int lowu = low[ a[u] ];
        int tmp = sum(lowu);
        for (unsigned i = 0; i < G[u].size(); ++i) {
            int v = G[u][i];
            dfs(v);
        }
        int tmp2 = sum(lowu);
        add(a[u], 1, n);
        cntv++;
        //printf(">>%d %d %d
    ", u, tmp, tmp2);
        ans += tmp2 - tmp;
    }
    
    void init() {
        memset(c, 0, sizeof c);
        memset(low, 0, sizeof low);
        memset(par, 0, sizeof par);
    }
    
    int main()
    {
        //freopen("in.txt", "r", stdin);
        int T;
        scanf("%d", &T);
        while (T--) {
            ll k;
            init();
            scanf("%d%lld", &n, &k);
            //printf("%d %lld
    ", n, k);
            for (int i = 1; i <= n; ++i) {
                G[i].clear();
                scanf("%d", &a[i]);
                b[i] = a[i];
            }
            sort(b+1, b+1+n);
            int cnt = unique(b+1, b+1+n) - (b+1);
            //printf("cnt=%d
    ",cnt);
            //for (int i = 1; i <= cnt; ++i) printf("|%d ", b[i]); printf("
    ");
            int idx = cnt;
            for (int i = 1; i <= cnt; ++i) {
                while ((ll)b[i]*b[idx--] > k) ;
                idx++; low[i] = idx;
            }//low[i]记录的是i*low[i]<=k的最大值
            //for (int i = 1; i <= n; ++i) printf("%d ", low[i]); printf("
    ");
            for (int i = 1; i <= n; ++i) {
                a[i] = lower_bound(b+1, b+1+cnt, a[i]) - b;
            }
            //for (int i = 1; i <= n; ++i) { printf("%d %d
    ", a[i], low[ a[i] ]); }
    
            int u, v;
            for (int i = 1; i < n; ++i) {//printf("i=%d
    ", i);
                scanf("%d%d", &u, &v);
                G[u].push_back(v);
                par[v] = u;
            }
            int root = 1;
            while (par[root]) root = par[root];
            //printf("root=%d
    ", root);
            cntv = 0;
            ans = 0;
            dfs(root);
            printf("%lld
    ", ans);
        }
        return 0;
    }
    View Code

    1009总体思路也是我想出来的,但是代码出了一些十分隐蔽的逻辑错误。。。zr比较强大。。。竟然看出来并改对了。。。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <queue>
    typedef long long ll;
    using namespace std;
    const int N = 200005;
    vector<int> G[N];
    int ans[N];
    
    void up(int &x, int y) {
        if (x == -1 || x > y+1) x = y+1;
    }
    
    int main()
    {//freopen("in.txt", "r", stdin);
        int T;
        scanf("%d", &T);
        while (T--) {
            int n, m;
            scanf("%d%d", &n, &m);
            for (int i = 0; i <= n; ++i) G[i].clear();
            int u, v;
            for (int i = 0; i < m; ++i) {
                scanf("%d%d", &u, &v);
                G[u].push_back(v);
                G[v].push_back(u);
            }
            int s;
            scanf("%d", &s);
            int cnt = 1;
            for (int i = 1; i <= n; ++i) ans[i] = 1; ans[s] = -1;
            queue<int> q[2];
            int now = 0;
            for (unsigned i = 0; i < G[s].size(); ++i) {
                int v = G[s][i];
                ans[v] = -1;
                q[now].push(v);
                cnt++;
            }
            for (int i = 1; i <= 2*m; ++i) {
                if (q[now].empty()) break;
                int num = 0;
                while (q[now].size()) {
                    int u = q[now].front(); q[now].pop();
                    //printf("u=%d 
    ", u);
                    int tmp = 0;
                    int sz = G[u].size();
                    for (int j = 0; j < sz; ++j) {
                        int v = G[u][j];
                        if (ans[v] == -1) tmp++;
                    }
                    //printf("%d: %d %d %d
    ", u, sz, tmp, n);
                    if (n - sz > cnt - tmp) {
                        //printf(">>%d %d
    ", u, ans[u]);
                        ans[u] = i+1;
                        num++;
                    } else {
                        q[now^1].push(u);
                    }
    
                }
                cnt -= num;
                now ^= 1;
            }
    
            bool ok = true;
            for (int i = 1; i <= n; ++i) {
                if (s == i) continue;
                if (ok) ok = false; else printf(" ");
                printf("%d", ans[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    View Code

    1007坑题。竟然是推公式。。。两个人讨论了下,wa了几次推出来了。。。

    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    #include <map>
    #include <queue>
    #include <stack>
    #include <cmath>
    typedef long long ll;
    #define CLR(x, v) sizeof (x, v, sizeof(x))
    using namespace std;
    ll n,m;
    int main()
    {
       //freopen("in.txt","r",stdin);
       while(cin >> m >> n){
            if (m == 1) puts("T");
            else if ((m/2)*(m-m/2) > n) puts("F");
            else puts("T");
       }
       return 0;
    }
    View Code

    02补题吧。。太弱了。。。。

  • 相关阅读:
    git fetch, git pull, git pull -rebase区别
    Git 变更远程仓库地址
    终于有人把 Docker 讲清楚了,万字详解!
    Harbor install and used
    访问gitlab从http方式改为ssh方式,gitlab使用的不是标准22端口
    Linux下的ifconfig已经过时了,试试ip命令
    在CentOS 8上使用DNF管理软件包
    搭建hadoop的HA集群模式(hadoop2.7.3+hive+spark)
    spark运行时加载配置文件(hive,hdfs)
    java 如何用pattern 和 Matcher 来使用正则表达式(一)
  • 原文地址:https://www.cnblogs.com/wenruo/p/5860652.html
Copyright © 2011-2022 走看看