调到崩溃,哪位大佬帮忙看看
查看原帖
调到崩溃,哪位大佬帮忙看看
648660
Name1楼主2022/5/25 14:09

一直爆,到底是为什么,貌似是updata的问题

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int n,m,p,a[N],sign[N],L[N],R[N],ans,g[N>>2],lazy[N>>2];
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*f;
}
void build(int x,int l,int r,int tot)
{
	if(l==r)
	{
		g[x]=(a[l]>=tot);
		lazy[x]=0;
		return;
	}
	int mid=(l+r)>>1;
	build(x<<1,l,mid,tot);
	build(x<<1|1,mid+1,r,tot);
	g[x]=g[x<<1]+g[x<<1|1],lazy[x]=0;
}
void pushdown(int x,int l,int r,int mid)
{
	if(!lazy[x])return;
	lazy[x<<1]=lazy[x<<1|1]=lazy[x];
	if(lazy[x]==1)g[x<<1]=mid-l+1,g[x<<1|1]=r-mid;
	else g[x<<1]=g[x<<1|1]=0;
	lazy[x]=0;
}
int query(int x,int l,int r,int ql,int qr)
{
	if(ql==l&&r==qr)return g[x];
	int mid=(l+r)>>1;
	pushdown(x,l,r,mid);
	if(ql<=mid&&qr>mid)return query(x<<1,l,mid,ql,mid)+query(x<<1|1,mid+1,r,mid+1,qr);
	else if(qr<=mid)return query(x<<1,l,mid,ql,qr);
	else return query(x<<1|1,mid+1,r,ql,qr);
}
void updata(int x,int l,int r,int ql,int qr,int val)
{
	if(ql==l&&r==qr)
	{
		g[x]=(r-l+1)*val;lazy[x]=val?1:-1;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r,mid);
	if(ql<=mid&&qr>mid)
	{
		updata(x<<1,l,mid,ql,mid,val);
		updata(x<<1|1,mid+1,r,mid+1,qr,val);
	}
	else if(qr<=mid)updata(x<<1,l,mid,ql,qr,val);
	else updata(x<<1|1,mid+1,r,ql,qr,val);
	g[x]=g[x<<1]+g[x<<1|1];
}
int check(int x)
{
	build(1,1,n,x);
	for(int i=1;i<=m;i++)
	{
		int l=L[i],r=R[i];int tot=query(1,1,n,l,r);
		if(sign[x]==0)
		{
			updata(1,1,n,l,r-tot,0);
			updata(1,1,n,r-tot+1,r,1);
		}
		else 
		{
			updata(1,1,n,l,l+tot-1,1);
			updata(1,1,n,l+tot,r,0);
		}
	}
	return query(1,1,n,p,p);
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=m;i++)sign[i]=read(),L[i]=read(),R[i]=read();
	p=read();
	int ll = 1, rr = n, midd;
    while(ll<=rr){
        midd=(ll+rr)>>1;
        if(check(midd))ans=midd,ll=midd+1;else rr=midd-1;
    }
	printf("%d",ans);
	return 0;
}
2022/5/25 14:09
加载中...