题目链接: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的更多相关文章

  1. Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams

    题目链接:https://codeforces.com/contest/1380/problem/C 题意 给 $n$ 个数分组,要求每组的最小值乘以该组数的个数不小于 $x$ . 题解 从大到小依次 ...

  2. Educational Codeforces Round 91 (Rated for Div. 2) B. Universal Solution

    题目链接:https://codeforces.com/contest/1380/problem/B 题意 你在和一个机器人玩石头剪刀布,给出一个长为 $n$ 的出拳序列,机器人会从某一处开始出拳 $ ...

  3. Educational Codeforces Round 91 (Rated for Div. 2) A. Three Indices

    题目链接:https://codeforces.com/contest/1380/problem/A 题意 给出一个大小为 $n$ 的排列,找出是否有三个元素满足 $p_i < p_j\ and ...

  4. Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams (模拟)

    题意:有\(n\)个队员,每个队友都有一个能力值,构造队伍,要求队伍人数*队伍中最低能力值不小于\(x\),求能构造的最大队伍数. 题解:大水题,排个序,倒着模拟就行了. 代码: int t; int ...

  5. Educational Codeforces Round 91 (Rated for Div. 2) B. Universal Solution (贪心)

    题意:石头剪刀布,bot有一串字符,表示他要出什么,你需要事先确定你的出招方案,然后遍历bot的字符串,从\(i\)位置开始跑一个循环,每次跑都要记录你赢的次数贡献给\(sum\),现要求\(\fra ...

  6. Educational Codeforces Round 91 (Rated for Div. 2) A. Three Indices (模拟)

    题意:有一长度为\(n\)的序列,问是否能找到\(a_{i}<a_{j},a_{j}>a_{k},(i<j<k)\),如果满足,输出其位置. 题解:直接暴力两头找即可,最坏复杂 ...

  7. 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 ...

  8. 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 ...

  9. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

随机推荐

  1. Task1:知识图谱介绍(1天)

    一.知识图谱简介 "知识图谱本质上是语义网络(Semantic Network)的知识库".但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图( ...

  2. SQL注入之堆叠注入(堆查询注入)

    Stached injection -- 堆叠注入 0x00 堆叠注入的定义 ​ Stacked injection 汉语翻译过来后,称 为堆查询注入,也有称之为堆叠注入.堆叠注入为攻击者提供了很多的 ...

  3. wpf 在不同DPI下如何在DrawingVisual中画出清晰的图形

    环境Win10 VS2017 .Net Framework4.7.1   本文仅讨论在DrawingVisual中进行的画图.   WPF单位,系统DPI,显示器DPI三者的定义及关系 WPF单位:一 ...

  4. netstat -an|awk '/^tcp/ {++s[$NF]} END {for( a in s) {print a,s[a]}}'

    监控tcp连接情况 netstat  -an|awk '/^tcp/ {++s[$NF]} END {for( a in s) {print  a,s[a]}}'

  5. Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结

    在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...

  6. [Usaco2010 Hol]cowpol 奶牛政坛

    题目描述: 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可 ...

  7. 1.2V升5V电源芯片,1.2V升3V的IC电路图方案

    镍氢电池就是典型的1.2V供电电源了,但是1.2V电压太低,需要电源芯片来1.2V升5V输出,或1.2V升3V输出稳压,1.2V单独难给其他芯片或者模块供电,即使串联1.2V*2=2.4V,也是因为电 ...

  8. Centos7 虚拟机优化

    配置yum源 rm -f /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/ ...

  9. three.js cannon.js物理引擎地形生成器和使用指针锁定控件

    今天郭先生说一说使用cannon.js物理引擎绘制地形和使用指针锁定控件.效果如下图.线案例请点击博客原文. 这里面的生成地形的插件和指针锁定控件也是cannon.js的作者schteppe封装的,当 ...

  10. JavaWeb三大框架基础架构——CRUD的基础功能搭建

    @ 目录 介绍 注意 applicationContext.xml mybatis-config.xml web.xml 结束语 介绍 项目前端采用了bootstrap,后端是ssm三大框架 注意 这 ...