POJ 2828 Buy Tickets

来源:互联网 发布:c 生命数组 编辑:程序博客网 时间:2024/05/21 01:54
题意:N个人插队,每一个人会给你他要插到第几个位置,和他的价值;输出最后的顺序;
思路:逆序,按照空位确定位置!!!

附AC代码

#include<stdio.h>#include<iostream>using namespace std;int tree[200000*4];struct node{int tot,v;}num[200000];int ans[200000];void bulid(int l,int r,int index){if(l==r){tree[index]=1;return ;}int mid=(l+r)/2;bulid(l,mid,index*2);bulid(mid+1,r,index*2+1);tree[index]=tree[index*2]+tree[index*2+1];}void insert(int k,int l,int r,int index,int x){int mid=(l+r)/2;if(l==r){tree[index]=0;ans[l]=x;return ;}if(k<=tree[index*2]){insert(k,l,mid,index*2,x);}else{insert(k-tree[index*2],mid+1,r,index*2+1,x);}tree[index]=tree[index*2]+tree[index*2+1];return ;}int main(){int i,j,n,m;while(scanf("%d",&n)!=EOF){bulid(1,n,1);for(i=1;i<=n;i++){scanf("%d%d",&num[i].tot,&num[i].v);}for(i=n;i>=1;i--){insert(num[i].tot+1,1,n,1,num[i].v);}for(i=1;i<n;i++)printf("%d ",ans[i]);printf("%d\n",ans[i]);}return 0;}


0 0
原创粉丝点击