补题 [Codeforces Round #648 (Div. 2)]

Posted echozqn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补题 [Codeforces Round #648 (Div. 2)]相关的知识,希望对你有一定的参考价值。

补题 Codeforces Round #648 (Div. 2)

总结一些这一套题目:

这一套题目没什么算法,ABCDEF都是思维+一点点的构造
基本上都需要你仔细观察大胆猜测然后求解
1 看清楚题目
2 多对样例进行比划
3 一步一步的思考,对于E要去想每多一个值会产生什么变化,或者说已经有k个数,如何让这个价值变大

A. Matrix Game

B. Trouble Sort

C. Rotation Matching

这个C想了一会,最后对着样例比划的时候,发现其实就是相对位置,只要判断b和a的相对位置即可,相对位置相同的则经过转动都可以进行匹配,不同的则需要不同的转动数量。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define id first
#define val second
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d
",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int a[maxn],b[maxn],pos[maxn];
 
int main(){
    int n,ans=0;
    scanf("%d",&n);
    for (int i = 1; i <= n; ++i) scanf("%d",&a[i]),pos[a[i]]=i;
    for (int i = 1,x; i <=n ; ++i) {
        scanf("%d",&x);
        b[(pos[x]-i+n)%n]++;
        ans=max(ans,b[(pos[x]-i+n)%n]);
    }
    printf("%d
",ans);
    return 0;
}

D. Solve The Maze

这也是一个思维+构造,想不到。。。

最后听同学说也不太明白为什么只要把bad person围起来就可以了,然后看了一个这个博客[博客链接:https://blog.csdn.net/jziwjxjd/article/details/106614614] 感觉挺对的,可以更好的理解啦。

#include <cstdio>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define id first
#define val second
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d
",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int maxn=55;
char a[maxn][maxn];
int n,m;
struct node{
    int x,y;
    node(int x=0,int y=0):x(x),y(y){}
};
queue<node>que;
bool vis[maxn][maxn];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void bfs(){
    while(!que.empty()) que.pop();
    memset(vis,0,sizeof(vis));
    if(a[n][m]!=‘#‘) que.push(node(n,m)),vis[n][m]=1;
    while(!que.empty()){
        node u = que.front();que.pop();
        for(int i=0;i<4;i++){
            int tx = u.x+dx[i];
            int ty = u.y+dy[i];
 
            if(tx>n||ty>m||tx<1||ty<1) continue;
            if(vis[tx][ty]) continue;
            if(a[tx][ty]==‘#‘) continue;
 
            vis[tx][ty]=1;
            que.push(node(tx,ty));
        }
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int flag=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]==‘B‘){
                    for(int k=0;k<4;k++){
			            int tx = i+dx[k];
			            int ty = j+dy[k];
			
			            if(tx>n||ty>m||tx<1||ty<1) continue;
			            if(a[tx][ty]==‘B‘) continue;
			            if(a[tx][ty]==‘G‘) flag = 1;
			
			            a[tx][ty]=‘#‘;
			        }
                }
            }
        }
        bfs();
//        printf("ss flag = %d
",flag);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]==‘G‘&&!vis[i][j]) flag = 1;
            }
        }
        if(flag) printf("No
");
        else printf("Yes
");
    }
    return 0;
}

E. Maximum Subsequence Value 思维

F. Swaps Again

这个F还是出乎意料的简单,不是很难,但是要注意观察。

只要你发现他们每一个数对称位置的数永远都是一样的就可以解题啦。

#include <cstdio>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <bits/stdc++.h>
#define id first
#define val second
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d
",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=550;
ll a[maxn],b[maxn],v[maxn];
int vis[maxn][maxn];

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,flag = 0;
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]),v[i]=a[i];
        for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
        sort(v+1,v+1+n);
        int len = unique(v+1,v+1+n)-v-1;
        for(int i=1;i<=n;i++){
            int pos1 = lower_bound(v+1,v+1+len,a[i])-v;
            int pos2 = lower_bound(v+1,v+1+len,b[i])-v;
            if(v[pos2]!=b[i]) flag = 1;
            a[i]=pos1,b[i]=pos2;
        }
        if(n&1) if(a[(n+1)/2]!=b[(n+1)/2]) flag = 1;
        for(int i=1;i<=n/2;i++){
            vis[a[i]][a[n-i+1]]++;
            vis[a[n-i+1]][a[i]]++;
        }
        for(int i=1;i<=n/2;i++){
            if(vis[b[i]][b[n-i+1]]||vis[b[n-i+1]][b[i]]){
                vis[b[i]][b[n-i+1]]--;
                vis[b[n-i+1]][b[i]]--;
            }
            else flag = 1;
        }
        if(flag) printf("No
");
        else printf("Yes
");
    }
    return 0;
}

以上是关于补题 [Codeforces Round #648 (Div. 2)]的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #634 (Div. 3) 补题

补题 [Codeforces Round #648 (Div. 2)]

Codeforces Round #491 (Div. 2) — 赛后补题

Codeforces Round #601 (Div. 2)补题

Codeforces Round #639 (Div. 2) 补题

Codeforces Round #639 (Div. 2) 补题