啥也不是的代码求调
查看原帖
啥也不是的代码求调
1087520
sutiancheng楼主2024/8/1 21:44

蒟蒻代码:

#include<iostream>
#define ls x<<1
#define rs x<<1|1
using namespace std;
int n,m,q,in[100005];
struct tree
{
	int l,r,s;
	bool tag,tagb;
}a[400005];
struct in
{
	int l,r;
	bool op;
}b[100005];
void pushup(int x){a[x].s=a[ls].s+a[rs].s;}
void pushdown(int x)
{
	if(a[x].tagb)
	{
		a[ls].s=a[x].tag*(a[ls].r-a[ls].l+1);
		a[rs].s=a[x].tag*(a[rs].r-a[rs].l+1);
		a[ls].tag=a[rs].tag=a[x].tag;
		a[ls].tagb=a[rs].tagb=1;
		a[x].tagb=0;
	}
}
void build(int x,int l,int r)
{
	a[x].l=l,a[x].r=r;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void build1(int k,int x)
{
	a[x].tagb=0;
	if(a[x].l==a[x].r)
	{
		a[x].s=(in[x]>=k);
		return;
	}
	build1(k,ls);
	build1(k,rs);
	pushup(x);
}
void add(int x,int l,int r,bool ad)
{
	if(l<=a[x].l&&r>=a[x].r)
	{
		a[x].s=ad*(a[x].r-a[x].l+1);
		a[x].tag=ad;
		a[x].tagb=1;
		return;
	}
	pushdown(x);
	if(l<=a[ls].r)add(ls,l,r,ad);
	if(r>=a[rs].l)add(rs,l,r,ad);
	pushup(x);
}
int query(int x,int l,int r)
{
	if(l<=a[x].l&&r>=a[x].r)return a[x].s;
	pushdown(x);
	int ans=0;
	if(l<=a[ls].r)ans+=query(ls,l,r);
	if(r>=a[rs].l)ans+=query(rs,l,r);
	return ans;
}
bool find(int x)
{
	build1(x,1);
	for(int i=1;i<=m;i++)
	{
		int num=query(1,b[i].l,b[i].r);
		if(b[i].op)
		{
			add(1,b[i].l,b[i].l+num-1,1);
			add(1,b[i].l+num,b[i].r,0);
		}
		else
		{
			add(1,b[i].r-num+1,b[i].r,1);
			add(1,b[i].l,b[i].r-num,0);
		}
	}
	return query(1,q,q);
}
int main()
{
    cin>>n>>m;
    build(1,1,n);
    for(int i=1;i<=n;i++)cin>>in[i];
    for(int i=1;i<=m;i++)cin>>b[i].op>>b[i].l>>b[i].r;
    cin>>q;
    int l=1,r=n,ans;
    while(l<=r)
    {
    	int mid=(l+r)>>1;
    	if(find(mid))
    	{
    		l=mid+1;
    		ans=mid;
		}
		else r=mid-1;
	}
	cout<<ans;
    return 0;
}
2024/8/1 21:44
加载中...