poj 2828 线段树

   知道了这个解法,让我很兴奋。

   好,多余的话不说,上代码。

 1 #include <stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 222222
 5 int val[maxn],sum[maxn<<2],pos[maxn],res[maxn];
 6 int id;
 7 void build(int l,int r,int rt)
 8 {
 9     sum[rt]=r-l+1;
10     if(l==r)
11         return;
12     int m=(l+r)>>1;
13     build(lson);
14     build(rson);
15 }
16 void update(int p,int l,int r,int rt)
17 {
18     sum[rt]--;
19     if(l==r)
20     {
21         id=l;
22         return;
23     }
24     int m=(l+r)>>1;
25     if(sum[rt<<1]>=p)
26         update(p,lson);
27     else
28     {
29         p-=sum[rt<<1];
30         update(p,rson);
31     }
32 }
33 int main()
34 {
35     int n;
36     int i;
37     while(~scanf("%d",&n))
38     {
39         build(1,n,1);
40         for(i=0;i<n;++i)
41         {
42             scanf("%d%d",&pos[i],&val[i]);
43         }
44         for(i=n-1;i>=0;--i)
45         {
46             update(pos[i]+1,1,n,1);
47             res[id]=val[i];
48         }
49         for(i=1;i<=n;++i)
50         {
51             if(i==1)
52                 printf("%d",res[i]);
53             else
54                 printf(" %d",res[i]);
55         }
56         printf("\n");
57     }
58     return 0;
59 }

 

posted on 2013-01-11 11:32 symons 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/symons1992/archive/2013/01/11/2856104.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值