HDU 5493 Queue 【线段树】
<题目链接>
题目大意:
给你n个人的身高和他前面或者后面身高大于他的人的个数,求一个字典序最小的满足此条件的序列,如果不存在输出“impossible”。
解题分析:
因为要保证字典序最小,所以我们先将所有的人按身高排序,先给矮的人分配位置,并且位置尽可能的靠左。接下来就是分两种情况考虑,:
一:k个人在i前面,所以i的前面至少要留k个空格(因为是按从小到大分配人的位置,所以比i先插入的都是比他矮的);
二:k个人在i的后面,所以i的后面至少要留k个空格,所以i的前面需要留cnt-k个空格(cnt代表总的空格数,因为要按字典序最小,所以前面的空格越少越好,因为空格以后都是要放比i高的人)。
在上面两种情况中,选出i前面所需放的空格数最少的一种情况即可。
不过本题单纯的用线段树有点慢,可以考虑用二分+树状数组做。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
const int M = 1e5+; struct Node{
int h,num;
}node[M];
int sum[M<<],val[M]; //val[]代表该点人的高度,sum[]代表该区间内的空格数
bool comp(Node x,Node y){return x.h<y.h;}
void Pushup(int rt){
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void build(int rt,int l,int r){
if(l==r){
sum[rt]=;
return;
}
int mid=(l+r)>>;
build(Lson);
build(Rson);
Pushup(rt);
}
void update(int rt,int l,int r,int cur,int h){
if(l==r){
val[l]=h; //更新该点的高度
sum[rt]=;
return;
}
int mid=(l+r)>>;
if(cur<=sum[rt<<])update(Lson,cur,h); //如果左儿子区间中的空格数满足sum[rt<<1],那么就直接在左儿子区间内选择前面有p个空格的位置
else update(Rson,cur-sum[rt<<],h); //如果左儿子中的空格数<cur,则需要到右儿子区间内查询前面有cur个空格的位置
Pushup(rt);
}
int main(){
int T,n;scanf("%d",&T);
int ncase=;
while(T--){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&node[i].h,&node[i].num);
sort(node+,node++n,comp);
build(,,n);
bool flag=false;
for(int i=;i<=n;i++){
int cnt=n-i; //剩余的空格数
int tmp=cnt-node[i].num; //此处表示将node[i].num个高的人放到i的后面,即i的后面要留node[i].num个人,因为总共有cnt个空格,即i的前面需要有cnt-node[i].num个空格
tmp=min(node[i].num,tmp); //因为要求字典序最小,所以在两种情况中选取i劲量靠前的方案,即选则在i前面至少要留的空格数最少的情况
if(tmp<){ //不符合的情况
flag=true;break;
}
update(,,n,tmp+,node[i].h); //寻找前面有tmp个空格的位置(因为要包括自己,所以是tmp+1)
}
printf("Case #%d: ",++ncase);
if(flag)printf("impossible\n");
else{
for(int i=;i<=n;i++)
i==n?printf("%d\n",val[i]):printf("%d ",val[i]);
} }
return ;
}
2018-11-03
HDU 5493 Queue 【线段树】的更多相关文章
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 【线段树】HDU 5493 Queue (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5493 题目大意: N个人,每个人有一个唯一的高度h,还有一个排名r,表示它前面或后面比它高的人的个数 ...
- hdu 5493 Queue(线段树)
Problem Description N people numbered to N are waiting in a bank for service. They all stand in a qu ...
- HDU - 5493 Queue 2015 ACM/ICPC Asia Regional Hefei Online(线段树)
按身高排序,每个人前面最高的人数有上限,如果超出上限说明impossible, 每次考虑最小的人,把他放在在当前的从左往右第k+1个空位 因为要求字典序最小,所以每次k和(上限-k)取min值. 没有 ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- hdu 4747 mex 线段树+思维
http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...
随机推荐
- Confluence 6 配置 HTTP 超时设置
当宏,例如 RSS Macro 进行 HTTP 请求的时候,有可能因为请求的时间比较长,而导致超时.你可以通过设置系统参数来避免这个问题. 配置 HTTP 超时设置: 在屏幕的右上角单击 控制台按钮 ...
- Confluence 6 中修改默认的表现和内容
Confluence 构建了一些有用的默认设置,这些设置能够让第一次访问使用 Confluence 系统的用户更好的了解系统.同时默认的内容将新空间和其他区域放置在 Confluence 中. Con ...
- vue-cli脚手架(框架)
一.创建vue项目 npm install vue-cli -g #-g全局 (sudo)npm install vue-cli -g #mac笔记本 vue-init webpack myvue # ...
- redis-cluster集群搭建
Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用 ( HA ),从3.0版本之后,官方推出了Redis Cluster,它的主要用途是实现数据分片(Data Sha ...
- 【深度学习】吴恩达网易公开课练习(class1 week2)
知识点汇总 作业内容:用logistic回归对猫进行分类 numpy知识点: 查看矩阵维度: x.shape 初始化0矩阵: np.zeros((dim1, dim2)) 去掉矩阵中大小是1的维度: ...
- jsp 修饰 Request 及Response
Servlet API包含4个可修饰的类,用于改变Servlet Request以及Servlet Response.这种修饰允许修改 ServletRequest以及ServletResponse或 ...
- Django标签&迭代&循环&过滤
1.{% for Person in persons %}模板标签的替换,就是利用了基础模板的底层设计,嵌套了其他显示的内容.常见的内容替换标签{% block content %}{%endbloc ...
- java web 项目中 简单定时器实现 Timer
java web 项目中 简单定时器实现 Timer 标签: Java定时器 2016-01-14 17:28 7070人阅读 评论(0) 收藏 举报 分类: JAVA(24) 版权声明:本文为博 ...
- Java 9 中的 9 个新特性你知道吗
摘要: Java 8 发布三年多之后,即将快到2017年7月下一个版本发布的日期了. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 J ...
- 首次使用idea步骤
修改代码提示快捷键 默认是ctrl+空格,这个会跟中英文切换的快捷键冲突. 我这里改成了alt+/ tomcat的配置