• AtCoder Beginner Contest 212 Solution


    题解

    A.Alloy

    水题

    B.Weak Password

    水题 + 1;

    C.Min Difference

    首先想到排序

    接下来我们思考 如果说 ai > bj 那么ai之后的所有数都不可能列入答案,所以更新j

    否则 更新i

    遍历复杂度为O(n + m)排序复杂度为(n log n + m log m)

    #include <bits/stdc++.h>
    using namespace std;
    #define N 200010
    #define INF 1010000000
    #define rep(i, n) for(int i = 0; i < n; ++i)
    
    int n, m;
        int a[N];
        int b[N];
        int ans = INF;
    signed main() {
    
        cin >> n >> m;
        rep(i, n)cin >> a[i];
        rep(i, m)cin >> b[i];
        sort(a, a + n);
        sort(b, b + m);
        int x = 0;
        int y = 0;
        while ((x < n) && (y < m)) {
            ans = min(ans, abs(a[x] - b[y]));
            if (a[x] > b[y])y ++;
            else x ++;
        }
        cout << ans << endl;
        return 0;
    }

    D.Querying Multiset

    一道堆的裸题。

    不过使堆里每个元素加上一个值,在入堆时候的sum处理,确实很妙,学到了。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int n;
    LL sum = 0;
    signed main() {
    
        priority_queue<LL,vector<LL>,greater<LL>> heap;
        cin >> n;
        while(n --)
        {
            int p,x;
            scanf("%lld",&p);
            if(p == 1)
            {
                scanf("%lld",&x);
                heap.push(x - sum);
            }
            else if(p == 2)
            {
                scanf("%lld",&x);
                sum += x;
            }
            else 
            {
                LL t = heap.top();
                heap.pop();
                cout << t + sum<< endl;
            }
        }
        return 0;
    }

    E - Safety Journey

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 5010;
    
    vector<int> e[N];
    
    const int mod = 998244353;
    typedef long long LL;
    #define rep(i, n) for(int i = 0; i < n; ++i)
    int n,m,k;
    LL dp[N];
    LL dp2[N],s;
    int sz;
    
    signed main() {
        cin >> n >> m >> k;
        while(m --)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            e[a - 1].push_back(b - 1);
            e[b - 1].push_back(a - 1);
        }
        for(int i = 0; i < n; ++ i) dp[i] = (LL)0;
        dp[0] = (LL)1;
        for(int i = 0; i < k; ++ i)
        {
            s = (LL)0;
            for(int j = 0; j < n; ++ j) s += dp[j];
            for(int j = 0; j < n; ++ j)
            {
                dp2[j] = s - dp[j];
                sz = e[j].size();
                for(int ii = 0; ii < sz; ++ ii)dp2[j] -= dp[e[j][ii]];
                dp2[j] %= mod;
            }
            for(int j = 0; j < n; ++ j) dp[j] = dp2[j];
        }
        cout << dp[0] << endl;
        return 0;
    }

    剩下题待更。

  • 相关阅读:
    占位
    提高班整风带给我的思考
    Servlet笔记
    CommandArgument传多个值
    asp.net中怎么判断request的一个值是否为空
    asp.net中cookie中文乱码的解决
    datatable的手工构造过程
    .net c#日期时间函数大全
    【转载】[.net程序员面试题]
    javascript自动生成表格行
  • 原文地址:https://www.cnblogs.com/yjyl0098/p/15085443.html
Copyright © 2020-2023  润新知