线段树+二分求助
查看原帖
线段树+二分求助
174806
xbb2楼主2022/8/5 19:33
#include<bits/stdc++.h>
using namespace std;
const int N=4e6+10;
int a[N];
struct tree{
	int d[N],b[N],x;
	void build(int s,int t,int p){
		b[p]=-1;if(s==t){d[p]=(int)(a[s]>=x);return ;}
		int m=s+((t-s)>>1);
		build(s,m,p*2),build(m+1,t,p*2+1);
		d[p]=d[p*2]+d[p*2+1];
	}
	void update(int l,int r,int c,int s,int t,int p){
		if(l<=s&&t<=r){d[p]=(t-s+1)*c,b[p]=c;return;}
		if(t<l||s>r)return ;
		int m=s+((t-s>>1));
		if(b[p]!=-1){
			d[p*2]=b[p]*(m-s+1),b[p*2]=b[p];
			d[p*2+1]=b[p]*(t-m),b[p*2+1]=b[p];
			b[p]=-1;
		}
		if(l<=m)update(l,r,c,s,m,p*2);
		if(m<r)	update(l,r,c,m+1,t,p*2+1);
		d[p]=d[p*2]+d[p*2+1];
	}
	int getans(int l,int r,int s,int t,int p){
		if(l<=s&&t<=r)return d[p];
		int m=s+((t-s>>1)),ans=0;
		if(b[p]!=-1){
			d[p*2]=b[p]*(m-s+1),b[p*2]=b[p];
			d[p*2+1]=b[p]*(t-m),b[p*2+1]=b[p];
			b[p]=-1;
		}
		if(l<=m)ans+=getans(l,r,s,m,p*2);
		if(m<r)	ans+=getans(l,r,m+1,t,p*2+1);
		return ans;
	}
}T;
int l[N],r[N],op[N],n,m,q,ans=0;
bool check(int x){
	T.x=x,T.build(1,n,1);
	for(int i=1;i<=m;i++){
		int sum=T.getans(l[i],r[i],1,n,1);
		if(op[i]==0){
            T.update(r[i]-sum+1,r[i],1,1,n,1);
            T.update(l[i],r[i]-sum,0,1,n,1);
        }
        else{
            T.update(l[i],l[i]-sum-1,1,1,n,1);
            T.update(l[i]+sum,r[i],0,1,n,1);
        }
	}
	return T.getans(q,q,1,n,1);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=m;i++)scanf("%d%d%d",&op[i],&l[i],&r[i]);
	cin>>q;int l1=1,r1=n;
	while(l1<=r1){
		int mid=((l1+r1)>>1);
		if(check(mid))ans=max(mid,ans),l1=mid+1;
		else r1=mid-1;
	}
	printf("%d",ans);
	return 0;
}

样例过了 WA0%

2022/8/5 19:33
加载中...