【CodeForces训练记录】Codeforces Round 1011 (Div. 2)
训练情况

赛后反思
B题因为分讨的问题WA了一发,异或还是不大会做
A题
猜猜题,显然对于字符串全部都是一个字母的,无论怎么换字典序都不可能更小,对于其他情况因为可以选择两个字母互换,我们容易观察到对于某一个字符串一定存在一种换法能让字典序更小(无非就是换头或者换尾使得头尾字符不同,或者头和尾互换),对于 \(k=0\) 的情况判断字符串是否已经满足条件,满足条件答案为 YES,不满足条件答案为 NO,对于 \(k\) 不是 \(0\) 的情况,答案一定是 YES。
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,k; cin>>n>>k;
string s; cin>>s;
string a = s;
string b = a;
reverse(b.begin(),b.end());
sort(s.begin(),s.end());
if(s[0] == s[n-1]){
cout<<"NO"<<endl;
return;
}
if(a<b){
cout<<"YES"<<endl;
return;
}
if(k) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}
B题
这题我们观察到一种构造方法,首先需要把数列变为全部非零(长度任意),最后一次操作全选变为一个零,所以我们只要考虑零的位置左右边界,全选按上述方法操作即可,有一种情况是开头和结尾都是零的情况,全选会导致剩下单个非零元素,我们考虑区间分成两部分,左边操作一次,右边操作一次,最后再全选即可
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n; cin>>n;
vector<int> a(n + 1);
int flag = 0;
for(int i = 1;i<=n;i++){
cin>>a[i];
if(!a[i]) flag++;
}
if(flag){
vector<pair<int,int>> ans;
if(flag == 1){
int pos = 0;
for(int i = 1;i<=n;i++) if(!a[i]) pos = i;
if(pos == n) ans.push_back({pos-1,pos});
else ans.push_back({pos,pos+1});
ans.push_back({1,n-1});
} else if(a[1]==0&&a[n]==0){
ans.push_back({1,n-2});
ans.push_back({2,3});
ans.push_back({1,2});
} else {
int l = 0,r = 0;
for(int i = 1;i<=n;i++){
if(!a[i]) r = i;
}
for(int i = 1;i<=n;i++){
if(!a[i]){
l = i;
break;
}
}
ans.push_back({l,r});
ans.push_back({1,n-r+l});
}
cout<<ans.size()<<endl;
for(int i = 0;i<ans.size();i++){
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
} else {
cout<<1<<endl;
cout<<1<<" "<<n<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}

浙公网安备 33010602011771号