造数据:
自己测的时候可以把n、m开小,n到10、m到20就行
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
srand(time(0));
int n=rand()%100+1;
cout<<n<<" ";
int m=rand()%200+1;
cout<<m<<endl;
for(int i=1;i<=n;i++)cout<<rand()%2<<" ";cout<<endl;
for(int i=1;i<=m;i++){
int op=rand()%5;
int l=rand()%n,r=rand()%n;
if(l>r)swap(l,r);
cout<<op<<" "<<l<<" "<<r<<endl;
}
return 0;
}
暴力程序:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ls (x<<1)
#define rs (x<<1)|1
using namespace std;
const int N=1e5+10;
int n,m,a[N];
int main(){
IOS;
cin>>n;cin>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int j=1;j<=m;j++){
int op,l,r;cin>>op>>l>>r;
++l;++r;
if(op==0)for(int i=l;i<=r;i++)a[i]=0;
else if(op==1)for(int i=l;i<=r;i++)a[i]=1;
else if(op==2)for(int i=l;i<=r;i++)a[i]^=1;
else if(op==3){
int ans=0;
for(int i=l;i<=r;i++)ans+=a[i];
cout<<ans<<endl;
}else if(op==4){
int f[N],ans=a[l];
f[l]=a[l];
for(int i=l+1;i<=r;i++)if(a[i]==1)f[i]=f[i-1]+1,ans=max(ans,f[i]);
else f[i]=0;
cout<<ans<<endl;
}
for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;
}
return 0;
}