Educational Codeforces Round 91 (Rated for Div. 2) D. Berserk And Fireball
题目链接:https://codeforces.com/contest/1380/problem/D
题意
给出一个大小为 $n$ 的排列 $a$ 和一个序列 $b$,有两种操作:
- 花费 $x$ 消除连续 $k$ 个数
- 花费 $y$ 选取两个相邻的数,消除较小的数
问能否将 $a$ 变为 $b$,以及最小花费。
题解
如果序列 $b$ 中元素的出现顺序与 $a$ 不一致,则无解。
否则根据 $b$ 将 $a$ 分割为一个个区间,对每一个区间进行单独操作。
对于一个长度小于 $k$ 的区间:
- 如果区间最大值大于两端的分割点,则无解
- 否则花费为 $size \times y$
对于一个长度大于等于 $k$ 的区间:
如果区间最大值大于两端的分割点,则必须使用一次操作一
- 如果操作一花费较小,花费为 ${\lfloor \frac{size}{k} \rfloor} \times x + size\ \%\ k \times y$
- 如果操作二花费较小,花费为 $x + (size - k) \times y$
如果区间最大值小于两端的分割点,则可不必使用操作一
- 如果操作一花费较小,花费为 ${\lfloor \frac{size}{k} \rfloor} \times x + size\ \%\ k \times y$
- 如果操作二花费较小,花费为 $size \times y$
代码
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
int main() {
ll n, m, x, k, y; cin >> n >> m >> x >> k >> y;
int a[n] = {};
int pos[n] = {};
for (int i = 0; i < n; i++) {
cin >> a[i];
--a[i];
pos[a[i]] = i;
}
int b[m] = {};
int mx_pos = 0;
bool skip[n] = {}; //记录在 a 中的分割点
for (int i = 0; i < m; i++) {
cin >> b[i];
--b[i];
if (pos[b[i]] < mx_pos) {
cout << -1 << "\n";
return 0;
} else mx_pos = pos[b[i]];
skip[b[i]] = true;
}
vector<vector<int>> v; //存储每个区间
vector<pair<int, int>> border; //存储每个区间两端的分割点
vector<int> t; //每个区间
int l = -1, r = -1; //左右端点
for (int i = 0; i < n; i++) {
if (skip[a[i]]) { //如果遇到区间分割点
if (l == -1 and r == -1) { //第一个区间只有右端点
r = a[i];
} else { //之后区间的左端点为上一个区间的右端点
l = r;
r = a[i];
}
if (t.size() > 0) {
v.push_back(t);
border.emplace_back(l, r);
t.clear();
}
continue;
}
t.push_back(a[i]);
}
if (t.size() > 0) {
l = r;
v.push_back(t);
border.emplace_back(l, -1);
t.clear();
}
ll ans = 0;
for (int i = 0; i < v.size(); i++) {
bool seg_mx = *max_element(v[i].begin(), v[i].end()) > max(border[i].first, border[i].second);
if (v[i].size() < k) {
if (seg_mx) {
cout << -1 << "\n";
return 0;
}
ans += v[i].size() * y;
} else {
if (seg_mx)
ans += min(x + (v[i].size() - k) * y, v[i].size() / k * x + v[i].size() % k * y);
else
ans += min(v[i].size() * y, v[i].size() / k * x + v[i].size() % k * y);
}
}
cout << ans << "\n";
}
Educational Codeforces Round 91 (Rated for Div. 2) D. Berserk And Fireball的更多相关文章
- Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams
题目链接:https://codeforces.com/contest/1380/problem/C 题意 给 $n$ 个数分组,要求每组的最小值乘以该组数的个数不小于 $x$ . 题解 从大到小依次 ...
- Educational Codeforces Round 91 (Rated for Div. 2) B. Universal Solution
题目链接:https://codeforces.com/contest/1380/problem/B 题意 你在和一个机器人玩石头剪刀布,给出一个长为 $n$ 的出拳序列,机器人会从某一处开始出拳 $ ...
- Educational Codeforces Round 91 (Rated for Div. 2) A. Three Indices
题目链接:https://codeforces.com/contest/1380/problem/A 题意 给出一个大小为 $n$ 的排列,找出是否有三个元素满足 $p_i < p_j\ and ...
- Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams (模拟)
题意:有\(n\)个队员,每个队友都有一个能力值,构造队伍,要求队伍人数*队伍中最低能力值不小于\(x\),求能构造的最大队伍数. 题解:大水题,排个序,倒着模拟就行了. 代码: int t; int ...
- Educational Codeforces Round 91 (Rated for Div. 2) B. Universal Solution (贪心)
题意:石头剪刀布,bot有一串字符,表示他要出什么,你需要事先确定你的出招方案,然后遍历bot的字符串,从\(i\)位置开始跑一个循环,每次跑都要记录你赢的次数贡献给\(sum\),现要求\(\fra ...
- Educational Codeforces Round 91 (Rated for Div. 2) A. Three Indices (模拟)
题意:有一长度为\(n\)的序列,问是否能找到\(a_{i}<a_{j},a_{j}>a_{k},(i<j<k)\),如果满足,输出其位置. 题解:直接暴力两头找即可,最坏复杂 ...
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
随机推荐
- 【SpringBoot1.x】SpringBoot1.x 开发热部署和监控管理
SpringBoot1.x 开发热部署和监控管理 热部署 在开发中我们修改一个 Java 文件后想看到效果不得不重启应用,这导致大量时间花费,我们希望不重启应用的情况下,程序可以自动部署(热部署). ...
- 【SpringMVC】SpringMVC 异常处理
SpringMVC 异常处理 文章源码 异常处理思路 系统中异常包括两类:预期异常和运行时异常,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. Cont ...
- Tomcat的整体架构
Tomcat通过连接器和容器这两个核心组件完成整体工作,连接器负责处理socket连接和网络字节流与Request和Response对象的转化:容器负责加载和管理Servlet,以及具体处理Reque ...
- 技术基础 | Cassandra RBAC助你打击“虚拟海盗”,让他们对数据“战利品”望而不得
现如今,我们称虚拟世界里的海盗们为"黑客",他们所追寻的战利品就是在你数据库某处的数据. 而我们能够保证你的数据安全的工具之一,就是"Cassandra基于角色的访问 ...
- 跟我一起学Redis之加个哨兵让主从复制更加高可用
前言 主从复制的实现在上一篇已经分享过,虽然主从复制本身的确让读写分离更加高效,但是对于整体高可用存在很大的劣势:当主节点宕机了之后还需要人为重新进行主从关系配置:这不是开玩笑嘛,这样人为干预,故障恢 ...
- 3610:20140827:161308.483 No active checks on server: host [192.168.1.10] not found
3610:20140827:161308.483 No active checks on server: host [192.168.1.10] not found
- LeetCode671. 二叉树中第二小的节点
题目 纯暴力 1 class Solution { 2 public: 3 vector<int>ans; 4 int findSecondMinimumValue(TreeNode* r ...
- oracle常用hint添加
1.视图添加索引 /* Formatted on 2020/1/6 下午 04:46:37 (QP5 v5.163.1008.3004) */ SELECT /*+index(VIEW_NAME.TA ...
- 实现所有SAP设备打印机并行打印
SAP版本:ECC 6.0 701 1.如何实现所有SAP设备打印机并行打印? I.通过事务码:SPAD,进入假脱机管理初始屏幕.点击左上角的菜单中 配置(c)=>输出设备,进入SAP系统 输出 ...
- 记录一下 ThreadLocal 与 WeakReference
ThreadLocal & WeakReference Thread整体的模块图 Thread -> ThreadLocalMap 对于继承了 WeakReference Entry本身 ...