树状数组+二分||线段树 HDOJ 5493 Queue
题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法
分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], n - i - k[i]),若后者小于0则无解。然后可以理解为每个人前面要留出p + 1个位子给高个的人,可用线段树维护,s[rt] 表示当前线段还能空出的位子数。当然也能用树状数组+二分查找位子的方法。
/************************************************
* Author :Running_Time
* Created Time :2015/9/28 星期一 12:01:30
* File Name :J.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
struct ST {
int s[N<<2], ans[N];
void push_up(int rt) {
s[rt] = s[rt<<1] + s[rt<<1|1];
}
void build(int l, int r, int rt) {
if (l == r) {
s[rt] = 1; return ;
}
int mid = (l + r) >> 1;
build (lson); build (rson);
push_up (rt);
}
void updata(int p, int v, int l, int r, int rt) {
if (l == r) {
ans[l] = v; s[rt] = 0;
return ;
}
int mid = (l + r) >> 1;
if (p <= s[rt<<1]) {
updata (p, v, lson);
}
else updata (p - s[rt<<1], v, rson);
push_up (rt);
}
}st;
struct PP {
int h, k;
bool operator < (const PP &r) const {
return h < r.h;
}
}p[N]; int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
int n; scanf ("%d", &n);
for (int i=1; i<=n; ++i) {
scanf ("%d%d", &p[i].h, &p[i].k);
}
sort (p+1, p+1+n);
st.build (1, n, 1);
bool flag = true;
for (int i=1; i<=n; ++i) {
int pos = min (p[i].k, n - i - p[i].k);
if (pos < 0) {
flag = false; break;
}
st.updata (pos + 1, p[i].h, 1, n, 1);
}
printf ("Case #%d: ", ++cas);
if (!flag) puts ("impossible");
else {
for (int i=1; i<=n; ++i) {
printf ("%d%c", st.ans[i], i == n ? '\n' : ' ');
}
}
} return 0;
}
/************************************************
* Author :Running_Time
* Created Time :2015/9/28 星期一 15:48:08
* File Name :J_BIT.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
struct PP {
int h, k;
bool operator < (const PP &r) const {
return h < r.h;
}
}p[N];
struct BIT {
int c[N], SZ;
void init(int n) {
memset (c, 0, sizeof (c));
SZ = n;
}
void updata(int i, int x) {
while (i <= SZ) {
c[i] += x; i += i & (-i);
}
}
int query(int i) {
int ret = 0;
while (i) {
ret += c[i]; i -= i & (-i);
}
return ret;
}
int my_binary_search(int l, int r, int k) {
while (l <= r) {
int mid = (l + r) >> 1;
if (mid - query (mid) < k) l = mid + 1;
else if (mid - query (mid) == k) {
if (query (mid) - query (mid - 1) == 1) r = mid - 1;
else return mid;
}
else r = mid - 1;
}
return -1;
}
}bit;
int ans[N]; int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
int n; scanf ("%d", &n);
for (int i=1; i<=n; ++i) {
scanf ("%d%d", &p[i].h, &p[i].k);
}
sort (p+1, p+1+n);
bit.init (n);
bool flag = true;
for (int i=1; i<=n; ++i) {
int pos = min (p[i].k, n - i - p[i].k);
if (pos < 0) {
flag = false; break;
}
int x = bit.my_binary_search (1, n, pos + 1);
ans[x] = p[i].h;
bit.updata (x, 1);
}
printf ("Case #%d: ", ++cas);
if (!flag) puts ("impossible");
else {
for (int i=1; i<=n; ++i) {
printf ("%d%c", ans[i], i == n ? '\n' : ' ');
}
}
} return 0;
}
树状数组+二分||线段树 HDOJ 5493 Queue的更多相关文章
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...
- BZOJ 3173 最长上升子序列(树状数组+二分+线段树)
给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? 由于序列是顺序插入的,所以当前插入的数字对之 ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- 【BZOJ3196】二逼平衡树(树状数组,线段树)
[BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- POJ 1195 Mobile phones (二维树状数组或线段树)
偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...
随机推荐
- android keyEvent
http://developer.android.com/reference/android/view/KeyEvent.html
- MySQL的简单优化
一.如何发现需要优化的SQL 主要使用MySQL的慢查日志对有效率问题的SQL进行监控 第一步:启动慢查日志的监控 打开开关,将未使用索引的查询记录到慢查日志中 设置查询时间,当查询时间大于这个值,就 ...
- stm8 停机模式与外部中断唤醒中一个小问题
做了一个简单的项目,电路板使用电池供电,需要系统在待机时低功耗.而对外接口只有4个按键,也就是唤醒必须要通过这四个按键. 系统功能就不介绍了,只给出进入低功耗的代码和退出低功耗的代码. 使用芯片为st ...
- ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
register_chrdev:Linux2.6.30之前所用,不用定义cdev:但 如果是register_chrdev 注册的话,这个时候,分配的次设备号,是从0~255,这样子的话,就分配的范围 ...
- MYSQL初级学习笔记七:MySQL中使用正则表达式!(视频序号:初级_44)
知识点九:MySQL中使用正则表达式(44) (1):REGEXP‘匹配方式’: (2):常用匹配方式: 模式字符 ^ 匹配字符开始的部分 $ 匹配字符串结尾的部分 . 代表字符串中的任意一个字符,包 ...
- WAS:节点不同步问题
刀片服务器硬盘坏了,换了硬盘后,通过dmgr无法重启该节点上的server. 单机./starServer 后,服务虽然启动了,但后台一直提示如下: [-- ::: CST] RoleViewLead ...
- c语言中为什么左移不分符号数无符号数,而右移分呢??
因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移.右移都是使用的逻辑左移和逻辑右移).而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!( ...
- trying to draw too large(106,975,232 bytes) bitmap.
Loading Large Bitmaps Efficiently This lesson teaches you to Read Bitmap Dimensions and Type Load a ...
- 网站页面打开浏览器table中显示图片
就类似博客园这种:
- oracle自动表分析
oracle 表的统计信息,跟他的执行计划很有关联 执行计划的正常是否,跟SQL的执行速度很有关系 首先讲解一下如何查看一个数据库的是否开启自动统计分析 1.查看参数:STATISTICS_LEVEL ...