Codeforces Round 885 (Div. 2)

Codeforces Round 885 (Div. 2)

A - Vika and Her Friends

思路:移动后再判断,所以距离为奇数时朋友永远抓不到她

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

void solve(){
    int n,m,k;cin>>n>>m>>k;
    int x,y;
    bool ok=true;
    cin>>x>>y;
    for(int i=0,a,b;i<k;++i){
        cin>>a>>b;
        int c=abs(x-a)+abs(y-b);
        if(c%2==0)ok=false;
    }
    if(ok)cout<<"YES\n";
    else cout<<"NO\n";
}
signed main(){

    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //init();
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

B - Vika and the Bridge

思路:记录走每种颜色需要的步数,将步数排序后,把最大的步数除二即为最优情况,答案即为max(最大步数除二,第二大),取最小的答案

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;
bool cmp(int a,int b){
    return a>b;
}
void solve(){
    int k,n;cin>>n>>k;
    vector<int>pre(k+1,0);
    vector<int>c[k+1];
    for(int i=1,x;i<=n;++i){
        cin>>x;
        int d=i-pre[x]-1;
        if(d){
            c[x].push_back(d);
        }
        pre[x]=i;
    }
    int ans=n;
    for(int i=1;i<=k;++i){
        int d=n-pre[i];
        if(d)c[i].push_back(d);
        if(c[i].size()==0){
            ans=0;break;
        }
        if(c[i].size()>1)sort(c[i].begin(),c[i].end(),cmp);
        int x=c[i][0]/2;
        if(c[i].size()>1)x=max(x,c[i][1]);
        ans=min(ans,x);
    }
    cout<<ans<<'\n';
}
signed main(){

    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //init();
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

C - Vika and Price Tags

题意:给n对(ai,bi),每对的操作过程:(a,b)→(b,abs(a-b))→(abs(a-b),abs(b-abs(a-b)))→....,问是否能对每对(a,b)操作同样次数后,所有的ai变为0,有则YES。

思路:对于任意(a,b)都可以转换到0,比较每一对(ai,bi)转换到0的次数即可。

从: 1 3 2 1 1 0 1 1 0 ....

        2 6 4 2 2 0 2 2 0 ....

可以发现(a,b)、(2a,2b)...(ka,kb)转换到0的过程中的数也是成k倍比列的,且转边到0的次数相等,所以先将所有(a,b)化为最简。

化简后的(a,b)有三种情况:(奇,偶)、(偶,奇)、(奇,奇)。

三者的关系为:(奇,偶)→(偶,奇)→(奇,奇)→(奇,偶).....,变为(x,0),而后也是循环三次又变为(x,0)

那么只需要判断每一对(ai,bi)是否属于一种情况即可。

特判(0,0),不管怎么转换都为(0,0)。

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

void solve(){
    int n;cin>>n;
    vector<int>a(n+1),b(n+1);
    for(int i=0;i<n;++i)cin>>a[i];
    for(int i=0;i<n;++i){
        cin>>b[i];
        if(a[i]||b[i]){
            int c=__gcd(a[i],b[i]);
            a[i]/=c,b[i]/=c;
        }
    }
    int pa=-1,pb=-1;
    for(int i=0;i<n;++i){
        if(a[i]==0&&b[i]==0)continue;
        if(pa!=-1&&pb!=-1&&(a[i]%2!=pa||b[i]%2!=pb)){
            cout<<"NO\n";return;
        }
        if(pa==-1&&pb==-1&&(a[i]||b[i])){
            pa=a[i]%2,pb=b[i]%2;
        }
    }
    cout<<"YES\n";return ;
    return ;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //init();
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

posted @ 2023-07-18 10:44  bible_w  阅读(29)  评论(0编辑  收藏  举报