萌新线段树水题RE求助
查看原帖
萌新线段树水题RE求助
108610
Dzhao楼主2020/8/22 23:15

感觉没什么问题,不知道为什么就是60分RE,希望大佬帮忙看一下

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,q,a[N],op[N],L[N],R[N],tr[N<<2],tag[N<<2];
void build(int p,int l,int r,int x)
{
	if(l==r)
	{
		tr[p]=a[l]>=x;
		tag[p]=-1;
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid,x);
	build(p<<1|1,mid+1,r,x);
	tr[p]=tr[p<<1]+tr[p<<1|1];tag[p]=-1;
}
inline void push_down(int p,int ln,int rn)
{
	if(tag[p]!=-1) 
	{
		tag[p<<1]=tag[p];
		tag[p<<1|1]=tag[p];
		tr[p<<1]=tag[p]*ln;
		tr[p<<1|1]=tag[p]*rn;
		tag[p]=-1;
	}
}
void modify(int p,int l,int r,int x,int y,int z)
{
	if(l>=x && r<=y) 
	{
		tr[p]=z*(r-l+1);
		tag[p]=z;
		return;
	}
	int mid=(l+r)>>1;
	push_down(p,mid-l+1,r-mid);
	if(mid>=x) modify(p<<1,l,mid,x,y,z);
	if(mid<y) modify(p<<1|1,mid+1,r,x,y,z);
	tr[p]=tr[p<<1]+tr[p<<1|1];
}
int query(int p,int l,int r,int x,int y)
{
	if(l>=x && r<=y) return tr[p];
	int mid=(l+r)>>1,res=0;
	push_down(p,mid-l+1,r-mid);
	if(mid>=x) res+=query(p<<1,l,mid,x,y);
	if(mid<y) res+=query(p<<1|1,mid+1,r,x,y);
	return res;
}
inline bool check(int x)
{
	build(1,1,n,x);
	for(int i=1;i<=m;i++)
	{
		int cnt1=query(1,1,n,L[i],R[i]);
		if(op[i]==0)
		{
			modify(1,1,n,R[i]-cnt1+1,R[i],1);
			modify(1,1,n,L[i],R[i]-cnt1,0);
		}
		else 
		{
			modify(1,1,n,L[i],L[i]+cnt1-1,1);
			modify(1,1,n,L[i]+cnt1,R[i],0);
		}
	}
	return query(1,1,n,q,q);
}

int main()
{
	scanf("%d%d",&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]);
	scanf("%d",&q);
	int l=1,r=n,ans=0;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(check(mid)) ans=mid,l=mid+1;
		else r=mid-1;
	}
	printf("%d\n",ans);
	return 0;
}
2020/8/22 23:15
加载中...