求助求助大佬求助
查看原帖
求助求助大佬求助
817825
linminmohan楼主2024/11/19 16:59

真不知道错哪了 调了好久 check(6) 的值一直是 1

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define il inline
#define mid (l+r>>1)
#define ls fa<<1
#define rs fa<<1|1

const int maxn=1e5+5;

int n, m, q, ll=1, rr, op, ans, cnt;
int a[maxn], tr[maxn<<4], lazy[maxn<<4];
struct node{
	int op, pl, pr;
}make[maxn];

il int read()
{
	int num=0, f=1;
	char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	return num*f;
}

il void build(int fa,int l,int r,int x)
{
  lazy[fa]=0;
	if(l==r)
	{
		tr[fa]=(a[l]>=x);
		return;
	}
	build(ls,l,mid,x);
	build(rs,mid+1,r,x);
	tr[fa]=tr[ls]+tr[rs];
	return;
}

il void down(int fa,int l,int r)
{
	if (!lazy[fa]) return;
    lazy[ls]=lazy[rs]=lazy[fa];
    if (lazy[fa]==1){
        tr[ls]=mid-l+1; 
		tr[rs]=r-mid;
    }
    else tr[ls]=tr[rs]=0;
    lazy[fa]=0;
}

il int query(int fa,int l,int r,int ql,int qr)
{
	if(ql<=l&&qr>=r) return tr[fa];
	if(ql>r||qr<l) return 0;
	down(fa,l,r);
	return query(ls,l,mid,ql,qr)+query(rs,mid+1,r,ql,qr);
}

il void chang(int fa,int l,int r,int ql,int qr,int x)
{
	if(ql<=l&&qr>=r)
	{
		lazy[fa]=x?1:-1;
	    tr[fa]+=x*(r-l+1);
		return;
	}
	down(fa,l,r);
	if(ql<=mid) chang(ls,l,mid,ql,qr,x);
	if(qr>mid) chang(rs,mid+1,r,ql,qr,x);
	tr[fa]=tr[ls]+tr[rs];
}

il bool check(int x)
{
	build(1,1,n,x);
	for(int i=1;i<=m;i++)
	{
		int sum=query(1,1,n,make[i].pl,make[i].pr);
		if(sum==0) chang(1,1,n,make[i].pl,make[i].pr,0);
		else if(sum==make[i].pr-make[i].pl+1) chang(1,1,n,make[i].pl,make[i].pr,1);
		else
		{
			if(make[i].op==0)
		    {
			    chang(1,1,n,make[i].pr-sum+1,make[i].pr,1);
			    chang(1,1,n,make[i].pl,make[i].pr-sum,0);
		    }
		    else
		    {
		        chang(1,1,n,make[i].pl,make[i].pl+sum-1,1);
			    chang(1,1,n,make[i].pl+sum,make[i].pr,0);
		    }
		   
		}
	} 
	return query(1,1,n,q,q);
}

signed main()
{
	n=read();m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++)
	{
		make[i].op=read();
		make[i].pl=read();
		make[i].pr=read();
	}
	q=read();
	rr=n;
	while(ll<=rr)
	{
		cnt=(ll+rr)>>1;
		if(check(cnt))
		{ a
			ans=cnt;
			ll=cnt+1;
		}
		else rr=cnt-1;
	}
	printf("%d",ans);
	return 0;
}
2024/11/19 16:59
加载中...