poj2182题意:有一个1~n的排列,现在给定每个人前面有多少个人的编号比他大,求这个排列是什么。n<=8000

poj2182题解:

逆序做,可以确定二分最后一个是什么,然后删除这个数。树状数组维护每个数前面有多少个数比它小。

poj2828题意:有 n 个人排队买票,他们依次到来,第 i 个人来的时候会站在第pos[i]个人后面,并且他的编号为v[i]。
求最后的队列中每个位置人的编号。

poj2828题解:

来一个例子模拟:

0 (3) //编号为3的人插入第0个人后面

1 (2)

1 (1)

0 (4)

假设已经知道了最后的答案:

(4)(3)(1)(2)

类比上一题,我们可以逆序做,然后对于当前的最后一个人,它前面一定有且只有pos[i]个空位,就转化为上一题了。一但确定了一个人,那个空位就被填了,在树状数组上更新一下。

  1. //poj2182
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<iostream>
  7. #include<algorithm>
  8. using namespace std;
  9.  
  10. const int N=;
  11. int n,a[N],c[N],ans[N];
  12.  
  13. void add(int x,int d)
  14. {
  15. for(int i=x;i<=n;i+=(i&(-i))) c[i]+=d;
  16. }
  17. int getsum(int x)
  18. {
  19. int ans=;
  20. for(int i=x;i>=;i-=(i&(-i))) ans+=c[i];
  21. return ans;
  22. }
  23.  
  24. int main()
  25. {
  26. freopen("a.in","r",stdin);
  27. scanf("%d",&n);
  28. memset(c,,sizeof(c));
  29. for(int i=;i<=n;i++) add(i,);
  30. a[]=;
  31. for(int i=;i<=n;i++)
  32. {
  33. scanf("%d",&a[i]);
  34. }
  35. int l,r,mid;
  36. for(int i=n;i>=;i--)
  37. {
  38. l=,r=n;
  39. while(l<r)
  40. {
  41. mid=(l+r+)/;
  42. if(getsum(mid-)>a[i]) r=mid-;
  43. else l=mid;
  44. }
  45. ans[i]=l;
  46. add(l,-);
  47. }
  48. for(int i=;i<=n;i++) printf("%d\n",ans[i]);
  49. return ;
  50. }

poj2182

  1. //poj2828
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<iostream>
  7. #include<algorithm>
  8. using namespace std;
  9.  
  10. const int N=;
  11. int n,a[N],val[N],c[N],ans[N];
  12.  
  13. void add(int x,int d)
  14. {
  15. for(int i=x;i<=n;i+=(i&(-i))) c[i]+=d;
  16. }
  17. int getsum(int x)
  18. {
  19. int ans=;
  20. for(int i=x;i>=;i-=(i&(-i))) ans+=c[i];
  21. return ans;
  22. }
  23.  
  24. int main()
  25. {
  26. freopen("a.in","r",stdin);
  27. while(scanf("%d",&n)!=EOF)
  28. {
  29. memset(c,,sizeof(c));
  30. for(int i=;i<=n;i++) add(i,);
  31. for(int i=;i<=n;i++) scanf("%d%d",&a[i],&val[i]);
  32. int l,r,mid;
  33. for(int i=n;i>=;i--)
  34. {
  35. l=,r=n;
  36. while(l<r)
  37. {
  38. mid=(l+r+)/;
  39. if(getsum(mid-)>a[i]) r=mid-;
  40. else l=mid;
  41. }
  42. ans[l]=i;
  43. add(l,-);
  44. }
  45. for(int i=;i<=n;i++) printf("%d ",val[ans[i]]);printf("\n");
  46. }
  47.  
  48. return ;
  49. }

poj2828

【poj2182】【poj2828】树状数组/线段树经典模型:逆序查找-空位插入法的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

  7. BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...

  8. BZOJ 3333 排队计划 树状数组+线段树

    题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...

  9. 第十四个目标(dp + 树状数组 + 线段树)

    Problem 2236 第十四个目标 Accept: 17    Submit: 35 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

随机推荐

  1. java多线程三之线程协作与通信实例

    多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...

  2. zookeeper启动配置

    zookeeper安装和配置详解 转载 2014年04月16日 14:36:31 16812 摘自:http://www.ibm.com/developerworks/cn/opensource/os ...

  3. j2ee—框架(1):Servlet+JSP实现基本的登录功能(v1.0)

    主要分为四个部分:LoginController.web.xml.login.jsp和login_success.jsp(login_fail.jsp). 第一部分 LoginController p ...

  4. MEX程序中的mexFunction函数【转】

    与C中的main函数一样,MEX程序中的开始函数为mexFunction.默认变量参数是: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, ...

  5. Qt快速入门学习笔记(基础篇)

    本文基于Qter开源社区论坛版主yafeilinux编写的<Qt快速入门系列教程目录>,网址:http://bbs.qter.org/forum.php?mod=viewthread&am ...

  6. RT-thread内核之空闲线程

    空闲线程是系统线程中一个比较特殊的线程,它具有最低的优先级,当系统中无其他线程可运行时,调度器将调度到空闲线程.空闲线程通常是一个死循环,永远不被挂起.RT-Thread实时操作系统为空闲线程提供了钩 ...

  7. BZOJ 1221 软件开发(费用流)

    容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...

  8. 【题解】洛谷9月月赛加时赛 —— Never·island

    有趣有趣~ヾ(✿゚▽゚)ノ真的很有意思的一道dp题!感觉可以提供很多非常有意思的思路~ 现场打的时候考虑了很久,但并没有做出来,主要还是卡在了两个地方:1.考虑到按照端点来进行dp,但没有办法将两个端 ...

  9. [NOIP2010] 引水入城 贪心 + 记忆化搜索

    ---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...

  10. [HEOI2016/TJOI2016]序列 CDQ分治

    ---题面--- 题解: 首先我们观察一下,如果一个点对(j, i), 要符合题中要求要满足哪些条件? 首先我们设 j < i 那么有: j < i max[j] < v[i] v[ ...