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

当时考试时间剩下太短了然后就挂掉了..其实是个简单的数据结构. 话说一看最小还以为是动规呢.. 将两堆头对头排.比如样例就是 541|273 因为是必须有优先级次序,依次拿的话,看优先级大小相邻的两个物品位置,中间隔着多少其他物品就行了.因为你要移动相邻的两个,你肯定得把它们中间的所有物品移动一遍(因为两个都得先后在最上边). 标好号,用前缀和,拿树状数组维护,拿走之后变为0. #include<iostream> #include<cstdio> #include<cstr…
3192: [JLOI2013]删除物品 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 872  Solved: 508[Submit][Status][Discuss] Description   箱子再分配问题需要解决如下问题:  (1)一共有N个物品,堆成M堆.  (2)所有物品都是一样的,但是它们有不同的优先级.  (3)你只能够移动某堆中位于顶端的物品.  (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端.若此物品是当前所有物…
题目如下: 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…
删除物品 bzoj-3192 JLOI-2013 题目大意:给你n个物品,分成2堆.所有的物品有不同的优先级.我只可以将一堆中的堆顶移动到另一个堆的堆顶.而如果当前物品是全局所有物品中优先级最高的,我可以直接将其删除.询问最小移动多少次,删除不计入总次数. 注释:$1\le n\le 10^5$. 想法:显然是两个栈.开始以为是每个堆中优先级最高的,然后一顿瞎想.如果是全局优先级最高的,就相当于弄两个栈,然后将两个栈顶对顶对到一起,开始指针在两个栈顶之间.那么栈顶的移动就相当于物品的移动.显然答…
题面: 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;…
点我看题 这题十分奇淫技巧...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 指标…
既然要从一个堆的堆顶按顺序拿出来放到第二个堆的堆顶,那么我们就可以把两个堆顶怼在一起,这样从一个堆拿到另一个堆只需要移动指针就好了. 换句话说,把1~n倒着,n+1到n+m正着,用一个指针把两个序列分开就好了,然后用树状数组维护哪些点被取过就好了... #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #defin…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3436 树状数组做法<猛戳> Splay tree的经典题目,有删除和移动操作.首先要离散化各个点,而且对于没有区间还要缩点.对于Top操作,先把目标节点删除,然后移到最左端.Query操作,Splay(tar,0),然后直接访问size.对于Rank操作,通过size产找即可.注意,在每次更新后,都要把处理过的节点都要Splay(tar,0)才能保证复杂度为O(log n),因为这样才能方便下次的…
Sample Input 5 4 1 2 3 4 5 -5 -1 -3 -1 Sample Output 3 思路,首先发现a[i]的值的范围是在1~n之间,每次插入我们可以直接把cnt[a[i]]++ 删除的时候,要把所有在后面的数往前挪一位,那么其实也相当于所有在后面的数的前面 的cnt的前缀和减去1,于是利用树状数组动态维护前缀和,利用前缀和来找到删除的元素 时间复杂度O(nlogn) #include<bits/stdc++.h> using namespace std; #defin…
3192: [JLOI2013]删除物品 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1366 Solved: 794 [Submit][Status][Discuss] Description 箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆. (2)所有物品都是一样的,但是它们有不同的优先级. (3)你只能够移动某堆中位于顶端的物品. (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端.若此物品是当前所有物品中优先级…