poj2828 线段树单点更新
来源:互联网 发布:卡尔荣格的书淘宝 编辑:程序博客网 时间:2024/06/05 08:22
题目链接:http://poj.org/problem?id=2828
题目意思:有N个人,一个一个的插到队伍中去,要你求最后的队伍。
解题思路:最后一个人想站在哪里就站在哪里,所以最后一个人的位置是固定。后面的根据前的可以确定位置。对于位置其实是前面已经有pos个人了,只是我们是逆排,所以是按空位排。排到空位子区间下标为pos的地方。
#include <iostream>#include<stdio.h>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int maxn=2e5;int sum[maxn<<2],ans[maxn];typedef struct key{ int pos,v;}key;void Pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){ if(l==r) { sum[rt]=1; return ; } int m=(l+r)>>1; build(lson); build(rson); Pushup(rt);}void update(int p,int v,int l,int r,int rt){ if(l==r) { sum[rt]--; ans[l]=v; return ; } int m=(l+r)>>1; if(sum[rt<<1]>=p)update(p,v,lson); //如果有那么多位置,进入左子树 else update(p-sum[rt<<1],v,rson); //减去左子树的空位置,进右子树Pushup(rt); return ;}int main(){ int n,t,i; key s[maxn]; while(~scanf("%d",&n)) { build(1,n,1); for(i=0;i<n;i++) scanf("%d%d",&s[i].pos,&s[i].v); for(i=n-1;i>=0;i--) { update(s[i].pos+1,s[i].v,1,n,1);//线段树是从1开始的所以是pos+1 } for(i=1;i<n;i++) printf("%d ",ans[i]); printf("%d\n",ans[i]); } return 0;}
阅读全文
0 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 【线段树】+【单点更新】+【逆序】
- 【bzoj2599】Race
- css 元素垂直居中的问题
- restTemplate上传文件.整个body里面只放文件流
- JS实现自定义简单网页软键盘效果代码
- spring中配置log4j 基于maven项目
- poj2828 线段树单点更新
- ORM
- jquery ajax实例教程
- UIBezierPath 基础方法属性的全面介绍
- 上下架,修改状态
- 指南 | 独立开发者如何才能挣挣挣挣到钱?
- equals与hashcode
- 自定义多样式页签控制视图组件SYPageControl
- kafka