求助整体二分
查看原帖
求助整体二分
310581
ethan0328楼主2023/12/3 22:31

整体二分最后一个点MLE。

有大佬知道是为什么吗?

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
struct que
{
	int op,id,lb,rb,k;
};
int n,m,ind,a[N],t[N],out[N];
bool vis[N];
que q[N*3],q1[N*3],q2[N*3];
void ins(int x,int y,int z,int t1,int t2)
{
	ind++;
	q[ind].op=x;q[ind].id=y;
	q[ind].lb=z;q[ind].rb=t1;
	q[ind].k=t2;
}
void add(int x,int y)
{
	for(int i=x;i<=n;i+=i&(-i))
	{
		t[i]+=y;
	}
}
int gets(int x)
{
	int ret=0;
	for(int i=x;i;i-=i&(-i))
	{
		ret+=t[i];
	}
	return ret;
}
void work(int l,int r,int nl,int nr)
{
	if(nl>nr||l>r)
	{
		return;
	}
	if(l==r)
	{
		for(int i=nl;i<=nr;i++)
		{
			if(q[i].op==2)
			{
				out[q[i].id]=l;
				vis[q[i].id]=1;
			}
		}
		return;
	}
	int mid=(l+r)/2,c1=0,c2=0,x;
	for(int i=nl;i<=nr;i++)
	{
		if(q[i].op==1)
		{
			if(q[i].rb<=mid)
			{
				add(q[i].lb,q[i].k);
				q1[++c1]=q[i];
			}else
			{
				q2[++c2]=q[i];
			}
		}else
		{
			x=gets(q[i].rb)-gets(q[i].lb-1);
			if(q[i].k<=x)
			{
				q1[++c1]=q[i];
			}else
			{
				q[i].k-=x;
				q2[++c2]=q[i];
			}
		}
	}
	for(int i=1;i<=c1;i++)
	{
		if(q1[i].op==1)
		{
			add(q1[i].lb,-q1[i].k);
		}
	}
	for(int i=1;i<=c1;i++)
	{
		q[nl+i-1]=q1[i];
	}
	for(int i=1;i<=c2;i++)
	{
		q[nl+c1+i-1]=q2[i];
	}
	work(l,mid,nl,nl+c1-1);
	work(mid+1,r,nl+c1,nr);
}
signed main()
{
	int x,y,z;
	char op;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		a[i]=x;
		ins(1,0,i,x,1);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>op>>x>>y;
		if(op=='C')
		{
			ins(1,i,x,a[x],-1);
			ins(1,i,x,y,1);
			a[x]=y;
		}else
		{
			cin>>z;
			ins(2,i,x,y,z);
		}
	}
	work(-1,2e9,1,ind);
	for(int i=1;i<=m;i++)
	{
		if(vis[i])
		{
			cout<<out[i]<<"\n";
		}
	}
}
2023/12/3 22:31
加载中...