博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
●POJ 2828 Buy Tickets
阅读量:5316 次
发布时间:2019-06-14

本文共 1042 字,大约阅读时间需要 3 分钟。

题链:

题解:

线段树。

逆向考虑这个过程。最后的序列S共有n个元素。

先看最后一个人,如果他插入到第i位,那么他最终的位置就是当前序列S的第i号位置,然后把这个位置去掉,得到新序列S'。

再按上面的操作确定倒数第二个人的位置:

如果他插入到第j位,那么他就在新序列S'的第j个位置。

。。。。。。以此类推,可以确定出所有人的位置。

可以用线段树去确定位置。

代码:

#include
#include
#include
#define MAXN 200050using namespace std;struct People{ int p,d;}P[MAXN];struct SGT{ int ls[MAXN<<1],rs[MAXN<<1],siz[MAXN<<1],sz,rt; void build(int &u,int l,int r){ u=++sz; siz[u]=r-l+1; if(l==r) return; int mid=(l+r)/2; build(ls[u],l,mid); build(rs[u],mid+1,r); } void Reset(int n){ sz=rt=0; build(rt,1,n); } int Modify(int u,int l,int r,int k){ siz[u]--; if(l==r) return l; int mid=(l+r)/2; if(k<=siz[ls[u]]) return Modify(ls[u],l,mid,k); else return Modify(rs[u],mid+1,r,k-siz[ls[u]]); }}DT;int ANS[MAXN];int main(){ int n; while(~scanf("%d",&n)){ DT.Reset(n); for(int i=1;i<=n;i++) scanf("%d%d",&P[i].p,&P[i].d); for(int i=n,p;i;i--){ p=DT.Modify(DT.rt,1,n,P[i].p+1); ANS[p]=P[i].d; } for(int i=1;i

  

转载于:https://www.cnblogs.com/zj75211/p/8365585.html

你可能感兴趣的文章
solr5.5索引mysql数据(新手总结)
查看>>
MySQL知识总结(二)基本语句总结
查看>>
SSM框架整合
查看>>
AMD and CMD are dead之KMD.js依赖可视化工具发布
查看>>
第三课 Makefile文件的制作(上)
查看>>
SQL Azure Reporting CTP
查看>>
Leetcode400Nth Digit第N个数字
查看>>
JavaScript数组迭代方法(图解)
查看>>
ycsb-命令及参数-与生成的负载类型相关
查看>>
扒开系统调用的三层皮(下)
查看>>
子类访问父类和方法覆写
查看>>
在Activity不可见时暂停WebView的语音播放,可见时继续播放之前的语音
查看>>
Dubbo的使用及原理浅析
查看>>
【POJ 2240】Arbitrage
查看>>
C#薪水和前途
查看>>
使用 Apache Pig 处理数据5
查看>>
Python中函数的参数传递与可变长参数
查看>>
HSV色彩空间
查看>>
[转] ArcEngine 产生专题图
查看>>
大数相乘
查看>>