Codeforces Round #599 (Div. 2)补题

题目

A - Maximum Square

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int a[maxn];
int main(){
    int k;
    scanf("%d",&k);
    while(k--){
            int n;scanf("%d",&n);
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
        }
        sort(a+1,a+1+n);
        int Max=0;
        for(int i=1;i<=n;i++){
            Max=max(Max,min(i,a[n-i+1]));
        }
        cout<<Max<<endl;
    }
}

B1 - Character Swap (Easy Version)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        string s1,s2;
        cin>>s1>>s2;
        vector<int>vec;
        for(int i=0;i<n;i++){
            if(s1[i]!=s2[i])
                vec.push_back(i);
        }
        if(vec.size()!=2)puts("NO");
        else if(s1[vec[0]]==s1[vec[1]]&&s2[vec[0]]==s2[vec[1]])puts("YES");
        else puts("NO");
    }
    return 0;
}

B2 - Character Swap (Hard Version)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        string s1,s2;
        cin>>s1>>s2;
        bool flag=true;
        vector<pair<int,int> >ans;
        for(int i=0;i<n;i++){
            if(s1[i]==s2[i])continue;
            bool flag1=false;
            for(int j=i+1;j<n;j++){
                if(s1[i]==s1[j]){
                    flag1=true;
                    swap(s1[j],s2[i]);
                    ans.push_back(make_pair(j,i));
                    break;
                }
            }
            if(!flag1){
                for(int j=i+1;j<n;j++){
                if(s1[i]==s2[j]){
                    flag1=true;
                    swap(s1[j],s2[j]);
                    ans.push_back(make_pair(j,j));
                    swap(s1[j],s2[i]);
                    ans.push_back(make_pair(j,i));
                    break;
                }
            }
            }
            if(!flag1){
                flag=false;
                break;
            }
        }
        if(flag){
            puts("YES");
            printf("%d\n",ans.size());
            for(int i=0;i<ans.size();i++){
                printf("%d %d\n",ans[i].first+1,ans[i].second+1);
            }
        }
        else puts("NO");
    }
}

C - Tile Painting

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll n;
    scanf("%lld",&n);
    ll ans=n;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            ans=i;
            break;
        }
    }
    while(n!=1){
        if(n%ans){
            ans=1;
            break;
        }
        n/=ans;
    }
    cout<<ans<<endl;
}

D - 0-1 MST

求补图连通块的的数量

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
set<ll>e[maxn];
set<ll>s;
bool vis[maxn];
void bfs(ll x){
queue<ll>q;
q.push(x);
vis[x]=true;
s.erase(x);
while(!q.empty()){
    ll u=q.front();
    q.pop();
    //cout<<u<<endl;
    vector<ll>v;
    for(set<ll>::iterator it=s.begin();it!=s.end();it++){
        if(e[u].find(*it)==e[u].end()){
            if(!vis[*it]){
                vis[*it]=true;
                q.push(*it);
                v.push_back(*it);
            }
        }
    }
    for(ll i=0;i<v.size();i++)s.erase(v[i]);
}
}
int main(){
    //memset(head,-1,sizeof(head));
    ll n,m;
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=m;i++){
        ll u,v;
        scanf("%lld%lld",&u,&v);
        e[u].insert(v);
        e[v].insert(u);
    }
    ll ans=0;
    for(ll i=1;i<=n;i++){
        s.insert(i);
    }
    for(ll i=1;i<=n;i++){
        if(!vis[i]){
            bfs(i);
            ans++;
        }
    }
    cout<<ans-1<<endl;
}

E - Sum Balance

for(ll j=i;j;j=i&(j-1))中j遍历一个集合状态i的所有非零子集

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=5e3+10;
const ll INF=0x7f7f7f7f7f;
ll n;
ll cnt[16];
ll tot[16];
ll a[16][maxn];
unordered_map<ll,ll>mp,mp2;
pair<ll,ll>ans[16];
vector<pair<ll,ll> >dp[1<<16];
int main(){
    ll n;
    ll sum=0;
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&cnt[i]);
        for(ll j=1;j<=cnt[i];j++){
            scanf("%lld",&a[i][j]);
            tot[i]+=a[i][j];
            mp[a[i][j]]=i;
        }
        sum+=tot[i];
    }
    if(sum%n){
        puts("NO");
        return 0;
    }
    sum/=n;
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=cnt[i];j++){
            mp2[a[i][j]]=sum-tot[i]+a[i][j];
        }
    }
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=cnt[i];j++){
            vector<pair<ll,ll> >vec;
            ll s=1<<(i-1);
            ll x=mp2[a[i][j]];
            vec.push_back(make_pair(i,x));
            while(mp.count(x)&&!(s&(1<<(mp[x]-1)))){
                s|=(1<<(mp[x]-1));
                vec.push_back(make_pair(mp[x],mp2[x]));
                x=mp2[x];
            }
            if(x==a[i][j]&&!dp[s].size())dp[s]=vec;
        }
    }
    for(ll i=0;i<(1<<n);i++){
        if(dp[i].size())continue;
        for(ll j=i;j;j=i&(j-1)){
            if(dp[j^i].size()&&dp[j].size()){
                for(ll k=0;k<dp[j].size();k++){
                    dp[i].push_back(dp[j][k]);
                }
                for(ll k=0;k<dp[i^j].size();k++){
                    dp[i].push_back(dp[i^j][k]);
                }
                break;
            }
        }
    }
    if(!dp[(1<<n)-1].size()){
        puts("NO");
        return 0;
    }
    puts("YES");
    for(ll i=0;i<dp[(1<<n)-1].size();i++){
        ans[mp[dp[(1<<n)-1][i].second]]=make_pair(dp[(1<<n)-1][i].second,dp[(1<<n)-1][i].first);
    }
    for(ll i=1;i<=n;i++){
        printf("%lld %lld\n", ans[i].first,ans[i].second);
    }
}
发布了29 篇原创文章 · 获赞 4 · 访问量 740

猜你喜欢

转载自blog.csdn.net/qq_44290978/article/details/104083681