3192: [JLOI2013]删除物品 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 872  Solved: 508[Submit][Status][Discuss] Description   箱子再分配问题需要解决如下问题:  (1)一共有N个物品,堆成M堆.  (2)所有物品都是一样的,但是它们有不同的优先级.  (3)你只能够移动某堆中位于顶端的物品.  (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端.若此物品是当前所有物…
当时考试时间剩下太短了然后就挂掉了..其实是个简单的数据结构. 话说一看最小还以为是动规呢.. 将两堆头对头排.比如样例就是 541|273 因为是必须有优先级次序,依次拿的话,看优先级大小相邻的两个物品位置,中间隔着多少其他物品就行了.因为你要移动相邻的两个,你肯定得把它们中间的所有物品移动一遍(因为两个都得先后在最上边). 标好号,用前缀和,拿树状数组维护,拿走之后变为0. #include<iostream> #include<cstdio> #include<cstr…
删除物品 bzoj-3192 JLOI-2013 题目大意:给你n个物品,分成2堆.所有的物品有不同的优先级.我只可以将一堆中的堆顶移动到另一个堆的堆顶.而如果当前物品是全局所有物品中优先级最高的,我可以直接将其删除.询问最小移动多少次,删除不计入总次数. 注释:$1\le n\le 10^5$. 想法:显然是两个栈.开始以为是每个堆中优先级最高的,然后一顿瞎想.如果是全局优先级最高的,就相当于弄两个栈,然后将两个栈顶对顶对到一起,开始指针在两个栈顶之间.那么栈顶的移动就相当于物品的移动.显然答…
既然要从一个堆的堆顶按顺序拿出来放到第二个堆的堆顶,那么我们就可以把两个堆顶怼在一起,这样从一个堆拿到另一个堆只需要移动指针就好了. 换句话说,把1~n倒着,n+1到n+m正着,用一个指针把两个序列分开就好了,然后用树状数组维护哪些点被取过就好了... #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #defin…
用数组表示两个栈,将两个栈的栈顶并在一起,用树状数组维护一下操作即可. 代码 #include<cstdio> #include<algorithm> #include<map> #define lb(x) (x&-x) using namespace std; ; int n,m,i,id[N],a[N],b[N],c[N],top,tot; long long ans; map<int,int> ma; void cc(int x,int w)…
Description   箱子再分配问题需要解决如下问题:  (1)一共有N个物品,堆成M堆.  (2)所有物品都是一样的,但是它们有不同的优先级.  (3)你只能够移动某堆中位于顶端的物品.  (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端.若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动.   (5)求出将所有物品删除所需的最小步数.删除操作不计入步数之中.  (6)只是一个比较难解决的问题,这里你只需要解决一个比较简单的版本:          不会有两个物品…
题目如下: Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element). Now you are su…
点我看题 这题十分奇淫技巧...QAQ因为知道是树状数组的题QAQ刚开始以为维护两个数组的树状数组然后模拟从大到小,然后发现不会打QAQ 于是悄悄咪咪翻开题解了. 实际上两个数组可以看做一个数组 如 1 4 5 2 7 3 实际上就是 5 4 1 | 2 7 3 “|”这个地方就是假设成一个指标,然后每次把这个指标移到某一个位置,这个位置左右两个边的数就可以删除. 所以就模拟从大到小删数. 第一次 5 4 1 2 | 7 3 指标移动1次就可以删掉“7” 第二次   5 | 4 1 2 3 指标…
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=3192 题解: 首先每次一定是来回移动直到最大的到顶上. 所以我们可以将第两个堆的堆顶接起来形成一个队列. 然后相当于中间一个象征两堆分界的指针在来回移动. 用树状数组维护一下区间内删除了几个点. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; ; ll ans,n,m,tr[maxn],mx;…
https://www.lydsy.com/JudgeOnline/problem.php?id=3192 箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆. (2)所有物品都是一样的,但是它们有不同的优先级. (3)你只能够移动某堆中位于顶端的物品. (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端.若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动. (5)求出将所有物品删除所需的最小步数.删除操作不计入步数之中. (6)只是一个比较难解决的问题,这里…