请问我哪里错了re0分
查看原帖
请问我哪里错了re0分
717599
dengjunhaodejia09楼主2023/3/27 21:22
#include <bits/stdc++.h>
using namespace std;
int a[8000005],b[8000005];
int x[8000005],y[8000005],z[8000005];
int trues[8000005],tree[8000005],vis[8000005];
int n,m,q;
void chuli(int k,int mid,int L,int R){
	if(R<L){
		return;
	}
	if(vis[k]!=0){
		if(vis[2*k]!=0){
			chuli(2*k,(L+mid)/2,L,mid);
		}
		if(vis[2*k+1]!=0){
			chuli(2*k+1,(mid+1+R)/2,mid+1,R);
		}
		vis[2*k] = vis[k];
		vis[2*k+1] = vis[k];
		if(vis[k]==-1){
			tree[2*k] = 0;
			tree[2*k+1] = 0;
		}else{
			tree[2*k] = (mid - L + 1) * vis[k];
			tree[2*k+1] = (R - mid) * vis[k];
		}
		
	}
	vis[k] = 0;
}
void dfs(int k,int left,int right){
	if(right<left){
		return;
	}
	if(left==right){
		trues[k]=b[left];
		return;
	}
	int mid=(left+right)/2;
	dfs(k*2,left,mid);
	dfs(k*2+1,mid+1,right);
	trues[k]=trues[k*2]+trues[k*2+1];
	return;
}
void dfss(int k,int left,int right){
	if(right<left){
		return;
	}
	if(left==right){
		tree[k]=b[left];
		return;
	}
	int mid=(left+right)/2;
	dfss(k*2,left,mid);
	dfss(k*2+1,mid+1,right);
	tree[k]=tree[k*2]+tree[k*2+1];
	return;
}
void dfs2(int k,int TT,int GG,int L,int R){
	if(R<L){
		return;
	}
	if(L > GG){
		return;
	}
	if(TT > R){
		return;
	}
	if(TT <= L && R <= GG){
		vis[k]=1;
		tree[k] = (R - L + 1) *1; 
		return;
	}
	int mid=(L+R)/2;
	
	chuli(k,mid,L,R);
	dfs2(k*2, TT, GG, L, mid);
	dfs2(k*2+1, TT, GG, mid+1, R);
}

void dfs3(int k,int TT,int GG,int L,int R){
	if(R<L){
		return;
	}
	if(L > GG){
		return;
	}
	if(TT > R){
		return;
	}
	if(TT <= L && R <= GG){
		vis[k]=-1;
		tree[k] = 0;  
		return;
	}
	int mid=(L+R)/2;
	chuli(k,mid,L,R);
	dfs3(k*2, TT, GG, L, mid);
	dfs3(k*2+1, TT, GG, mid+1, R);
}
int dfs4(int k,int TT,int GG,int L,int R){
	if(R<L){
		return 0;
	}
	if(L > GG){
		return 0;
	}
	if(TT > R){
		return 0;
	}
	if(TT <= L && R <= GG){
		return tree[k];
	}
	int mid=(L+R)/2;
	chuli(k,mid,L,R);
	int value = dfs4(k*2, TT, GG, L, mid);
	value += dfs4(k*2+1, TT, GG, mid+1, R);
	return value;
}
int check(int mid){
	memset(trues,0,sizeof(trues));
	memset(tree,0,sizeof(tree));
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++){
		if(a[i]<mid){
			b[i]=0;
		}else b[i]=1;
		
	}
	dfs(1,1,n);
	dfss(1,1,n);
	for(int i=1;i<=m;i++){
		if(x[i]==1){
			int j=dfs4(1,y[i],z[i],1,n);
			dfs2(1,y[i],y[i]+j-1,1,n);
			dfs3(1,y[i]+j,z[i],1,n);
		}else{
			int j=dfs4(1,y[i],z[i],1,n);
			dfs2(1,z[i]-j+1,z[i],1,n);
			dfs3(1,y[i],z[i]-j,1,n);
		}
	}
	
	if(dfs4(1,q,q,1,n)!=1){
		return 0;
	}else{
		return 1;
	}
	
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>x[i]>>y[i]>>z[i];
	}
	cin>>q;
	int l=1,r=n,mid=0,ans=0;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	cout<<ans;
	return 0;
} 
              
2023/3/27 21:22
加载中...