• Codeforces Round #690 (Div. 3)


    Codeforces Round #690 (Div. 3)

    • A
    #include<bits/stdc++.h>
    using namespace std;
    #pragma GCC optimize(2)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    void io(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
    
    int t,n;
    const int maxn=400;
    int a[maxn],b[maxn];
    
    int main()
    {
        io();
        cin>>t;
        while(t--){
            cin>>n;
            for(int i=1;i<=n;++i) cin>>a[i];
            int tmp=(n+1)/2;
            for(int i=1,j=1;i<=tmp;++i,j+=2){
                b[j]=a[i];
            }
            for(int i=n,j=2;i>tmp;i--,j+=2){
                b[j]=a[i];
            }
            for(int i=1;i<=n;++i) cout<<b[i]<<" ";
            cout<<"
    ";
        }
        return 0;
    }
    
    • B
    #include<bits/stdc++.h>
    using namespace std;
    #pragma GCC optimize(2)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    void io(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
    
    int t,n;
    string s;
    string p="2020";
    
    
    int main()
    {
        io();
        cin>>t;
        while(t--){
            cin>>n>>s;
            int len=s.size();
            int rec=n-4;
            int f=0;
            for(int i=0;i<len;++i){
                string stmp=s;
                stmp.erase(i,rec);
                // cout<<stmp<<"
    ";
                if(stmp==p){
                    f=1;
                    // cout<<f<<"
    ";
                    break;
                }
            }
            if(f) cout<<"YES
    ";
            else cout<<"NO
    ";
        }
        return 0;
    }
    
    • C
    #include<bits/stdc++.h>
    using namespace std;
    #pragma GCC optimize(2)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    void io(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
    
    int t,n;
    int num[15];
    int ans[15];
    int f;
    
    void dfs(int x,int pos,int rec)
    {
        if(x==0){
            f=1;
            return;
        }
        if(rec==0) return;
        for(int i=1;i<=9;++i){
            if(num[i]) continue;
            // x-=i;
            ans[pos]=i;
            num[i]=1;
            dfs(x-i,pos+1,rec-1);
            if(f) break;
            ans[pos]=0;
            num[i]=0;
        }
    }
    
    int main()
    {
        io();
        cin>>t;
        while(t--){
            cin>>n;
            if(n<10){
                cout<<n<<"
    ";
                continue;
            }
            if(n>45){
                cout<<-1<<"
    ";
                continue;
            }
            memset(num,0,sizeof(num));
            memset(ans,0,sizeof(ans));
            f=0;
            for(int i=2;i<=9;++i){
                dfs(n,0,i);
                if(f) break;
            }
            if(f){
                for(int i=0;ans[i]!=0;++i) cout<<ans[i];
                cout<<"
    ";
            }else cout<<"-1
    ";
        }
        return 0;
    }
    
    • D
    #define _CRT_SECURE_NO_WARNINGS
    #include<bits/stdc++.h>
    using namespace std;
    #pragma GCC optimize(2)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    void io() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); }
    
    const int maxn = 3010;
    int t, n;
    int a[maxn];
    
    int main()
    {
        io();
        cin >> t;
        while (t--) {
            cin >> n;
            int maxx = 0, sum = 0;
            for (int i = 1; i <= n; ++i) {
                cin >> a[i];
                sum += a[i];
                maxx = max(maxx, a[i]);
            }
            int ans = 1e9;
            for (int i = 1; i <= n; ++i) {
                if (sum % i) continue;
                if (sum / i < maxx) continue;
                int tmp = sum / i;
                int j = 1;
                int tans = 0;
                int f = 0;
                for (int k = 0; k < i; ++k) {
                    int st = 0;
                    int recj = j;
                    for (; j <= n; ++j) {
                        st += a[j];
                        if (st == tmp) {
                            tans += (j - recj);
                            j++;
                            break;
                        }
                        if (st >= tmp) {
                            f = 1;
                            break;
                        }
                    }
                    if (k != i - 1 && j > n) f = 1;
                    if (f) break;
                }
                if(!f) ans = min(tans, ans);
            }
            cout << ans << "
    ";
        }
        return 0;
    }
    
    • E1 &E2

    • 二分+组合数+逆元

      • E1
    #include <bits/stdc++.h>
    using namespace std;
    #pragma GCC optimize(2)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    void io()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
    }
    
    int t, n;
    const int maxn = 2e5 + 10;
    int a[maxn];
    
    int main()
    {
        io();
        cin >> t;
        while (t--)
        {
            cin >> n;
            for (int i = 0; i < n; ++i)
                cin >> a[i];
            sort(a, a + n);
            long long ans = 0;
            for (int i = 0; i < n - 2; ++i)
            {
                int tmp = a[i] + 2;
                int pos = upper_bound(a, a + n, tmp) - a;
                pos--;
                if (pos >= i + 2)
                {
                    ans += (1ll * (pos - i) * (1ll * (pos - i - 1)) / 2ll) * 1ll;
                }
            }
            cout << ans << "
    ";
        }
        return 0;
    }
    
    • E2
    #include<bits/stdc++.h>
    #define MOD 1000000007
    using namespace std;
    #pragma GCC optimize(2)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    void io(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
    
    const int maxn=2e5+10;
    int t,n,m,k;
    int a[maxn];
    
    ll ksm(ll x,ll y){ // 快速幂
        ll ret=1;
        x%=MOD;
        while(y){
            if(y&1)ret=ret*x%MOD;
            x=(x%MOD)*(x%MOD);
            x%=MOD;
            y>>=1;
        }
        return ret;
    }
    
    ll jc(ll x){ // 算阶乘
        ll rec=1;
        while(x){
            rec*=x;
            rec%=MOD;
            x-=1;
        }
        return rec;
    }
    
    int main()
    {
        io();
        cin>>t;
        while(t--){
            cin>>n>>m>>k;
            for(int i=0;i<n;++i) cin>>a[i];
            sort(a,a+n);
            long long ans=0;
            for(int i=0;i<n-m+1;++i){
                int tmp=a[i]+k;
                int pos=upper_bound(a,a+n,tmp)-a; // 二分找范围
                pos--;
                ll w=jc(m-1);
                ll inv=ksm(w,MOD-2); // 费马小定理
                if(pos>=i+m-1){ // if里面都是计算组合数
                    ll rr=1;
                    for(int j=0;j<m-1;++j){
                        rr=(rr%MOD*(pos-i-j)%MOD+MOD)%MOD;
                    }
                    rr=(rr%MOD*inv%MOD+MOD)%MOD;
                    ans=(ans%MOD+rr%MOD)%MOD;
                }
            }
            cout<<ans<<"
    ";
        }
        return 0;
    }
    
    • F
    • 二分+树状数组(差分建树),树状数组很久没写过了,顺带复习一下(反正都是贴板子来着,主要是复习下差分建树(本来想手撸线段树,但是太懒了,线段树太长了
    #include<bits/stdc++.h>
        using namespace std;
        #define mk(a, b) make_pair(a, b)
        typedef pair<int, int> pii;
        void io()
        {
            ios::sync_with_stdio(false);
            cin.tie(0);
            cout.tie(0);
        }
     
        const int maxn = 2e5 + 10;
        int t, n;
        pii pa[maxn];
        int a[maxn];
        int c[maxn];
     
        int lowbit(int x) { return x & (-x); }
     
        void updata(int pos, int k)
        {
            while (pos <= n) {
                c[pos] += k;
                pos += lowbit(pos);
            }
        }
     
        int getsum(int pos)
        {
            int res = 0;
            while (pos > 0) {
                res += c[pos];
                pos -= lowbit(pos);
            }
            return res;
        }
     
        int main()
        {
            io();
            cin >> t;
            while (t--) {
                cin >> n;
                for (int i = 1; i <= n; ++i) {
                    int a, b;
                    cin >> a >> b;
                    pa[i] = mk(a, b);
                }
                sort(pa + 1, pa + n + 1);
                for (int i = 1; i <= n; ++i) a[i] = pa[i].first; // 懒人操作,懒得写cmp,所以直接把first单独存一下方便后面用upperbound,手写二分我容易出锅
                memset(c, 0, (n + 5)*sizeof(int) );
                int ans = 0;
                for (int i = 1; i <= n; ++i) {
                    pii now = pa[i];
                    int y = now.second;
                    int pos = upper_bound(a, a + n + 1, y) - a - 1;
                    int tmp = getsum(i);
                    tmp += pos - i;
                    tmp++;
                    ans = max(ans, tmp);
                    updata(i, 1);
                    updata(pos + 1, -1);
                }
                cout << n - ans << "
    ";
            }
            return 0;
        }
    
    • 最后纪念一下CF第一次看见比赛变绿
    • image-20201219002858675
  • 相关阅读:
    Android笔记(adb命令--reboot loader)
    Android笔记(预安装APK)
    Linux驱动学习(编写一个最简单的模块)
    const关键字与指针
    C++函数重载遇到了函数默认参数情况
    uboot环境变量分析
    ftp服务
    Samba服务
    mariadb_2 单表的增删改查
    mariadb_1 数据库介绍及基本操作
  • 原文地址:https://www.cnblogs.com/DrumWashingMachine-Lhy-NoobInCsu/p/14157769.html
Copyright © 2020-2023  润新知