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]中没有出现过得最小的非负整数, 然后我 ...
随机推荐
- Mysql8.0安装步骤
Mysql8.0安装步骤 2018年05月10日 14:39:05 93年的香槟 阅读数:19628 标签: mysql 更多 个人分类: 数据库 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- 瑞联科技:Pwp3框架 调用存储过程返还数据集合 到前端界面展示
一:代码结构: 1:Js 代码结构 2:Java 代码结构 二:前端界面展示效果 为了数据安全性:界面数据做了处理 三:全端代码展示 1:main.vop <html> <head& ...
- Oracle 系统调优
一:前言 一:调整初始化参数 1: Oracle 初始化参数分类 2:主要系统调优参数介绍 二:系统全局区 sga 优化 1:调整内存分配 2:调整日志缓冲区 1:查询当前oracle 实例的日志缓冲 ...
- 【Windows】添加定时任务不执行
[问题]windows定时任务不执行.在“所有程序->附件->系统工具->任务计划程序”中添加了定时调用“D:\sys_task\bugmanager\run.bat”脚本的任务计划 ...
- 【python】gevent协程例子
说在前面:用协程还是多线程需要仔细考量.我在做实验时请求了100w个ip,分别用pool为1000的协程和64个线程来跑,结果是多线程的速度是协程的10倍以上. 一个简单的协程例子 #!/usr/bi ...
- time与datetime模块
在python中,通常用下面几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 格式化的时间字符串(format s ...
- AI-序列化-查-做接口
序列化最终代码(下边的可以不看) from rest_framework.views import APIView from rest_framework import serializers fro ...
- js 打开摄像头方法 (定制摄像头)
var video = document.getElementById("video");if (navigator.mediaDevices && navigat ...
- centos/redhat破解账号密码
说明:1.个人觉得centos系统和redhat系统差不多,界面都差不多一样. 2.下面方法用于开机root密码忘了,其他人篡改root密码等等 下面是破解账号密码(图解) 之后要等久点 效果: 方法 ...
- 安装Mysql5.6.19
存在异常: ERROR (HY000): Can't connect to MySQL server on 'localhost' (10061) 原因:Mysql的服务没有启动 windows7启动 ...