Written with StackEdit.

Description

箱子再分配问题需要解决如下问题:

(1)一共有\(N\)个物品,堆成\(M\)堆。

(2)所有物品都是一样的,但是它们有不同的优先级。

(3)你只能够移动某堆中位于顶端的物品。

(4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端。若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动。

(5)求出将所有物品删除所需的最小步数。删除操作不计入步数之中。

(6)这是一个比较难解决的问题,这里你只需要解决一个比较简单的版本:

不会有两个物品有着相同的优先级,且\(M=2\).

Input

第一行是包含两个整数\(N_1,N_2\)分别表示两堆物品的个数。

接下来有\(N_1\)行整数按照从顶到底的顺序分别给出了第一堆物品中的优先级,数字越大,优先级越高。

再接下来的\(N_2\)行按照同样的格式给出了第二堆物品的优先级。

Output

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

Sample Input

3 3

1

4

5

2

7

3

Sample Output

6

HINT

\(1<=N_1+N_2<=100000\).

Solution

  • 比较巧妙的处理方式.可以将两个堆合成一个序列,第一个堆堆顶在后,第二个堆堆顶在前.那么两个堆的堆顶会有一个分界处\(mid\),移动物品时只需移动\(mid\)即可.
  • 从大到小处理每个优先级对应的物品,移动次数可由这个物品与\(mid\)中间的物品数目计算得出.移动后再修改\(mid\).
  • 计算物品数目可以用前缀和.还需要支持删除,用树状数组维护即可.
  • 边界条件需要自己画图看一下.
#include<bits/stdc++.h>
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
const int MAXN=2e5+10;
int pos[MAXN];
int bit[MAXN];
int n,n1,n2;
#define lowbit(x) x&(-x)
inline void add(int x,int c)
{
for(;x<=n;x+=lowbit(x))
bit[x]+=c;
}
inline LoveLive query(int x)
{
LoveLive res=0;
for(;x;x-=lowbit(x))
res+=bit[x];
return res;
}
int a[MAXN],b[MAXN];
int main()
{
n1=read(),n2=read();
n=n1+n2;
int mid=n1;
for(int i=n1;i;--i)
{
a[i]=b[i]=read();
}
for(int i=n1+1;i<=n1+n2;++i)
{
a[i]=b[i]=read();
}
sort(b+1,b+1+n);
for(int i=1;i<=n;++i)
{
a[i]=lower_bound(b+1,b+1+n,a[i])-b;
pos[a[i]]=i;
}
for(int i=1;i<=n;++i)
add(i,1);
LoveLive ans=0;
for(int i=n;i;--i)
{
if(pos[i]<=mid)
{
ans+=query(mid)-query(pos[i]);
add(pos[i],-1);
mid=pos[i];
}
else
{
ans+=query(pos[i]-1)-query(mid);
add(pos[i],-1);
mid=pos[i]-1;
}
}
printf("%lld\n",ans);
return 0;
}

bzoj 3192 删除物品的更多相关文章

  1. BZOJ 3192 删除物品(树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3192 题意:(1)一共有N个物品,堆成M堆. (2)所有物品都是一样的,但是它们有不同的 ...

  2. 3192: [JLOI2013]删除物品

    3192: [JLOI2013]删除物品 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1366 Solved: 794 [Submit][Statu ...

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

    3192: [JLOI2013]删除物品 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 872  Solved: 508[Submit][Status ...

  4. 洛谷 P3253 [JLOI2013]删除物品 解题报告

    P3253 [JLOI2013]删除物品 题目描述 箱子再分配问题需要解决如下问题: (1)一共有\(N\)个物品,堆成\(M\)堆. (2)所有物品都是一样的,但是它们有不同的优先级. (3)你只能 ...

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

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

  6. bzoj 3192: [JLOI2013]删除物品

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

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

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

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

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

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

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

随机推荐

  1. Python面试题之集合推导式、字典推导式

    集合推导式 集合推导式(set comprehensions)跟列表推导式也是类似的, 唯一的区别在于它们使用大括号{}表示. Code: sets = {x for x in range(10)} ...

  2. CentOS6升级Apache-httpd2.4.29

    本文档解决AppacheHttp由版本2.2.x升级到版本2.4.29的问题,安装需要先进行依赖软件包的安装,请检查相应依赖软件包安装情况,如系统已经正确安装相应依赖软件包,可略过,本文所述版本升级不 ...

  3. 网易编程题——Fibonacci数列

    题目描述 Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0 ...

  4. Maven+Struts+Hibernate+Spring简单项目搭建

    这段时间学习如何使用Maven+Struts+Hibernate+Spring注解方式建立项目,在这里感谢孙宇老师.    第一次写博客,主要是方便自己查看,同时分享给大家,希望对大家有所帮助,我也是 ...

  5. 委托和事件C#演示代码

    class Cat { private string _name; public Cat(string name) { _name = name; } public void Shout() { Co ...

  6. python urllib2库的简单总结

    urllib2的简单介绍参考网址:http://www.voidspace.org.uk/python/articles/urllib2.shtml Fetching URLsThe simplest ...

  7. LightOJ - 1248 期望

    题意:有一个n面筛子,每次扔一下,每面概率相同,要求扔出n面的期望次数 题解:和第三篇论文里的例题一样,算从第i个到第i+1个的概率是(n-i)/n,n面中找n-i个没有扔到过的,期望是n/(n-i) ...

  8. 在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能

    在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能 https://www.jianshu.com/p/27ee7df4ccc1

  9. iOS自动化探索(三)WebDriverAgent Python Client

    之前我们在终端试着调用过WDA API, 今天我们在看一个Python封装的api库 https://github.com/openatx/facebook-wda 安装方式(一): pip inst ...

  10. jQuery对select操作

    (转自:http://www.cnblogs.com/as285996985/articles/1535014.html) //遍历option和添加.移除optionfunction changeS ...