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 ),ci↔aior 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; }
B.Motarack‘s Birthday
题意:给n长数组a,其中某些元素丢失,要求在丢失处都补上k,使得 | ai−ai+1 | 最小的最大值。
思路:查看样例可知,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; }
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; }
D.
题意:给出一个n∗m的矩阵,相邻格子之间都有双向边。现在每条边只能走一次,给出一种走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; }
以上是关于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)