• 2020 Multi-University Training Contest 2(待补


    2020 Multi-University Training Contest 2

    1001 Total Eclipse

    • 思路:最后删除的是最大的点,则按从大到小排序,每次加入点,先判断其相邻点是否已加入,有就合并,每次的贡献是已加入点个数*相邻点权的差值

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    const int N = 1e5 + 10;
    
    int t, n, m;
    int w[N], pos[N], fa[N];
    bool vis[N];
    ll tot, ans;
    vector<int> g[N << 2];
    
    inline int find(int x){
        if (x == fa[x])
            return x;
        return fa[x] = find(fa[x]);
    }
    
    inline bool cmp(int a, int b){
        return w[a] > w[b];
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin >> t;
        while (t -- ){
            tot = 0, ans = 0;
            memset(vis, false, sizeof(vis));
            cin >> n >> m;
            for (int i = 1; i <= n; i ++ ){
                cin >> w[i];
                pos[i] = fa[i] = i;
                g[i].clear();
            }
            sort(pos + 1, pos + n + 1, cmp);
            pos[n + 1] = 0;
            for (int i = 1; i <= m; i ++ ){
                int u, v;
                cin >> u >> v;
                g[v].push_back(u);
                g[u].push_back(v);
            }
            for (int i = 1; i <= n; i ++ ){
                tot ++ ;
                vis[pos[i]] = true;
                for (auto v: g[pos[i]]){
                    if (!vis[v])
                        continue;
                    int v_ = find(v), u_ = find(pos[i]);
                    if (v_ != u_){
                        fa[u_] = v_;
                        tot -- ;
                    }
                }
                ans += tot * (w[pos[i]] - w[pos[i + 1]]);
            }
            cout << ans << "
    ";
        }
        return 0;
    }
    

    1006 The Oculus

    • 思路:用ull 暴力即可

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    const int N = 2e6 + 10;
    
    int t, n, x;
    ull s1, s2, s3;
    ull f[N];
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        f[1] = 1, f[2] = 2;
        for (int i = 3; i < N; i ++ )
            f[i] = f[i - 1] + f[i - 2];
        cin >> t;
        while (t -- ){
            s1 = s2 = s3 = 0;
            cin >> n;
            for (int i = 1; i <= n; i ++ ){
                cin >> x;
                s1 += x * f[i];
            }
            cin >> n;
            for (int i = 1; i <= n; i ++ ){
                cin >> x;
                s2 += x * f[i];
            }
            cin >> n;
            for (int i = 1; i <= n; i ++ ){
                cin >> x;
                s3 += x * f[i];
            }
            for (int i = 1; i <= n; i ++ ){
                if (s1 * s2 == s3 + f[i]){
                    cout << i << "
    ";
                    break;
                }
            }
        }
        return 0;
    }
    

    1010 Lead of Wisdom

    • 思路:暴力dfs即可

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    const int N = 60;
    
    int T, n, k, t, tot;
    ll a, b, c, d, ans;
    
    struct node{
        ll a, b, c, d;
    }now;
    
    map<int, int> mp;
    vector<node> vec[N];
    
    inline void dfs(int t, ll a, ll b, ll c, ll d){
        if (t > tot){
            ans = max(ans, a * b * c * d);
            return ;
        }
        for (auto v: vec[t])
            dfs(t + 1, a + v.a, b + v.b, c + v.c, d + v.d);
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin >> T;
        while (T -- ){
            tot = 0, ans = 0;
            mp.clear();
            for (int i = 0; i < N; i ++ )
                vec[i].clear();
            cin >> n >> k;
            for (int i = 1; i <= n; i ++ ){
                cin >> t >> a >> b >> c >> d;
                if (!mp[t])
                    mp[t] = ++ tot ;
                vec[mp[t]].push_back({a, b, c, d});
            }
            dfs(1, 100, 100, 100, 100);
            cout << ans << "
    ";
        }
        return 0;
    }
    
  • 相关阅读:
    【面试】Java基础
    GC
    【面试】JVM
    Spooling技术
    数据结构之 平衡二叉树
    二叉树应用
    LINUX设备驱动模型之class
    RTC(x86)
    微内核和单内核
    Linux内核的五大模块
  • 原文地址:https://www.cnblogs.com/Misuchii/p/13387766.html
Copyright © 2020-2023  润新知