【思维】cf 1365 DEF

这套题简单得匪夷所思。。def都是分析下性质就出来了。。

d:把B周围四个点标记一下,然后跑一次联通块就行

#include<bits/stdc++.h>
using namespace std;
#define N 55
 
int X,Y,n,m,f[N][N],v[N][N];
char mp[N][N];
 
void dfs(int x,int y){
    if(v[x][y] || f[x][y] || x==0 || y==0 || x==n+1 || y==m+1)return;
    v[x][y]=1;
    dfs(x+1,y);
    dfs(x-1,y);
    dfs(x,y-1);
    dfs(x,y+1);
}
 
int main(){
    int t;cin>>t;
    while(t--){
        cin>>n>>m;
        memset(f,0,sizeof f);
        memset(v,0,sizeof v);
        for(int i=1;i<=n;i++)scanf("%s",mp[i]+1);
        int cnt=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                if(mp[i][j]=='B')
                    f[i][j]=f[i-1][j]=f[i+1][j]=f[i][j-1]=f[i][j+1]=1;
                if(mp[i][j]=='#')f[i][j]=1;
                if(mp[i][j]=='G')cnt++;
            }
        X=n,Y=m;
        if(f[X][Y]){
            if(cnt)puts("NO");
            else puts("YES");
            continue;
        }
        dfs(X,Y);
        int flag=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(mp[i][j]=='G' && v[i][j]==0)flag=1;
        if(!flag)puts("YES");
        else puts("NO");
    }
}

E:k最大=3

#include<bits/stdc++.h>
using namespace std;
#define N 505
#define ll long long 
 
ll n,a[N];
 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    ll ans=0;
    for(int i=1;i<=n;i++)ans=max(ans,a[i]);
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            ans=max(ans,a[i]|a[j]);
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            for(int k=j+1;k<=n;k++)
                ans=max(ans,a[i]|a[j]|a[k]);
    cout<<ans<<'
';
} 

F:每次操作只能同时修改a[i]和a[n-i+1]的位置,看a[]和b[]里对应的数对是不是一样的即可

#include<bits/stdc++.h>
using namespace std;
#define N 505
 
map<int,multiset<int> >mp1,mp2;
int n,a[N],b[N];
 
 
int main(){
    int t;cin>>t;
    while(t--){
        scanf("%d",&n);
        mp1.clear();mp2.clear();
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)scanf("%d",&b[i]);
        for(int i=1;i<=n;i++){
            mp1[a[i]].insert(a[n-i+1]);
            mp2[b[i]].insert(b[n-i+1]);
        }
        int f=0;
        for(auto p:mp1){
            int x=p.first;
            auto s=p.second;
            if(mp2[x]!=s)f=1;
        }
        if(f)cout<<"No"<<'
';
        else cout<<"Yes"<<'
';
    }
}
原文地址:https://www.cnblogs.com/zsben991126/p/13087068.html