比赛 树状数组练习 评测结果 AAAAAAAAAA
题目名称 排队买票 最终得分 100
用户昵称 ChenBp 运行时间 0.331 s
代码语言 C++ 内存使用 4.75 MiB
提交时间 2025-06-15 08:33:29
显示代码纯文本
#include <iostream>
#include <cstring>
using namespace std;
const int N=2e5+5;
int lb(int x) {
	return x&(-x);
}
int n;
int tree[N];
void add(int x,int y) {
	for(int i=x; i<=n; i+=lb(i)) {
		tree[i]+=y;
	}
}
int q(int x) {
	int ans=0;
	for(int i=x; i>0; i-=lb(i)) {
		ans+=tree[i];
	}
	return ans;
}
struct node {
	int p,v;
} a[N];
int ans[N];

int f(int x) {
	int l=1,r=n;
	while(l<=r) {
		int mid=(l+r)/2;
		if(q(mid)>=x) {
			r=mid-1;
		} else {
			l=mid+1;
		}
	}
	return l;
}
int main() {
	freopen("buytickets.in","r",stdin);
	freopen("buytickets.out","w",stdout);
	while(cin>>n) {
		memset(tree,0,sizeof(tree));
		for(int i=1; i<=n; i++) {
			add(i,1);
			cin>>a[i].p>>a[i].v;
		}
		for(int i=n; i>=1; i--) {
			int p=a[i].p,v=a[i].v;
			int pos=f(p+1);
			ans[pos]=v;
			add(pos,-1);
		}
		for(int i=1; i<=n; i++) {
			cout<<ans[i]<<" ";
		}
		cout<<endl;
	}
	return 0;
}