嘟嘟嘟

只要每一次将优先级最高的上面的物品移走,就一定能保证是最优解。

所以我们只要想办法简化这个模拟移物品的过程,看完了题解后,发现可以这么想,我们可以把两个栈头碰头的挨在一起,然后设一个指针代表两个栈的分界线,这样移动物品就变成了移动指针,而每一次移动的步数,就是指针和这个物品之间的距离。

开始的时候这个序列每一位都是1,然后如果删除了物品 i,就将 a[i] = 0,这样移动距离就是区间和了,然后用线段树维护即可。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter printf("\n")
#define space printf(" ")
#define Mem(a) memset(a, 0, sizeof(a))
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const int eps = 1e-;
const int maxn = 1e5 + ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch))
{
ans = ans * + ch - ''; ch = getchar();
}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar(x % + '');
} int n1, n2, N;
ll a[maxn], t[maxn];
int pos[maxn]; int l[maxn << ], r[maxn << ], sum[maxn << ];
void build(int L, int R, int now)
{
l[now] = L; r[now] = R;
if(L == R) {sum[now] = ; return;}
int mid = (L + R) >> ;
build(L, mid, now << );
build(mid + , R, now << | );
sum[now] = sum[now << ] + sum[now << | ];
}
void update(int id, int now)
{
if(l[now] == r[now]) {sum[now] = ; return;}
int mid = (l[now] + r[now]) >> ;
if(id <= mid) update(id, now << );
else update(id, now << | );
sum[now] = sum[now << ] + sum[now << | ];
}
int query(int L, int R, int now)
{
if(l[now] == L && r[now] == R) return sum[now];
int mid = (l[now] + r[now]) >> ;
if(R <= mid) return query(L, R, now << );
else if(L > mid) return query(L, R, now << | );
else return query(L , mid, now << ) + query(mid + , R, now << | );
} ll ans = ; int main()
{
n1 = read(); n2 = read();
N = n1 + n2;
for(int i = n1; i > ; --i) a[i] = read();
for(int i = n1 + ; i <= N; ++i) a[i] = read();
for(int i = ; i <= N; ++i) t[i] = a[i];
sort(t + , t + N + ); //离散化优先级
for(int i = ; i <= N; ++i) a[i] = lower_bound(t + , t + N + , a[i]) - t;
for(int i = ; i <= N; ++i) pos[a[i]] = i; //记录每一个优先级所在位置
build(, N, );
int x = pos[N] > n1 ? n1 + : n1; //指针刚开始可以在n1处,也可以在n2处,需判断
for(int i = N; i > ; --i)
{
if(pos[i] < x) ans += query(pos[i] + , x, );
else if(pos[i] > x) ans += query(x, pos[i] - , );
//一定要有if(pos[i] > x),因为刚开始可能优先级最大的在栈顶,不需移动,否则会RE
x = pos[i]; //移动指针
update(x, );
}
write(ans); enter;
return ;
}

[JLOI2013]删除物品的更多相关文章

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

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

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

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

  3. 3192: [JLOI2013]删除物品

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Word文档中多个编号放同一行的方法(非技术)

    最近在帮公司出应届生校招面试题,为了方便,选择题部分的答案用了Word的[编号]功能!如下截图所示: 这么简短的四个答案这么竖着放很占空间(打印时也很浪纸张),能不能让它们全部横放在同一行,或两两一组 ...

  2. MYSQL查询优化:Limit

    Limit语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于强制 SELECT 语句返回指定的 ...

  3. django项目一 CRM表结构

    from django.db import models from django.contrib import auth from django.core.exceptions import Perm ...

  4. js飘窗

    广告页上总会出现飘窗效果: adver_pos_id = getOtherParameter("id"); adver_Sid = getOtherParameter(" ...

  5. js弹窗 js弹出DIV,并使整个页面背景变暗

    1.首先写一个遮罩层div,然后再写一个弹窗的div <!-- 遮罩层 --> <div id="cover" style="background: # ...

  6. js-JavaScript常见的创建对象的几种方式

    1.通过Object构造函数或对象字面量创建单个对象 这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为了解决这个问题,出现了工厂模式. 2.工厂模式 考虑在ES中无法创建类( ...

  7. CSS控制Span强制换行亲测

    span { word-wrap: break-word; word-break: break-all; white-space: pre-wrap !important; }

  8. LeetCode题解之Find All Duplicates in an Array

    1.题目描述 2.问题分析 将数组中的元素 A[i] 放到 A[ A[i] - 1] 的位置.然后遍历一边数组,如果不满足 A[i] == i+1,则将A[i]添加到 结果中. 3.代码 vector ...

  9. Windows 自动更新服务恢复

    之前手贱删除了Windows的自动更新服务,命令: SC DELETE Wuauserv 悲剧的是最近中了[永恒之蓝]病毒,很恼人!杀了毒,最后还是得仰仗Windows的补丁来加固系统.于是想通过SC ...

  10. Python环境下如何安装爬虫需求的一些库

    是在CMD环境下的: request库pip install request 回车 pandas库 同理,pip install pandas :这里需要声明下,这个是不一定成功的,刚入门稍微看了一点 ...