题解:CF1955E Long Inversions
简单题。
考虑贪心地进行修改,每次选择字符串中最左侧第一个 ,并以该位置为左端点进行一次修改,可以发现若 合法则这样一定构造出全 串。
然而直接暴力实现是 的,但是发现每次选择的 的位置一定是递增的,且一个位置在若干次修改后是否为 仅与其初始值与该位置被修改次数(即被区间覆盖次数)有关,于是考虑在顺序枚举位置并进行区间修改时,差分维护每个位置被修改次数即可判断某个位置是否需要被修改。
单次检查时间复杂度变为 级别,总时间复杂度 级别。
AC code
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e4+5;
int n,d[maxn];
string s;
bool check(int len){
memset(d,0,sizeof(d));
for(int i=0;i<n;i++){
d[i]=d[i]+d[i-1];
int tmp=s[i]-'0';
if(d[i]%2==1){
tmp^=1;
}
if(tmp==0){
if(i<=n-len){
d[i]++;
d[i+len]--;
}
else{
return 0;
}
}
}
return 1;
}
signed main(){
int t;
cin>>t;
while(t--){
cin>>n>>s;
for(int i=n;i>=1;i--){
if(check(i)){
cout<<i<<endl;
break;
}
}
}
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575279

浙公网安备 33010602011771号