Codeforces Round 874 (Div. 3) A-F

发布时间 2023-05-22 19:48:31作者: EdGrass

Codeforces Round 874 (Div. 3)

 

A. Musical Puzzle

map<int,int>mp;
void solve(){
    mp.clear();
    int n=read(),cnt=0;
    string s;
    cin>>s;
    for(int i=0;i<n-1;i++){
        int x=s[i]+s[i+1]*1000;
        // cout<<x<<" ";
        if(mp[x]==0)cnt++,mp[x]=1;
    }
    // cout<<'\n';
    cout<<cnt<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

B. Restore the Weather

int b[N];
void solve(){
    int n=read(),k=read(),ans=1;
    for(int i=1;i<=n;i++){
        a[i].x=read();
        a[i].id=i;
    }
    for(int i=1;i<=n;i++) b[i]=read();
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    for(int i=1;i<=n;i++){
        if(abs(a[i].x-b[i])>k){
            ans=-1;
            break;
        }
        else a[i].ans=b[i];
    }
    if(ans<0)cout<<"-1\n";
    else {
        sort(a+1,a+1+n,cmp);
        for(int i=1;i<=n;i++){
            cout<<a[i].ans<<' ';
        }
        cout<<'\n';
    }
    // puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

C. Vlad Building Beautiful Array

map<int,int>mp;
void solve(){
    mp.clear();
    int n=read(),odd=0,even=0,minn=inf;
    for(int i=1;i<=n;i++){
        int x=read();
        if(x%2&&mp[x]==0)odd++;
        else if(mp[x]==0)even++;
        mp[x]++;
        minn=min(x,minn);
    }
    puts((minn%2==1&&odd>0)||(minn%2==0&&odd==0)?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

D. Flipper

int a[N];
void solve(){
    int n=read(),maxx=-1,re=-1;
    for(int i=1;i<=n;i++){
        a[i]=read();
        if(i!=1&&maxx<a[i]){
            maxx=a[i];
            re=i;
        }
    }
    if(n==1){
        cout<<a[1]<<'\n';
        return ;
    }
    if(n==2){
        cout<<a[2]<<" "<<a[1]<<'\n';
        return ;
    }
    int left=-1,right=-1;
    if(re==n){
        right=n;
        left=n;
        for(int i=n-1;i>=1;i--){
            if(a[i]>a[1]){
                left=i;
            }else break;
        }
    }
    else {
        right=re-1;
        left=re-1;
        for(int i=re-2;i>=1;i--){
            if(a[i]>a[1]){
                left=i;
            }else break;
        }
    }
    for(int i=right+1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    for(int i=right;i>=left;i--){
        cout<<a[i]<<" ";
    }
    for(int i=1;i<=left-1;i++){
        cout<<a[i]<<" ";
    }
    cout<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

E. Round Dance

int p[N],d[N],cnt[N]; //存储每个点的祖宗节点
map<PII,int>mp;
int find(int x) {    // 返回x的祖宗节点
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}
void solve(){
    int n=read();
    mp.clear();
    for (int i = 1; i <= n; i ++ ) p[i] = i, cnt[i]=0, d[i]=0;  // 初始化,假定节点编号是1~n
    for(int i=1;i<=n;i++){
        int x=read();
        if(mp[{i,x}]==0){
            mp[{i,x}]++;
            mp[{x,i}]++;
            d[x]++;
            d[i]++;
        }
        p[find(i)] = find(x);  // 合并a和b所在的两个集合:
    }
    for(int i=1;i<=n;i++){
        int pa=find(i);
        if(cnt[pa]==0)cnt[pa]=1;
        cnt[pa]+=max(abs(2-d[i]),0);
    }

    int minn=0,maxx=0;
    for(int i=1;i<=n;i++){
        if(cnt[i]>0)maxx++;
        if(cnt[i]>1)minn++;
    }
    cout<<min(maxx-minn+1,maxx)<<" "<<maxx<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

F. Ira and Flamenco

题目要求连续m个数 两两不同 那就是枚举

先统计每个数 然后枚举首位把连续m个数相乘作为对答案的贡献

利用乘逆元除掉首位的贡献 加上下一位

若值是m的差 位置不是m 即不是连续的m个数 则对答案无贡献

#define int long long
int qmi(int m, int k, int p){
    int res = 1 % p, t = m;
    while (k){
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}
void solve(){
    int n=read(),m=read();
    map<int,int>mp;
    vector<int>a(n);
    for(int i=0;i<n;i++)a[i]=read();
    sort(a.begin(),a.end());
    for(int x:a){
        mp[x]++;
    }
    a.resize(n=unique(a.begin(),a.end())-a.begin());
    int c=1,ans=0;
    for(int i=0,j=0;i<n;){
        while(j<n&&a[j]<a[i]+m)c=c*(mp[a[j++]])%mod;
        if(j-i==m)(ans+=c)%=mod;
        c=c*qmi(mp[a[i++]],mod-2,mod)%mod;
    }
    cout<<ans<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}