POJ2828 Buy Tickets

考虑如果顺序模拟会T,注意到最后一个元素一定在它确定的位置,考虑从后往前放,找第k个空位,完美解决这题;

 1 #include<iostream>
 2 #include<cstdio>
 3 #define ls (x<<1)
 4 #define rs (x<<1|1)
 5 using namespace std;
 6 const int N=2e5+5;
 7 int sum[N<<2],p[N],v[N],ans[N],n;
 8 
 9 void update(int x)
10 {
11     sum[x]=sum[ls]+sum[rs];
12 }
13 void build(int l,int r,int x)
14 {
15     if(l==r)
16     {
17         sum[x]=1;
18         return ;
19     }
20     int mid=(l+r)>>1;
21     build(l,mid,ls);
22     build(mid+1,r,rs);
23     update(x);
24 }
25 void modify(int l,int r,int x,int val,int k)
26 {
27     if(l==r)
28     {
29         sum[x]=0;
30         ans[l]=val;
31         return;
32     }
33     int mid=(l+r)>>1;
34     if(sum[ls]>=k)modify(l,mid,ls,val,k);
35     else modify(mid+1,r,rs,val,k-sum[ls]);
36     update(x); 
37 }
38 int main()
39 {
40     while(~scanf("%d",&n))
41     {
42         for(int i=1;i<=n;i++)scanf("%d%d",&p[i],&v[i]); 
43         build(1,n,1);
44         for(int i=n;i;i--)    modify(1,n,1,v[i],p[i]+1);
45         for(int i=1;i<=n;i++)printf("%d%c",ans[i],(i<n)?' ':'\n');
46     }
47     return 0;
48 }

 

上一篇:GO_数组


下一篇:JZOJ 3745. 【NOI2014模拟7.14】Problem A