3192: [JLOI2013]删除物品

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 872  Solved: 508
[Submit][Status][Discuss]

Description

 
箱子再分配问题需要解决如下问题:
 (1)一共有N个物品,堆成M堆。
 (2)所有物品都是一样的,但是它们有不同的优先级。
 (3)你只能够移动某堆中位于顶端的物品。
 (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端。若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动。
 
(5)求出将所有物品删除所需的最小步数。删除操作不计入步数之中。
 (6)只是一个比较难解决的问题,这里你只需要解决一个比较简单的版本:
         不会有两个物品有着相同的优先级,且M=2
 

Input

第一行是包含两个整数N1,N2分别表示两堆物品的个数。
接下来有N1行整数按照从顶到底的顺序分别给出了第一堆物品中的优先级,数字越大,优先级越高。
再接下来的N2行按照同样的格式给出了第二堆物品的优先级。
 

Output

对于每个数据,请输出一个整数,即最小移动步数。
 

Sample Input

3 3
1
4
5
2
7
3

Sample Output

6

HINT

1<=N1+N2<=100000

Source

开始水博

接着上一个纪元讲的内容

这道题其实模拟就好,看题解前最好手动模拟一下

(快去模拟!)

那么在模拟时,容易想到的优化是把两个栈的栈顶接上,直接维护数列

维护时可以排序一遍,得出每个元素的顺序

比如对于5 4 1 2 7 3

排完序就是3 4 6 2 1 5

接下来维护一个01序列,表示第i位是否被弹出

那么答案就是按照排序后序列求01区间和(其实有好多细节哦)

取出一个数后置零即可

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. #define LL long long
  6. using namespace std;
  7. int rank[],num[];
  8. int bit[],n;
  9. int lb(int x){
  10. return x&(-x);
  11. }
  12. int cmp(const int a,const int b){
  13. return num[a]>num[b];
  14. }
  15. LL q(int x){
  16. LL ans=;
  17. while(x){
  18. ans+=bit[x];
  19. x-=lb(x);
  20. }
  21. return ans;
  22. }
  23. int c(int x,int v){
  24. while(x<=n){
  25. bit[x]+=v;
  26. x+=lb(x);
  27. }
  28. return ;
  29. }
  30. int main(){
  31. int a,b;
  32. scanf("%d %d",&a,&b);
  33. n=a+b;
  34. for(int i=;i<=n;i++)rank[i]=i;
  35. rank[]=a;
  36. for(int i=a;i;--i)scanf("%d",&num[i]);
  37. for(int i=;i<=b;i++)scanf("%d",&num[i+a]);
  38. sort(rank+,rank+n+,cmp);
  39. for(int i=;i<=n;i++)c(i,);
  40. LL ans=;
  41. for(int i=;i<=n;i++){
  42. if(rank[i]>rank[i-])ans+=q(rank[i]-)-q(rank[i-]);
  43. else ans+=q(rank[i-])-q(rank[i]);//????????????????rank?????
  44. c(rank[i],-);
  45. }
  46. printf("%lld\n",ans);
  47. return ;
  48. }

[bzoj3192][JLOI2013]删除物品(树状数组)的更多相关文章

  1. [JLOI2013]删除物品 树状数组

    当时考试时间剩下太短了然后就挂掉了..其实是个简单的数据结构. 话说一看最小还以为是动规呢.. 将两堆头对头排.比如样例就是 541|273 因为是必须有优先级次序,依次拿的话,看优先级大小相邻的两个 ...

  2. [bzoj3192][JLOI2013]删除物品_树状数组_栈

    删除物品 bzoj-3192 JLOI-2013 题目大意:给你n个物品,分成2堆.所有的物品有不同的优先级.我只可以将一堆中的堆顶移动到另一个堆的堆顶.而如果当前物品是全局所有物品中优先级最高的,我 ...

  3. bzoj3192: [JLOI2013]删除物品(树状数组)

    既然要从一个堆的堆顶按顺序拿出来放到第二个堆的堆顶,那么我们就可以把两个堆顶怼在一起,这样从一个堆拿到另一个堆只需要移动指针就好了. 换句话说,把1~n倒着,n+1到n+m正着,用一个指针把两个序列分 ...

  4. bzoj3192 [JLOI2013]删除物品

    用数组表示两个栈,将两个栈的栈顶并在一起,用树状数组维护一下操作即可. 代码 #include<cstdio> #include<algorithm> #include< ...

  5. BZOJ3192: [JLOI2013]删除物品(splay)

    Description   箱子再分配问题需要解决如下问题:  (1)一共有N个物品,堆成M堆.  (2)所有物品都是一样的,但是它们有不同的优先级.  (3)你只能够移动某堆中位于顶端的物品.  ( ...

  6. 1057. Stack (30) - 树状数组

    题目如下: Stack is one of the most fundamental data structures, which is based on the principle of Last ...

  7. BZOJ 3192: [JLOI2013]删除物品 奇淫技巧&树状数组

    点我看题 这题十分奇淫技巧...QAQ因为知道是树状数组的题QAQ刚开始以为维护两个数组的树状数组然后模拟从大到小,然后发现不会打QAQ 于是悄悄咪咪翻开题解了. 实际上两个数组可以看做一个数组 如 ...

  8. BZOJ 3192: [JLOI2013]删除物品(树状数组)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=3192 题解: 首先每次一定是来回移动直到最大的到顶上. 所以我们可以将第两个堆的堆顶接起来 ...

  9. BZOJ3192:[JLOI2013]删除物品——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3192 箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆. (2)所有物品都是一样的 ...

随机推荐

  1. python基础:交互式解释器

    什么是"交互式python解释器"? 当你看到">>>"符号,就意味着你进入交互式python解释器,又称作"提示符". ...

  2. Windows Phone 一、XAML基础语法

    XAML的命名空间 命名空间格式:语法结构为“xmlns:”+“命名空间前缀名”,默认命名空间无需定义命名空间前缀名“xmlns” 命名空间的声明 <Page x:Class="App ...

  3. hdu 2037 今年暑假不AC

    今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  4. AS3中 Event 类的target和currentTarget属性

    在事件处理过程中,会自动生成事件类的实例,并传给侦听器函数.通过这个参数就可以使用事件类的属性和方法.其中target与currentTarget属性是两个很相似的属性. 对于简单的事件处理过程,分清 ...

  5. [osx] 查看端口被占用

    netstat命令 netstat -an | grep 3306 3306替换成需要grep的端口号 lsof命令 sudo lsof -i :80 -i参数表示网络链接,:80指明端口号,该命令会 ...

  6. Devexpress -换皮肤

    一.在项目下新建RibbonForm  命名为:useSkin 二.添加引用DevExpress.OfficeSkins      DevExpress.UserSkins.BonusSkins 三. ...

  7. python获取绝对路径

    import osimport sysprint 'os.getcwd()=',os.getcwd()print 'sys.argv=',sys.argvprint 'sys.argv[0]=',sy ...

  8. wex5 实战 图片触摸放大移动插件easyzoom的使用与集成

    一 前言 客户的需求就是上帝的召唤. 作为一个开发人员,或者软件从业者,客户的要求就是准则. 遇到一个客户,让我做一个图片放大,但是移动拖拽要定位精准.之前研究过一个hammer插件,多次尝试放大后的 ...

  9. 转 苹果企业级帐号进行ipa打包,分发,下载等流程

    1,企业帐号介绍(1)使用企业开发帐号,我们可以发布一个 ipa 放到网上,所有人(包括越狱及非越狱设备)都可以直接通过链接下载安装,而不需要通过 AppStore 下载,也不需要安装任何证书.(2) ...

  10. java中递归的方法的实例

    package com.demo.recursion; // 所谓递归,是指程序调用自身,当然,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了.// ...