样例没过,求调,赏3关注
查看原帖
样例没过,求调,赏3关注
366430
AndyC楼主2024/7/8 11:28
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;}

int n,m,a[500005],sum[500005],b[500005],x,y,num;
int lazy[500005];

struct node{
	int opt,ll,rr;
} in[100005];

void push_down(int rt,int l,int r){
	if(~lazy[rt]){
		int mid=r+l>>1;
		sum[rt<<1]=(mid-l+1)*lazy[rt];
		lazy[rt<<1]=lazy[rt];
		
		sum[rt<<1|1]=(r-mid+1)*lazy[rt];
		lazy[rt<<1|1]=lazy[rt];
		
		lazy[rt]=-1;
	}
}

void push_up(int rt){
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void build(int rt,int l,int r){
	if(l==r){
		sum[rt]=a[r];
		return;
	}
	int m=r+l>>1;
	build(rt<<1,l,m);
	build(rt<<1|1,m+1,r);
	push_up(rt);
}

void update(int rt,int l,int r,int ll,int rr,int val){
	if(rr<r||ll>l){
		return;
	}
	if(ll<=l&&rr>=r){
		sum[rt]=(r-l+1)*val;
		lazy[rt]=val;
		return;
	}
	int mid=r+l>>1;
	push_down(rt,l,r);
	if(ll<=mid) update(rt<<1,l,mid,ll,rr,val);
	if(mid<rr) update(rt<<1|1,mid+1,r,ll,rr,val);
	push_up(rt);
}

int query(int rt,int l,int r,int ll,int rr){
	if(ll<=l&&rr>=r){
		return sum[rt];
	}
	push_down(rt,l,r);
	int m=r+l>>1;
	int res=0;
	if(ll<=m) res+=query(rt<<1,l,m,ll,rr);
	if(rr>m) res+=query(rt<<1|1,m+1,r,ll,rr);
	return res;
}

signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		b[i]=read();
	}
	memset(lazy,-1,sizeof(lazy));
	for(int i=1;i<=m;i++) in[i].opt=read(),in[i].ll=read(),in[i].rr=read();
	int WANT=read(); 
	int l=1,r=n,ans;
	while(l<=r){
		int mid=r+l>>1;
		for(int i=1;i<=n;i++){
			if(b[i]>=mid) a[i]=1;
			else a[i]=0;
		}
		build(1,1,n);
		for(int i=1;i<=m;i++){
			int nowl=in[i].ll,nowr=in[i].rr;
			int ones=query(1,1,n,nowl,nowr);
			int zeros=nowr-nowl+1-ones;
			int cnt1=query(1,1,n,nowl,nowr);
			if(in[i].opt==1){
				//从大到小 
				update(1,1,n,l,l+ones-1,1);
				update(1,1,n,l+ones,r,0);
			}
			else{
				//从小到大
//				update(1,1,n,r-ones+1,r,1);
//				update(1,1,n,l,r-ones,1);
				update(1,1,n,l,l+zeros-1,0);
				update(1,1,n,l+zeros,r,1);
			} 
		}
		if(query(1,1,n,WANT,WANT)==1) {
			ans=mid;
			l=mid+1;
		}
		else r=mid-1;
	}
	cout<<ans<<endl;
}
2024/7/8 11:28
加载中...