poj2828(线段树查找序列第k小的值)
题目链接:https://vjudge.net/problem/POJ-2828
题意:有n个人,依次给出这n个人进入队列时前面有多少人p[i],和它的权值v[i],求最终队列的权值序列。
思路:基本类似于poj2182,简化题意后即为求序列1..n中第k小的值的问题。读入数据量比较大,最好读入优化。我们从n..1逆序遍历,则可以确认最后一个人的最终位置为p[n]+1,然后从序列中删除p[n]+1,继续操作倒数第二个...这一操作可以通过线段树来完成。线段树的结点包括3个值:l(区间左端点),r(区间右端点),len(区间剩余编号数)。每次询问维护len值。时间复杂度为O(Tnlogn)。
AC代码:
#include<cstdio>
#include<cctype>
using namespace std;
const int maxn=; inline int read(){
int x=,f=;char c=;
while(!isdigit(c)) {f|=c=='-';c=getchar();}
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
return f?-x:x;
} struct node{
int l,r,len;
}tr[*maxn]; int p[maxn],v[maxn],n,ans[maxn]; void build(int v,int l,int r){
tr[v].l=l,tr[v].r=r,tr[v].len=r-l+;
if(l==r) return;
int mid=(l+r)>>;
build(*v,l,mid);
build(*v+,mid+,r);
} int query(int v,int k){
--tr[v].len;
if(tr[v].l==tr[v].r) return tr[v].l;
if(k<=tr[*v].len) return query(*v,k);
else return query(*v+,k-tr[*v].len);
} int main(){
while(~scanf("%d",&n)){
build(,,n);
for(int i=;i<=n;++i)
p[i]=read(),v[i]=read();
for(int i=n;i>=;--i)
ans[query(,p[i]+)]=v[i];
for(int i=;i<=n;++i)
printf("%d ",ans[i]);
printf("\n");
}
return ;
}
poj2828(线段树查找序列第k小的值)的更多相关文章
- poj2886(线段树求序列第k小)
题目链接:https://vjudge.net/problem/POJ-2886 题意:n个人围成一个圈,每个人有姓名s和权值val两个属性,第一轮序号为k的人退出,并根据其val指定下一个人,val ...
- poj2182(线段树求序列第k小)
题目链接:https://vjudge.net/problem/POJ-2182 题意:有n头牛,从1..n编号,乱序排成一列,给出第2..n个牛其前面有多少比它编号小的个数,记为a[i],求该序列的 ...
- 线段树维护区间前k小
线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...
- 【学习笔记】浅析平衡树套线段树 & 带插入区间K小值
常见的树套树 一般来说,在嵌套数据结构中,线段树多被作为外层结构使用. 但线段树毕竟是 静态 的结构,导致了一些不便. 下面是一个难以维护的例子: 带插入区间 \(k\) 小值问题 来源:Luogu ...
- HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)
HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...
- 主席树--动态区间第k小
主席树--动态区间第\(k\)小 模板题在这里洛谷2617. 先对几个问题做一个总结: 阅读本文需要有主席树的基础,也就是通过区间kth的模板题. 静态整体kth: sort一下找第k小,时间复杂度\ ...
- 主席树(可持久化线段树) 静态第k大
可持久化数据结构介绍 可持久化数据结构是保存数据结构修改的每一个历史版本,新版本与旧版本相比,修改了某个区域,但是大多数的区域是没有改变的, 所以可以将新版本相对于旧版本未修改的区域指向旧版本的该区域 ...
- hdu 5008 查找字典序第k小的子串
Boring String Problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)
题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...
随机推荐
- PyCharm激活(License server)
打开激活窗口 选择 Activate new license with: License server (用license server 激活) 在 License sever address 处填入 ...
- git --- 持续更新
东转西转 git 1 git 使用 1.1 git 安装 ~$: sudo apt-get install git 1.2 git 初始化 ~$: git init ~$: git remote ad ...
- 刘志梅 2017710101152《面向对象程序设计(java)》 第十周学习总结
实验十 泛型程序设计技术 实验时间 2018-11-1 1.实验目的与要求 (1)泛型程序设计:意味着编写的代码可以被很多不同类型的对象所重用.(ArrayList类可以聚集任何类型的对象) 如果在 ...
- mysql------Windows7 64bit安装教程------下载mysql
.1.进入官网的下载位置,https://dev.mysql.com/downloads/installer/: 2.选择“Windows”; 3.点击"MySQL Installer&qu ...
- nginx mac
==> nginx Docroot is: /usr/local/var/www The default port has been set in /usr/local/etc/nginx/ng ...
- Python Queue(队列)
Queue模块实现了多生产者.多消费者队列.当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用,实现了所有必需的锁定语义. 一.该模块实现了三种类型的队列,它们的区别仅在于检索条目的顺序: ...
- mybatis学习 -每天一记 通用mapper 关于UUID回显的配置
在使用通用mapper插入数据UUID回显 在使用通用mapper插入数据时,发现主键没有回显,我这里的主键是UUID的,解决方案是:配置一个MapperScannerConfigurer. @Bea ...
- HTML5 关于一些本地操作 cookie,sessionStorage,localStorage
1,b/s 开发中经常会使用到 cookie,大部分情况下,都是由后端代码实现,那么 js 怎么实现对 cookie 的操作呢? <!DOCTYPE html> <html> ...
- redis hashmap数据结构分析
说明一点:redis的hash中每一个key都是一个单独的hash表,field是hash表中的key,value是hash表中的value: //redis中hash数据结构为:key-field- ...
- 今日、本周、本月时间列表 python方法
def get_time(self): ''' @author : Cong @Email : 624420781@qq.com @描 述 : 生产时间列表 ''' # 生成本日时间列表 i = da ...