整体二分+权值线段树求调教
查看原帖
整体二分+权值线段树求调教
754502
_AyachiNene楼主2024/3/5 14:38
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int res=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
	return res*f;
}
void write(int x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
//-------SegmentTreeBegin-------
namespace Elaina
{
	struct node
	{
		int l,r,val,cnt;
	}t[114514<<5];
	int cnt,rt;
	int insert(int x,int l,int r,int root,int v)
	{
		if(!root)
			root=++cnt;
		if(l==r)
		{
			t[root].val+=v*l;
			t[root].cnt+=v;
			return root;
		}
		int mid=l+r>>1;
		if(x<=mid) t[root].l=insert(x,l,mid,t[root].l,v);
		else t[root].r=insert(x,mid+1,r,t[root].r,v);
		t[root].val=t[t[root].l].val+t[t[root].r].val;
		t[root].cnt=t[t[root].l].cnt+t[t[root].r].cnt;
		return root;
	}
	int query(int l,int r,int root,int k)
	{
		if(!root) return 1e18;
		if(l==r)
			return k*l;
		int mid=l+r>>1;	
		if(t[t[root].l].cnt<k)
			return t[t[root].l].val+query(mid+1,r,t[root].r,k-t[t[root].l].cnt);
		return query(l,mid,t[root].l,k);
	}
}
#define rt Elaina::rt
#define insert Elaina::insert
#define query Elaina::query
#define t Elaina::t
//--------SegmentTreeEnd--------
struct que
{
	int d,p,l,id,op;
}q[114514<<1],tmpl[114514<<1],tmpr[114514<<1];
int cnt;
int n,m;
int ans[114514<<1];
void solve(int x,int y,int l,int r)
{
	if(x>y) return;
	if(l==r)
	{
		for(int i=x;i<=y;i++)
			ans[q[i].id]=l;
		return;
	}
	int mid=l+r>>1;
	int cntl,cntr;
	cntl=cntr=0;
	for(int i=x;i<=y;i++)
		if(q[i].op==1)
		{
			if(q[i].d>=mid)
			{
				tmpr[++cntr]=q[i];
				rt=insert(q[i].p,1,1e18,rt,q[i].l);
			}
			else tmpl[++cntl]=q[i];
		}
//	cout<<x<<" "<<y<<" "<<mid<<endl;
//	for(int i=x;i<=y;i++)
//		cout<<q[i].d<<" "<<q[i].p<<" "<<q[i].l<<" "<<q[i].op<<" "<<q[i].id<<endl;
//	cout<<t[rt].cnt<<endl<<endl;
	for(int i=x;i<=y;i++)
		if(q[i].op==2)
		{
			if(q[i].p<=t[rt].cnt&&query(1,1e18,rt,q[i].p)<=q[i].d)
			{
				q[i].d-=query(1,1e18,rt,q[i].p);
				tmpr[++cntr]=q[i];
			}
			else
			{
				q[i].p-=t[rt].cnt;
				tmpl[++cntl]=q[i];
			}
		}
	for(int i=1;i<=cntl;i++)
		q[x+i-1]=tmpl[i];
	for(int i=1;i<=cntr;i++)
	{
		if(q[i].op==1)
			rt=insert(q[i].p,1,1e18,rt,-q[i].l);
		q[x+cntl+i-1]=tmpr[i];
	}
	solve(x,x+cntl-1,l,mid);
	solve(x+cntl,y,mid+1,r);
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		q[++cnt].d=read(),q[cnt].p=read(),q[cnt].l=read(),q[cnt].op=1;
	for(int i=1;i<=m;i++)
		q[++cnt].d=read(),q[cnt].p=read(),q[cnt].op=2,q[cnt].id=i,ans[i]=-1;
	solve(1,cnt,1,1e18);
	for(int i=1;i<=m;i++)
		write(ans[i]),puts("");
}
2024/3/5 14:38
加载中...