求助样例多1
查看原帖
求助样例多1
1121412
Cute_Fish楼主2024/6/23 17:54

rt,线段树+二分,求大佬调

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
#define ls rt<<1
#define rs rt<<1|1
const int N=1e5+7;
const int inf=1e18;
int n,m,p,a[N]; 
struct ask{int op,l,r;}q[N];
struct tree{int x,lazy;}t[N<<2];
inline void pushup(int rt){t[rt].x=t[ls].x+t[rs].x;return;}
inline void addlazy(int rt,int l,int r,int C){
	t[rt].x=(r-l+1)*C;
	t[rt].lazy=C;
	return; 
}
inline void pushdown(int l,int r,int rt){
	int mid=(l+r)/2;
	if(t[rt].lazy){
		addlazy(ls,l,mid,t[rt].lazy);
		addlazy(rs,mid+1,r,t[rt].lazy);
		t[rt].lazy=0;
	}
}
inline void build(int l,int r,int rt,int C){
    t[rt].lazy=0;
	if(l==r){
		t[rt].x=(a[l]>=C);
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,ls,C);
	build(mid+1,r,rs,C);
	pushup(rt);
}
inline void update(int L,int R,int C,int l,int r,int rt){
	if(L<=l&&r<=R){
		addlazy(rt,l,r,C);
		return;
	}
	int mid=(l+r)/2;
	pushdown(l,r,rt);
	if(L<=mid)update(L,R,C,l,mid,ls);
	if(R>mid)update(L,R,C,mid+1,r,rs);
	pushup(rt);
}
inline int query(int L,int R,int l,int r,int rt){
	if(L>r||l>R)return 0;
	if(L<=l&&r<=R)return t[rt].x;
	int mid=(l+r)/2;
	pushdown(l,r,rt);
	return query(L,R,l,mid,ls)+query(L,R,mid+1,r,rs);
}
inline bool f(int x){
	build(1,n,1,x);
	for(int i=1;i<=m;i++){
		int L=q[i].l,R=q[i].r;
		int tmp=query(L,R,1,n,1);
		if(q[i].op==0){
			update(R-tmp+1,R,1,1,n,1);
			update(L,R-tmp,0,1,n,1);
		}else{
			update(L,L+tmp-1,1,1,n,1);
			update(L+tmp,R,0,1,n,1);
		}
	}
	return query(p,p,1,n,1);
}
inline int solve(){
	int l=1,r=n,ans=0;
	while(l<=r){
		int mid=(l+r)/2;
		if(f(mid))ans=mid,l=mid+1;
		else r=mid-1;
	}
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++)cin>>q[i].op>>q[i].l>>q[i].r;
	cin>>p;
	cout<<solve()<<"\n";
}
2024/6/23 17:54
加载中...