poj2828----线段树--------单点更新
来源:互联网 发布:淘宝联盟 买东西 便宜 编辑:程序博客网 时间:2024/05/16 06:30
N个人,按先后顺序往之指定的序号插队。
先来的人最后所在的位置不一定是他当时插队时的序号数。
而最后来的所在的位置肯定是他插队时的序号数。
因此,从后往前,把最后一个人的节点值置空,表示这个位置对其他人不可用。
而前面的人根据自己的序号置空剩余的可用位置中与自己序号相同的位置。
树状数组建线段树树:每个节点的数值表示当前可用的位置中 该位置所在的的次序。
#include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define maxn 200010int n;int pos[maxn], val[maxn];int sum[maxn<<2];int ans[maxn];void build(int l, int r, int rt){ if(l == r){ sum[rt] = 1; return ; } sum[rt] = r-l+1; int m = (l+r)>>1; build(lson); build(rson);}int Update(int p, int l, int r, int rt){ if(l == r){ //printf("l = %d val[l] = %d\n", l, val[l]); sum[rt]--; return l; } int m = (l+r)>>1; int ret = 0; if(p > sum[rt<<1]) ret = Update(p-sum[rt<<1], rson); else ret = Update(p, lson); sum[rt]--; return ret;}int main(){ //freopen("in.txt", "r", stdin); while(scanf("%d", &n) != EOF){ for(int i=1; i<=n; i++){ scanf("%d %d", &pos[i], &val[i]); } build(1, n, 1); for(int i=n; i>=1; i--){ ans[Update(pos[i]+1, 1, n, 1)] = val[i]; } /* */ for(int i=1; i<=n; i++){ if(i!=1) printf(" "); printf("%d", ans[i]); } printf("\n"); } return 0;}
- poj2828 线段树单点更新
- poj2828----线段树--------单点更新
- poj2828线段树单点更新
- poj2828 线段树单点更新
- poj2828(线段树单点更新)
- POJ2828 线段树 单点更新
- 线段树(单点更新)poj2828
- POJ2828线段树 插队(单点更新)
- poj2828之线段树单点更新
- poj2828(线段树单点更新)
- poj2828 Buy Tickets 线段树,单点更新
- poj2828 Buy Tickets 单点更新线段树
- POJ2828 Buy Tickets 线段树单点更新
- poj2828 Buy Tickets(线段树,单点更新)
- Poj2828 Buy Tickets 线段树、单点更新
- POJ2828 Buy Tickets(线段树,单点更新)
- 线段树单点更新 poj2828 buy tickets
- POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】
- XML不能被忽略的CDATA
- 应届生求职:IT博客真能当技术型职位的求职利器?
- NYOJ-小光棍数-458
- Pktgen-DPDK install 安装部署
- DotNetBar使用心得
- poj2828----线段树--------单点更新
- Timus 1009. K-based Numbers
- popwindow显示位置
- oracle查看控制文件的配置情况
- VLC代码分析之一
- Pro Oracle Database 11g RAC on Linux 读书笔记2
- 关于WMV格式文件的解析
- 解决外部符号错误:_main,_WinMain@16,__beginthreadex [+
- oracle从控制文件中获取信息的数据字典