比赛 |
树状数组练习 |
评测结果 |
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;
}