分块WA求助
查看原帖
分块WA求助
115668
y0y68楼主2020/9/3 13:28

WA+TLE,不知有两个点为啥WA了,如果那两个点AC了,我觉得卡卡常就能过

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define re register
using namespace std;
const int N=1e6+5;
bool anc[N];//一个块是否为先辈
int n,m,size,a[N],f[N],s[N],e[N],mn[N],mx[N],tag[N];
void in(int &x){
	char c;x=0;int tmp=1;
	for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')tmp=-1;
	for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);
	x*=tmp;
}
void reset(int x){
	for(re int i=s[x];i<=e[x];i++)
		a[i]+=tag[x];
	tag[x]=0,anc[x]=false;
	mx[x]=1u/2,mn[x]=-1u/2;
	for(re int i=s[x];i<e[x];i++)
		if(a[i]>a[i+1]){anc[x]=true;break;}
	for(re int i=s[x];i<=e[x];i++){
		mn[x]=min(mn[x],a[i]);
		mx[x]=max(mx[x],a[i]);
	}
}
void update(int l,int r,int x){
	if(f[l]==f[r]){
		for(re int i=l;i<=r;i++)a[i]+=x;
	}
	else{
	    int top=e[f[l]];
		for(re int i=l;i<=top;i++)a[i]+=x;
		for(re int i=s[f[r]];i<=r;i++)a[i]+=x;
		for(re int i=f[l]+1;i<f[r];i++)tag[i]+=x;
	}
}
bool query(int l,int r){
	if(f[l]==f[r]){
		reset(f[l]);
		for(re int i=l;i<r;i++)
			if(a[i]>a[i+1])return false;
	}
	else{
		reset(f[l]);reset(f[r]);
		for(re int i=f[l]+1;i<f[r];i++)
			if(anc[i])return false;
		for(re int i=f[l]+1;i<f[r]-1;i++)
			if(mx[i]>mn[i+1])return false;
		int top=e[f[l]];
		int tmx=a[top];
		for(re int i=l;i<top;i++){
			tmx=max(tmx,a[i]);
			if(a[i]>a[i+1])return false;
		}
		if(tmx>mn[f[l]+1])return false;
		int tmn=a[r];
		for(re int i=s[f[r]];i<r;i++){
			tmn=min(tmn,a[i]);
			if(a[i]>a[i+1])return false;
		}
		if(mx[f[r]-1]>tmn)return false;
	}
	return true;
}
int main(){
	in(n),in(m),size=sqrt(n);
	for(re int i=1;i<=n;i++)in(a[i]);
	for(re int i=1;i<=n;i++)
		f[i]=(i-1)/size+1,e[f[i]]=i;
	for(re int i=n;i>=1;i--)
		s[f[i]]=i;
	for(re int i=1;i<=f[n];i++){
		mn[i]=mx[i]=a[e[i]];
		for(re int j=s[i];j<e[i];j++){
			mn[i]=min(mn[i],a[j]);
			mx[i]=max(mx[i],a[j]);
			if(a[j]>a[j+1])anc[i]=true;
		}
	}
	while(m--){
		int opt;in(opt);
		if(opt&1){
			int l,r,x;
			in(l),in(r),in(x);
			update(l,r,x);
		}
		else{
			int l,r;in(l),in(r);
			puts(query(l,r)?"Yes":"No");
		}
	}
	return 0;
}
2020/9/3 13:28
加载中...