P3253 [JLOI2013]删除物品

题目描述

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

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

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

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

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

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

(6)只是一个比较难解决的问题,这里你只需要解决一个比较简单的版本: 不会有两个物品有着相同的优先级,且\(M=2\)

输入输出格式

输入格式:

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

输出格式:

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

说明

\(1<=N1+N2<=100000\)


说一下我做这个题的心路历程。

  1. 汉诺\(n\)塔问题?
  2. 两个栈?
  3. 等等,我似不似看错了,这不就是个模拟???
  4. 好像没错啊...
  5. 噫?模拟是\(O(n^2)\)?
  6. 苟不住了估计要跑数据结构
  7. 噫,我把这一坨挪到另一个上面后它们距离当前栈顶的距离是翻转区间???
  8. 分......分块?完了不会分块啊
  9. 瞎画+摸鱼\(ing\)
  10. 等等,我把两个栈bu~成一个数组后不仅只用挪中间的断点了
  11. 这样我拿线段树维护一下某点左边后几个被巴拉掉了
  12. 等等,咋不对啊。模拟一下,然后我发现做断点左边的点时要额外减去1...

    最后,瞅了瞅题解。这个..别人都维护的是元素个数啊。。

做的还是有点小麻烦的。。。


code:

#include <cstdio>
#include <algorithm>
#define ls id<<1
#define rs id<<1|1
#define mid (l+r>>1)
#define R (t[id].r)
#define L (t[id].l)
#define Mid (L+R>>1)
using namespace std;
const int N=100010;
int a[N],di,n;
struct node2
{
int i,w;
bool friend operator <(node2 n1,node2 n2)
{
return n1.w>n2.w;
}
}b[N];
struct node
{
int l,r,w,lazy;
}t[N*4]; void build(int id,int l,int r)
{
L=l,R=r;
if(l==r) return;
build(ls,l,mid);
build(rs,mid+1,r);
} void change(int id,int l,int r)
{
if(L==l&&R==r)
{
t[id].lazy-=1;
return;
}
t[id].w-=(r+1-l);
if(r<=Mid)
change(ls,l,r);
else if(l>Mid)
change(rs,l,r);
else
{
change(ls,l,Mid);
change(rs,Mid+1,r);
}
} void push_down(int id)
{
t[id].w+=t[id].lazy*(R+1-L);
if(L!=R)
{
t[ls].lazy+=t[id].lazy;
t[rs].lazy+=t[id].lazy;
}
t[id].lazy=0;
} int query(int id,int loc)
{
push_down(id);
if(L==R)
return t[id].w;
if(loc<=Mid)
return query(ls,loc);
else
return query(rs,loc);
}
long long ans=0;
int main()
{
int n1,n2;
scanf("%d%d",&n1,&n2);
for(int i=n1;i>=1;i--)
scanf("%d",a+i);
di=n1;n=n1+n2;
for(int i=1;i<=n2;i++)
scanf("%d",a+i+n1);
for(int i=1;i<=n;i++)
b[i].i=i,b[i].w=a[i];
sort(b+1,b+1+n);
build(1,1,n);
int now=b[1].i;
ans+=abs(now-di);
if(now>di) ans--;
di=now;
if(now!=n) change(1,now+1,n);
for(int i=2;i<=n;i++)
{
now=b[i].i;
int q1=query(1,now),q2=query(1,di);
ans+=abs(now+q1-di-q2);
if(now<di) ans--;
if(now!=n) change(1,now+1,n);
di=now;
}
printf("%lld\n",ans);
return 0;
}

2018.5.20

洛谷 P3253 [JLOI2013]删除物品 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  3. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  6. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

  7. 洛谷 P1110 [ZJOI2007]报表统计 解题报告

    P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...

  8. 洛谷 P2542 [AHOI2005]航线规划 解题报告

    P2542 [AHOI2005]航线规划 题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系 ...

  9. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

随机推荐

  1. Intel x86_64 Architecture Background 2

    这里是在学习Intel x86_64体系架构时学习到的一些概念,记录下来以供日后参考.如果有错的地方,欢迎指正! CPU上下文切换(context switch): 这个概念第一次听到对我来说是完全陌 ...

  2. Error【0007】:zabbix中因为curl版本过低而无法发送邮件

    1. 错误背景 在centos6.5上,源码部署zabbix最新版本zabbix-3.2.14.部署后之后,在配置邮件发送报警时出错 2. 错误提示 3. 原因分析 从网上检索的结果是说,系统中的cu ...

  3. @Pointcut的用法

    在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature).让我们先看看execution表示式的格式: ...

  4. 12.13 Daily Scrum

    现在已经可以实现在应用中直接通过WebView浏览餐厅的网页,而不用再调用手机的浏览器. 收藏夹的功能也基本实现,接下来的目标时将收藏夹与每一个用户关联.   Today's Task Tomorro ...

  5. BugPhobia发布篇章:Beta版本学霸在线系统正式发布

    0x00:测试报告版本管理 版本号 具体细节 修订时间 V 1.0 整理第一轮迭代用户管理和登陆注册的功能性验证测试,预计将继续网页对浏览器版本的兼容性测试 2015/11/12 V1.0.1 整理第 ...

  6. Linux内核分析 笔记六 进程的描述和进程的创建 ——by王玥

    一.知识点总结 (一)进程的描述 1.操作系统内核里有三大功能: 进程管理 内存管理 文件系统 2.进程描述符:task_struct 2.进程描述符——struct task_struct 1. p ...

  7. linux学习笔记【转】

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  8. Maximal GCD CodeForces - 803C (数论+思维优化)

    C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. python 中的三元表达式及lambda

    一.三元表达式 举一个简单的列子,很多地方都有这样的规定,比如用水或者用电,假设用水价格为3R/立方米,当你每个月用超过7立方米后,超出的水按照3.3R/立方米计价.然后写一个程序计算一个家庭每月的水 ...

  10. PAT 甲级 1044 Shopping in Mars

    https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264 Shopping in Mars is qu ...