WA零分,求调(样例过了)
查看原帖
WA零分,求调(样例过了)
1006074
jhvjh楼主2024/8/1 17:07
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100009],b[100009],xds[400009],n,m,lazy[400009],aans;
struct n1{
	int op,l,r;
}cao[100009];
inline int chu(int x,int l,int r){
	if(l==r) {
		xds[x]=b[l];
		return b[l];
	}
	xds[x]=0;
	int mid=(r+l)/2;
	xds[x]+=chu(x*2,l,mid);
	xds[x]+=chu(x*2+1,mid+1,r);
	return xds[x];
}
inline int cha(int x,int l,int r,int xl,int xr){
	if(r<xl||l>xr) return 0;
	if(l==r){
		if(lazy[x]==-1) return xds[x];
		return lazy[x];
	}
	if(xl<=l&&xr>=r){
		return xds[x];
	}
	int mid=(r+l)/2;
	if(lazy[x]==0){
		lazy[x*2]=0,lazy[x*2+1]=0;
		xds[x*2]=0,xds[x*2+1]=0;
		lazy[x]=-1;
		xds[x]=0;
	}
	if(lazy[x]==1){
		lazy[x*2]=1,lazy[x*2+1]=1;
		xds[x*2]=mid-l+1,xds[x*2+1]=r-mid;
		lazy[x]=-1;
		xds[x]=r-l+1;
	}
	int summ=0;
	summ+=cha(x*2,l,mid,xl,xr);
	summ+=cha(x*2+1,mid+1,r,xl,xr);
	return summ;
}
inline int xiu(int x,int l,int r,int xl,int xr,int d){
	if(r<xl||l>xr) return 0;
	int mid=(r+l)/2;
	if(l==r) {
		xds[x]=d;
		return xds[x];
	}
	if(lazy[x]==0){
		lazy[x*2]=0,lazy[x*2+1]=0;
		xds[x*2]=0,xds[x*2+1]=0;
		lazy[x]=-1;
	}
	if(lazy[x]==1){
		lazy[x*2]=1,lazy[x*2+1]=1;
		xds[x*2]=mid-l+1,xds[x*2+1]=r-mid;
		lazy[x]=-1;
	}
	if(xl<=l&&xr>=r){
		if(d==0) xds[x]=0;
		if(d==1) xds[x]=r-l+1;
		lazy[x]=d;
		return xds[x];
	}
	int summ=0;
	if(xl<=mid) summ+=xiu(x*2,l,mid,xl,xr,d);
	else{
		summ+=xds[x*2];
	}
	if(xr>mid) summ+=xiu(x*2+1,mid+1,r,xl,xr,d);
	else{
		summ+=xds[x*2+1];
	}
	return summ;
}
inline bool check(int mid){
	for(int i=1;i<=n;i++){
		if(a[i]>=mid) b[i]=1;
		else  b[i]=0;
	}
	memset(lazy,-1,sizeof lazy);
	chu(1,1,n);
	for(int i=1;i<=m;i++){
		int op=cao[i].op,l=cao[i].l,r=cao[i].r;
		int v=cha(1,1,n,l,r);
		if(op==0){
			
			if(l<=r-v)xiu(1,1,n,l,r-v,0);
			if(r-v+1<=r)xiu(1,1,n,r-v+1,r,1);
		}
		if(op==1){
			if(l<=l+v-1)xiu(1,1,n,l,l+v-1,1);
			if(l+v<=r)xiu(1,1,n,l+v,r,0);
		}
	}
	if(cha(1,1,n,aans,aans)>1) while(1);
	
	return cha(1,1,n,aans,aans);
}
inline void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>cao[i].op>>cao[i].l>>cao[i].r;
	}
	cin>>aans;
	int l=1,r=n;
	while(l<r){
		int mid=l+(r-l+1)/2;
		if(check(mid)==1) l=mid;
		else r=mid-1;
	}
	cout<<l<<'\n';
}
signed main(){
	solve();
	return 0;
}
2024/8/1 17:07
加载中...