Codeforces Round #629 (Div. 3) 总结

废话

F 题考场上漏了一些情况写 WA 掉了,前期题过得还是有点慢,补题待更新

题解

A

直接数出于是的补就好

#include <bits/stdc++.h>
using namespace std;

int a,b,t;

signed main() {
    cin>>t;
    while(t--) {
        cin>>a>>b;
        cout<<(b-a%b)%b<<endl;
    }
}

B

给这些串分个类,很容易发现没类的个数依次是 \(1,2,3,...\)

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 100005;

int t,n,k;

signed main() {
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--) {
        cin>>n>>k;
        int pos=1;
        while(k>pos) k-=pos, ++pos;
        ++pos;
        int q=k;
        for(int i=n;i>=1;--i) cout<<((i==pos||i==q)?'b':'a');
        cout<<endl;
    }
}

C

从第一个 \(1\) 之后,将所有的数字倒到另一边

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 100005;

char c[N],a[N],b[N];

int t,n;

signed main() {
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--) {
        cin>>n>>c+1;
        int fg=0;
        for(int i=1;i<=n;i++) {
            if(fg==0) {
                if(c[i]=='1') {
                    a[i]='1';
                    b[i]='0';
                    fg=1;
                }
                else if(c[i]=='2') {
                    a[i]='1';
                    b[i]='1';
                }
                else {
                    a[i]='0';
                    b[i]='0';
                }
            }
            else {
                a[i]='0';
                b[i]=c[i];
            }
        }
        for(int i=1;i<=n;i++) cout<<a[i];
        cout<<endl;
        for(int i=1;i<=n;i++) cout<<b[i];
        cout<<endl;
    }
}

D

如果能二分图染色就输出颜色数,否则就输出 \(3\)

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 400005;

int q,n,a[N],c[N],fail;
vector <int> g[N];

void dfs(int p) {
    for(int q:g[p]) {
        if(c[q]) {
            if(c[q]==c[p]) fail=1;
        }
        else {
            c[q]=3-c[p];
            dfs(q);
        }
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>q;
    while(q--) {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        int fg=0;
        for(int i=1;i<n;i++) if(a[i]!=a[i+1]) fg=1;
        if(a[1]!=a[n]) fg=1;
        if(fg==0) {
            cout<<1<<endl;
            for(int i=1;i<=n;i++) cout<<1<<" ";
            cout<<endl;
            continue;
        }
        for(int i=1;i<n;i++) if(a[i]!=a[i+1]) {
            g[i].push_back(i+1);
            g[i+1].push_back(i);
        }
        if(a[1]!=a[n]) {
            g[1].push_back(n);
            g[n].push_back(1);
        }
        fail=0;
        for(int i=1;i<=n;i++) if(c[i]==0) {
            c[i]=1;
            dfs(i);
        }
        if(fail) {
            cout<<3<<endl;
            for(int i=1;i<n;i++) cout<<(i%2)+1<<" ";
            cout<<3<<endl;
        }
        else {
            cout<<2<<endl;
            for(int i=1;i<=n;i++) cout<<c[i]<<" ";
            cout<<endl;
        }
        for(int i=1;i<=n;i++) {
            a[i]=c[i]=0;
            g[i].clear();
        }
    }
}

F

枚举选择一个中间点,计算把边上压到中间这条线上的答案

压的时候要考虑两边压和单边压的情况

(以下代码中的二分显得很累赘,纯粹为了偷懒而出现)

using namespace std;

#define int long long
const int N = 200005;

int n,k,a[N],pre[N],suf[N],ans=1e18;
map<int,int> mp;

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) {
        pre[i]=pre[i-1]+a[i];
    }
    for(int i=n;i>=1;--i) {
        suf[i]=suf[i+1]+a[i];
    }
    for(int i=1;i<=n;i++) mp[a[i]]++;
    for(auto i:mp) if(i.second>=k) {
        cout<<0<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++) {
        int x=a[i];
        int e=upper_bound(a+1,a+n+1,x)-lower_bound(a+1,a+n+1,x);
        int g=n-(upper_bound(a+1,a+n+1,x)-a)+1;
        int l=lower_bound(a+1,a+n+1,x)-a-1;
        int sg=suf[n-g+1];
        int sl=pre[l];
        int tmp=sg-g*x+l*x-sl-(n-k);
        ans=min(ans,tmp);
        if(n-l>=k) {
            int tx=sg-g*x-(n-l-k);
            ans=min(ans,tx);
        }
        if(n-g>=k) {
            int tx=l*x-sl-(n-g-k);
            ans=min(ans,tx);
        }
        //cout<<l<<" "<<e<<" "<<g<<endl;
    }
    cout<<max(0ll,ans);
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12579022.html
今日推荐