POJ 2828 Buy Tickets(线段树)
2015-12-08 16:56
267 查看
题意:n个人排队,每个人有一个权值,给出他们插队的位置,求最后的顺序,按顺序输出权值。
解:逆着想,最后一个人插队后, 他的位置就是确定了下来的。倒数第二个人插的话,位置在最后一个的前面,最后一个对他无影响,位置在最后一个后面,则最后一个对他有影响,他必须往后移一位。
解:逆着想,最后一个人插队后, 他的位置就是确定了下来的。倒数第二个人插的话,位置在最后一个的前面,最后一个对他无影响,位置在最后一个后面,则最后一个对他有影响,他必须往后移一位。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm=2e5+10; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int sum[maxm<<2]; int add[maxm<<2]; int a[maxm<<2],b[maxm<<2]; void pushdown(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); pushdown(rt); } void updata(int L,int c,int l,int r,int rt) { if(l==r) { add[r]=c; sum[rt]-=1; return; } int m=(l+r)>>1; if(L<=sum[rt<<1]) updata(L,c,lson); else updata(L-sum[rt<<1],c,rson); pushdown(rt); } int main() { int n; while(scanf("%d",&n)!=EOF) { build(1,n,1); for(int i=1; i<=n; i++) { scanf("%d%d",&a[i],&b[i]); a[i]++; } for(int i=n;i>=1;i--) { updata(a[i],b[i],1,n,1); } for(int i=1; i<=n; i++) { if(i==1) printf("%d",add[i]); else printf(" %d",add[i]); } printf("\n"); } return 0; }
相关文章推荐
- AngularJS是什么
- mysql5.6 忘记数据库的root密码, 重置密码
- STM32的非常规玩法
- Android自定义View滑动事件处理总结
- 微信支付(JS API) JAVA
- 聊一聊Spring AOP
- OpenCV仿射变换+投射变换+单应性矩阵
- 读入一行数据,按
- Eclipse 使用 android.support.v7 包时,遇到的问题s
- JavaScript学习之窗口
- 环信总结
- WPF中将16进制颜色码转换成SolidColorBrush
- Java Web学习笔记——Filter
- Linux系统下使用XHProf和XHGui分析PHP运行性能
- Java Exception处理之最佳实践
- ios的线程和同步异步操作
- c# 模拟表单提交,post form 上传文件、大数据内容
- Redis入门很简单之四【初识Jedis】
- UDT协议介绍
- 将本地文件通过CRT传输到虚拟机上