Codeforces Round #619 (Div. 2)

Posted nukezy

tags:

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

传送门

A. Three Strings

题意:给三个长为n字符串a,b,c,需对字符串每一位都进行操作:

i (1 ≤ i ≤ n ),ciaior ci↔bi,问是否能让a与b相等。 

思路:对于每个i(1≤i≤n),其中n是字符串的长度。 如果ci等于ai,我们可以用bi交换它;如果ci等于bi,我们可以用ai交换它,否则我们就不能交换它。 因此,我们只需要检查ci等于ai或ci等于bi即可。

技术图片
#include<bits/stdc++.h>
using namespace std;
void run(){
    string a,b,c;
    cin>>a>>b>>c;
    int f =0;
    for(long long i=0;i<a.size();i++){
        if(c[i] == a[i] || c[i] == b[i]) f =1;
        else {
            f = 0;break;
        }
    }
    if(f) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}
int main(){
    long long t;cin>>t;
    while(t--)run();
    return 0;
}
Code

B.Motarack‘s Birthday

题意:给n长数组a,其中某些元素丢失,要求在丢失处都补上k,使得 | aiai+| 最小的最大值。

思路:查看样例可知,k= (最大值+最小值)/2;记录最大绝对差。

技术图片
#include<bits/stdc++.h>
using namespace std;
const int oo  =1e9;
const int N = 1e5+17;
int ve[N];
void run(){
    int maxv =-oo,minv = oo;
    int n,m,k,ans=0,cur;
    cin>>n;
    for(int i=0;i<n;i++) ve[i] = 0;
    for(int i=0;i<n;i++) cin>>ve[i];
    for(int i=0;i<n;i++){
        if( i <n-1 && ve[i] == -1 && ve[i+1] != -1)
            minv = min(minv,ve[i+1]),maxv = max(maxv,ve[i+1]);
        if(i>0 && ve[i] == -1 && ve[i-1]!=-1)
            minv = min(minv,ve[i-1]),maxv =max(maxv,ve[i-1]);
    }
    cur =(minv+maxv) /2;
    for(int i =0;i<n;i++){
        if(ve[i] == -1) ve[i] =cur;
        if(i)
            ans = max(ans,abs(ve[i]-ve[i-1]));
    }
    cout<<ans<<" "<<cur<<endl;
}
int main(){
    int t;cin>>t;
    while(t--)run();
    return 0;
}
Code

C. Ayoub‘s function

题意:n长的01字符串s,其中有m个1,求f(s)的最大值。f(s) = s中含1子串的总数。 

思路:考虑容斥,答案即为总方案数减去每段连续0的贡献。
容易证明只需要将n−m个0尽可能地平均分配即可。

技术图片
#include<bits/stdc++.h>
using namespace std;
void run(){
    int n,m;cin>>n>>m;
    long long ans =  (long long )n*(long long )(n+1)/2LL;
    int z = n - m;
    int k = z / (m + 1);
    ans -= (long long )(m+1)*(long long)k*(long long)(k+1)/2LL;
    ans -= (long long )(z %(m+1)) * (long long )(k+1);
    cout<<ans<<endl;
}
int main(){
    int t;cin>>t;while(t--)run();
    return 0;
}
Code

D.

题意:给出一个nm的矩阵,相邻格子之间都有双向边。现在每条边只能走一次,给出一种走k次的方案。

思路:走的方案有很多种,模拟就好。

技术图片
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
void run(){
    if(4 * n * m - 2 * n - 2 * m < k) {
        return void(cout << "NO" << 
);
    }
    string s1 = "", s2 = "";
    for(int i = 1; i < m; i++) s1 += "R";
    for(int i = 1; i < m; i++) s1 += "L";
    s1 += "D";
    s2 += "R";
    for(int i = 1; i < n; i++) s2 += "U";
    for(int i = 1; i < n; i++) s2 += "D";
    vector <pair<char, int> > ans;
    string res = "";
    for(int i = 1; i < n; i++) res += s1;
    for(int i = 1; i < m; i++) res += s2;
    for(int i = 1; i < m; i++) res += "L";
    for(int i = 1; i < n; i++) res += "U";
    for(int i = 0; i < k; i++) {
        if(ans.size() == 0 || ans.back().first != res[i]) {
            ans.push_back(make_pair(res[i], 1));
        } else ++ans.back().second;
    }
    cout << "YES" << 
;
    cout << ans.size() << 
;
    for(int i = 0; i < ans.size(); i++) 
        cout << ans[i].second <<   << ans[i].first << 
;
}
int main(){
    while(cin>>n>>m>>k)run();
    return 0;
} 
Code

 

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

Codeforces Round #619 (Div. 2)

Codeforces Round #619 (Div. 2)C(构造,容斥)

Codeforces Round #619 (Div. 2) 简要题解

Codeforces Round #619 (Div. 2)

Codeforces Round #619 (Div. 2)/CF1301 思维+贪心+模拟+构造+二维ST表

Codeforces Round #619 (Div. 2) C. Ayoub's function