0pts,样例过了求调qwq
查看原帖
0pts,样例过了求调qwq
930076
mmdxmakioi楼主2023/3/24 14:12
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
int n,m;
struct node
{
	int d,p,l;
	bool operator < (const node &aaa)const
	{
		return d<aaa.d;
	}
}juice[100001];
int cnt;
int mx;
int T[100000];
struct node2
{
	int l,r,v,p;
}Tree[2000001];
int build(int l,int r)
{
	int rt=++cnt;
	if(l==r)
	return rt;
	int mid =(l+r)/2;
	Tree[rt].l=build(l,mid);
	Tree[rt].r=build(mid+1,r);
	return rt;
}
int update(int pre,int l,int r,int price,int size)
{
	int rt=++cnt;
	Tree[rt].l=Tree[pre].l;
	Tree[rt].r=Tree[pre].r;
	Tree[rt].p=Tree[pre].p+price*size;
	Tree[rt].v=Tree[pre].v+size;
	if(l==r)
	{
		return rt;
	}
	int mid=(l+r)/2;
	if(mid<=price)
	{
		Tree[rt].l=update(Tree[pre].l,l,mid,price,size);
	}
	else
	{
		Tree[rt].r=update(Tree[pre].r,mid+1,r,price,size);
	}
//	Tree[rt].p=Tree[Tree[rt].l].p+Tree[Tree[rt].r].p;
//	Tree[rt].v=Tree[Tree[rt].l].v+Tree[Tree[rt].r].v;
	return rt;
}
int query(int u,int v,int l,int r,int sy)
{
	if(l==r)
	{
		return sy*l;
	}
	int mid=(l+r)/2;
	int tot=Tree[Tree[v].l].v-Tree[Tree[u-1].l].v;
	if(sy<=tot)
	{
		return query(Tree[u].l,Tree[v].l,l,mid,sy);
	}
	else
	{
		return Tree[Tree[v].l].p-Tree[Tree[u-1].l].p+query(Tree[u].r,Tree[v].r,mid+1,r,sy-tot);
	}
}
signed main()
{
	int i,j;
	scanf("%lld%lld",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%lld%lld%lld",&juice[i].d,&juice[i].p,&juice[i].l);
		mx=max(mx,juice[i].p);
	}
	sort(juice+1,juice+1+n);
	T[0]=build(1,mx);
	for(i=1;i<=n;i++)
	{
		T[i]=update(T[i-1],1,mx,juice[i].p,juice[i].l);
	}
//	for(i=1;i<=n;i++)
//	{
//		printf("%lld ",Tree[T[i]].v);
//	}
//	printf("\n");
	for(i=1;i<=m;i++)
	{
		int g,l;
		scanf("%lld%lld",&g,&l);
		int lft,rgt,ans=-1;
		lft=1;
		rgt=juice[n].d;
		while(lft<=rgt)
		{
			int mid=(lft+rgt)/2;
//			int q=query(T[mid],T[n],1,mx,l);
//			int e=Tree[T[n]].v-Tree[T[mid-1]].v;
//			printf("%lld %lld %lld %lld %lld\n",q,e,mid,Tree[T[n]].v,Tree[T[mid-1]].v);
			if(query(T[mid],T[n],1,mx,l)<=g&&Tree[T[n]].v-Tree[T[mid-1]].v>=l)
			{
				lft=mid+1;
				ans=mid;
			}
			else
			{
				rgt=mid-1;
			}
		}
		if(ans==-1)
		printf("%lld\n",-1ll);
		else
		printf("%lld\n",juice[ans].d);
	}
}

刚学主席树,不太会。

2023/3/24 14:12
加载中...