POJ2828 Buy Tickets

转载自 https://www.cnblogs.com/zhengguiping--9876/p/4717024.html

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5;
struct seg { int l,r,sum; } t[N*4+10];
void build(int p,int l,int r)
{
	t[p].l=l;
	t[p].r=r;
	t[p].sum=r-l+1;
	if(l==r) return;
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
}
void modify(int p,int l)
{
	if(t[p].l==t[p].r)
	{
		t[p].sum--;
		return;
	}
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) modify(p*2,l);
	else modify(p*2+1,l);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
int query(int p,int k)
{
	if(t[p].l==t[p].r) return t[p].l;
	if(t[p*2].sum<k) return query(p*2+1,k-t[p*2].sum);
	else return query(p*2,k);
}
int pos[N+10],val[N+10];
int n,a[N+10];
void sol()
{
	build(1,1,n);
	for(int i=n;i;i--)
	{
		int zzt=query(1,pos[i]);
		a[zzt]=val[i];
		modify(1,zzt);
	}
	for(int i=1;i<=n;i++) printf("%d ",a[i]);
	putchar('\n');
}
int main()
{
	while(~scanf("%d",&n))
	{
		for(int i=1;i<=n;i++) scanf("%d%d",&pos[i],&val[i]),pos[i]++;
		sol();
	}
	return 0;
}
posted @ 2020-10-26 20:28  zzt1208  阅读(118)  评论(0编辑  收藏  举报