题意:在一个队列中,你知道一个人在他左边或者右边比他高的人的个数,求字典序最小的答案

思路:先将人按  矮-->高 排序,然后算出在每个人前面需要预留的位置。树状数组(也可以线段树)解决时,先二分查找合适的位置,如果合理则标记,每次查找时    枚举的人数 - 前面已占的人数 = 可预留位置

判断分别在它左边 或者 右边时可能的最小值进行比较。

预留的位置①:pnode[i].num(即比他高的人数,全在左)

②:n - ( pnode[i].num + i) (当比他高,和前面加入的全在右边时) //为了字典序最小

/* 当时是一点头绪都没有- -,没想到是可以用线段树和二维数组,果然太年轻

#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 100010
using namespace std; const int N = 1e5 + 5;
int n,m;
int tree[N];
struct node
{
int id,num,position;
}pnode[N]; bool cmp(node a,node b)
{
return a.id < b.id;
}
bool cmp2(node a,node b)
{
return a.position < b.position;
} void add(int x , int dx)
{
while(x < N)
{
tree[x] += dx ;
x += x&(-x) ;
}
}
int query(int x)
{
int sum = 0 ;
while(x)
{
sum += tree[x] ;
x -= x&(-x) ;
}
return sum ;
} int fin(int l,int r,int x)
{
if(x < 0)
return -1;
while(l <= r)
{
int mid = (l + r)/2;
int tt= mid - query(mid); //找出前面有多少空位
if(tt < x)
l =mid + 1;
else
r = mid - 1;
}
return l;
} void ini()
{
for(int i = 0;i <= n;i++)
tree[i] = 0;
} int main()
{
int t,cas = 1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n); for(int i = 1;i <= n;i++)
scanf("%d%d",&pnode[i].id,&pnode[i].num);
sort(pnode+1,pnode+1+n,cmp);
ini();
int flag = 0;
for(int i = 1;i <= n;i++)
{
int p = n - (i - 1) ; //求还剩下多少位置
int tp = pnode[i].num;
if(p <= tp) //判断剩下的能否预留合理位置
flag = true;
int x1 = fin(1,n,pnode[i].num + 1);
int x2 = fin(1,n,n -pnode[i].num-i + 1);
pnode[i].position = min(x1,x2);
add(pnode[i].position,1);
} printf("Case #%d: ", cas++);
if(flag )
{
printf("impossible\n");
continue;
}
sort(pnode+1,pnode+n+1,cmp2);
printf("%d", pnode[1].id);
for (int i = 2; i <= n; i++)
printf(" %d", pnode[i].id);
printf("\n"); }
return 0;
}

  

ps.如果没有东西值得你为之努力,那你和一条咸鱼有什么区别? 

hdu 5493 (树状数组)的更多相关文章

  1. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  2. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. Q - Queue HDU - 5493(树状树组维护区间前缀和 + 二分找预留空位)

    Q - Queue HDU - 5493 Problem Description NNN people numbered from 1 to NNN are waiting in a bank for ...

  4. HDU 2852 (树状数组+无序第K小)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意:操作①:往盒子里放一个数.操作②:从盒子里扔掉一个数.操作③:查询盒子里大于a的第K小 ...

  5. HDU 4911 (树状数组+逆序数)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4911 题目大意:最多可以交换K次,就最小逆序对数 解题思路: 逆序数定理,当逆序对数大于0时,若ak ...

  6. hdu 5792(树状数组,容斥) World is Exploding

    hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...

  7. HDU 1934 树状数组 也可以用线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 或者是我自己挂的专题http://acm.hust.edu.cn/vjudge/contest/view. ...

  8. 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...

  9. 【模板】HDU 1541 树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意:给你一堆点,每个点右一个level,为其右下方所有点的数量之和,求各个level包含的点数. 题解: ...

  10. hdu 5147 树状数组

    题意:求满足a<b<c<d,A[a]<A[b],A[c]<A[d]的所有四元组(a,b,c,d)的个数 看到逆序对顺序对之类的问题一开始想到了曾经用归并排序求逆序对,结果 ...

随机推荐

  1. 20145237 《Java程序设计》第10周学习总结

    20145237 <Java程序设计>第10周学习总结 教材学习内容总结 Java的网络编程 •网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. •java.n ...

  2. python的测试

    测试 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 实验步骤 1. 应该测试什么? 如果可能的话,代码库中的所有代码都要测 ...

  3. 将数组写入Plist文件中

    -(void)writeToPlist:(NSArray *)uploadingfiles  Name:(NSString *)name {                  NSMutableArr ...

  4. vue jquery js 获取当前时间本周的第一天 和 本月的第一天

    交互的时候传输数据 后台要求这样的数据 直接上代码 这是我找度姨要的  附上链接  https://www.cnblogs.com/wasabii/p/7756560.html 它里面有本季度第一天  ...

  5. gdb-peda调试总汇

    gdb-peda调试总汇 break *0x400100 (b main):在 0x400100 处下断点 tb一次性断点 info b:查看断点信息 delete [number]:删除断点 wat ...

  6. python RE模块的使用

    摘要: re模块包括操作正则表达式的函数,一些工作中都需要用到,现在说明下使用方法. 使用说明: 一,re模块下的函数:            函数             描述 compile(pa ...

  7. java中的引用类型的对象存放在哪里

    根据上下文来确定.比如void func(){    Object obj = new Object();//这个obj在函数的栈里.}class Test{   private Object obj ...

  8. Orm之中介模型

    什么是中介模型 中介模型针对的是ManyToMany(多对多)的时候第三张表的问题, 中介模型其实指的就是我们不通过Django创建第三张表,如果自己不创建第三张表,而是由django给我们创建,那就 ...

  9. Python django实现简单的邮件系统发送邮件功能

    Python django实现简单的邮件系统发送邮件功能 本文实例讲述了Python django实现简单的邮件系统发送邮件功能. django邮件系统 Django发送邮件官方中文文档 总结如下: ...

  10. python/进程线程的总结

    python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...