1. 程式人生 > 實用技巧 >Codeforces Round #648題解

Codeforces Round #648題解

A題

簽到模擬題

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int g[55][55];
int col[55];
int row[55];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        memset(col,0,sizeof col);
        memset(row,0,sizeof row);
        
int i,j; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ cin>>g[i][j]; if(g[i][j]){ col[i]=1; row[j]=1; } } } int cnt=0; for(i=1;i<=n;i++){
for(j=1;j<=m;j++){ if(!g[i][j]){ if(!col[i]&&!row[j]){ cnt++; col[i]=row[j]=1; g[i][j]=1; } } } } if(cnt%2) cout
<<"Ashish"<<endl; else{ cout<<"Vivek"<<endl; } } return 0; }
View Code

B題

排序比對

#include<iostream>
#include<queue>
#include<map>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<cstring>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int mod=1e9+7;
int a[N];
int x[N];
int b[N];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int i;
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=1;i<=n;i++)
            cin>>x[i];
        int cnt1=0,cnt2=0;
        for(i=1;i<=n;i++){
            if(x[i]==0)
                cnt1++;
            else
                cnt2++;
        }
        if(cnt1&&cnt2){
            cout<<"YES"<<endl;
        }
        else{
            memcpy(b,a,sizeof a);
            sort(b+1,b+1+n);
            int sign=0;
            for(i=1;i<=n;i++)
            if(b[i]!=a[i]){
                sign=1;
                break;
            }
            if(!sign)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
}
View Code

C題

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e5+10;
int a[N];
int b[N];
int pos[N];
int cnt[N];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++){
        cin>>a[i];
        pos[a[i]]=i;
    }
    for(i=1;i<=n;i++){
        cin>>b[i];
    }
    for(i=1;i<=n;i++){
        int x=pos[b[i]];
        if(x>=i){
            cnt[x-i]++;
        }
        else{
            int tmp=n-i+1;
            cnt[x-1+tmp]++;
        }
    }
    //cout<<cnt[1]<<endl;
    sort(cnt,cnt+1+n);
    reverse(cnt,cnt+1+n);
    cout<<cnt[0]<<endl;
 
}
View Code

D題

如果好人和壞人挨在一起肯定不行

否則講壞人周圍的一圈全部圍起來,這樣是最優的

之後從n,m處看看能否經過所有的好人

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e5+10;
char s[60][60];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int vis[60][60];
int res;
int n,m;
void dfs(int x,int y){
    int i;
    for(i=0;i<4;i++){
        int a=x+dx[i];
        int b=y+dy[i];
        if(a&&a<=n&&b&&b<=m&&(!vis[a][b])){
            if(s[a][b]=='#')
                continue ;
            vis[a][b]=1;
            if(s[a][b]=='G'){
                res++;
            }
            dfs(a,b);
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        memset(vis,0,sizeof vis);
        cin>>n>>m;
        int i,j;
        int gcnt=0;
        int sign=0;
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                cin>>s[i][j];
            }
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                if(s[i][j]=='G')
                    gcnt++;
                else if(s[i][j]=='B'){
                    int k;
                    //cout<<i<<" "<<j<<endl;
                    for(k=0;k<4;k++){
                        int a=i+dx[k];
                        int b=j+dy[k];//cout<<a<<" "<<b<<endl;
                        if(a&&a<=n&&b&&b<=m){
                            if(s[a][b]=='G'){
                                sign=1;
                                break;
                            }
                            else if(s[a][b]=='.'){
                                s[a][b]='#';
                            }
                        }
                    }
                }
            }
        }
        res=0;
        if(sign){
            cout<<"NO"<<endl;
            continue;
        }
        if(s[n][m]!='#'){
            vis[n][m]=1;
            dfs(n,m);
        }
        if(res==gcnt)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}
View Code

E題

因為題目已知至少要k-2個

假設我們取了k個,使得答案最大

那麼因為對於每個數來說至少k-2個數在這位是1

因此我們只要任意選三個數,都能保證在每一位上都有至少一個數為1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N];
int main(){
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    ll ans=0;
    if(n==1){
        cout<<a[1]<<endl;
    }
    else if(n==2){
        cout<<(a[1]|a[2])<<endl;
    }
    else{
      int j,k;
      for(i=1;i<=n;i++){
        for(j=i+1;j<=n;j++){
            for(k=j+1;k<=n;k++)
                ans=max(ans,a[i]|a[j]|a[k]);
        }
      }
      cout<<ans<<endl;
    }


}
View Code