hdu 5493(线段树)
2015-09-27 17:47
218 查看
题意:有n个人,每个人的身高和左边或右边比自己高的人的个数num[i],输出符合给出的条件且字典序最小的从左到右队列里每个人的身高。
题解:人有100000个,可以从线段树方法考虑,把问题转化为把每个人前面能留多少个空位给高个子的人,可以先按身高从小到大排个序,考虑第i个人前面留的位置肯定是num[i]或n-i-num[i]中的较小值,这样才能让字典序最小,一旦有n - i - num[i]的值小于0说明无解。
题解:人有100000个,可以从线段树方法考虑,把问题转化为把每个人前面能留多少个空位给高个子的人,可以先按身高从小到大排个序,考虑第i个人前面留的位置肯定是num[i]或n-i-num[i]中的较小值,这样才能让字典序最小,一旦有n - i - num[i]的值小于0说明无解。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100000 + 5; struct Peo { int h, num; }p ; int n, s[N << 2], res ; bool cmp(Peo a, Peo b) { return a.h < b.h; } void pushup(int k) { s[k] = s[k * 2] + s[k * 2 + 1]; } void build(int k, int left, int right) { if (left == right) { s[k] = 1; return; } int mid = (left + right) / 2; build(k * 2, left, mid); build(k * 2 + 1, mid + 1, right); pushup(k); } void modify(int k, int left, int right, int pos, int val) { if (left == right) { res[left] = val; s[k] = 0; return; } int mid = (left + right) / 2; if (pos <= s[k * 2]) modify(k * 2, left, mid, pos, val); else modify(k * 2 + 1, mid + 1, right, pos - s[k * 2], val); pushup(k); } int main() { int t, cas = 1; scanf("%d", &t); while (t--) { scanf("%d", &n); build(1, 1, n); for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].h, &p[i].num); sort(p + 1, p + n + 1, cmp); int flag = 0; for (int i = 1; i <= n; i++) { int m = n - i; int temp = m - p[i].num; if (temp < 0) { flag = 1; break; } if (p[i].num < temp) modify(1, 1, n, p[i].num + 1, p[i].h); else modify(1, 1, n, temp + 1, p[i].h); } printf("Case #%d: ", cas++); if (flag) { printf("impossible\n"); continue; } printf("%d", res[1]); for (int i = 2; i <= n; i++) printf(" %d", res[i]); printf("\n"); } return 0; }
相关文章推荐
- noip2011 表达式的值 (模拟)
- Integer to English Words
- Java学习之路:ArrayList用法
- Linux 基础入门 第二周9.21~9.27
- 栈(顺序+链式) java实现
- 【Android】周末读博客小记
- eclipse ide中folder、source folder、package 区别
- 深入javascript-继承机制
- App开放接口api安全性—Token签名sign的设计与实现
- 在阿里云的CentOS 6.5 上面安装 timidity++ 和 ffmpeg(含libmp3lame) 实现命令行将midi转换为mp3
- STM32学习笔记(九) 外部中断,待机模式和事件唤醒
- 关于"树(Tree, UVa548)“的记录
- UML Section Six 实现图
- C++中一个类对象占用的内存空间大小
- MainPage.xaml
- 吝啬的国度(dfs+vector)
- Elasticsearch实现与mysql的数据库的同步
- Cisco 2811C WEB管理功能
- windows安装phpstudy(nginx+php) 出现的问题解决
- uva 1401 dp+Trie