This commit is contained in:
1 parent
bde443aa2e
commit
209d5715a5
2 files changed
+159
No files matched your search
+79
@@ -0,0 +1,79 @@
|
|||||||
|
#include <bits/stdc++.h>
|
||||||
|
using namespace std;
|
||||||
|
int n, m, k;
|
||||||
|
long long x, y;
|
||||||
|
int a[200005];
|
||||||
|
int b, preb;
|
||||||
|
unordered_map<int, int> wz;
|
||||||
|
bool k_is_better;
|
||||||
|
vector<int> mor;
|
||||||
|
long long del(int pre, int todo)
|
||||||
|
{
|
||||||
|
if (todo <= pre)
|
||||||
|
return -1;
|
||||||
|
if (todo == pre + 1)
|
||||||
|
return 0;
|
||||||
|
mor.clear();
|
||||||
|
for (int j = pre + 1; j <= todo - 1; ++j)
|
||||||
|
if (a[j] > max(a[todo], a[pre]))
|
||||||
|
mor.push_back(j);
|
||||||
|
if (!mor.empty() && (todo - pre - 1) < k) // 如果有大数且长度不足以运行一次 k 则不存在
|
||||||
|
return -1;
|
||||||
|
if (k_is_better)
|
||||||
|
{
|
||||||
|
return ((todo - pre - 1) % k) * y + ((todo - pre - 1) / k) * x; // 先用 y 移除多余的数,最后用多个 k 直接删完
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!mor.empty())
|
||||||
|
return (todo - pre - 1 - k) * y + x; // 用一次k清除最大数,其余用y
|
||||||
|
else
|
||||||
|
return (todo - pre - 1) * y; // 全部用y
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d%d%lld%d%lld", &n, &m, &x, &k, &y);
|
||||||
|
k_is_better = x < (k * y);
|
||||||
|
for (int i = 1; i <= n; ++i)
|
||||||
|
{
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
wz[a[i]] = i;
|
||||||
|
}
|
||||||
|
long long ans = 0;
|
||||||
|
for (int i = 1; i <= m; ++i)
|
||||||
|
{
|
||||||
|
scanf("%d", &b);
|
||||||
|
int todo = wz[b], pre = 0;
|
||||||
|
if (i != 1)
|
||||||
|
pre = wz[preb];
|
||||||
|
long long d = del(pre, todo);
|
||||||
|
if (d == -1ll)
|
||||||
|
{
|
||||||
|
printf("-1\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ans += d;
|
||||||
|
preb = b;
|
||||||
|
}
|
||||||
|
long long d = del(wz[b], n + 1);
|
||||||
|
if (d == -1ll)
|
||||||
|
{
|
||||||
|
printf("-1\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("%lld\n", ans + d);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
若 k 删除更优,先删到能被 k 整除的长度,则先 k 删除,最后运行多次 k 删除
|
||||||
|
len % k
|
||||||
|
若 1 删除更优,先用 k 删除删去大于两边的,最后用 1 删除
|
||||||
|
7 2
|
||||||
|
3 3 1
|
||||||
|
5 7 0 3 1 6 4
|
||||||
|
5 4
|
||||||
|
|
||||||
|
输出 5
|
||||||
|
*/
|
||||||
+80
@@ -0,0 +1,80 @@
|
|||||||
|
# CF1380D Berserk And Fireball
|
||||||
|
|
||||||
|
## 题目描述
|
||||||
|
|
||||||
|
有 $n$ 个战士站成一排,第 $i$ 个战士的战力是 $a_i$。所有战士的战力都是两两不同的。
|
||||||
|
|
||||||
|
你可以使用两种类型的咒语:
|
||||||
|
|
||||||
|
1. 火球术:你可以消耗 $x$ 点法力值来干掉连续的 $k$ 个战士(你必须干掉正好 $k$ 个,而不能干掉 $\le k$ 个)。
|
||||||
|
|
||||||
|
2. 狂暴术:你可以消耗 $y$ 点法力值,选择站在一起的两个战士使他们展开决斗,战力较弱的那个战士将会被干掉。
|
||||||
|
|
||||||
|
我们来举个例子,假设有 $7$ 个战士,其战力分别为 $[2,3,7,8,11,5,4]$,且此时的$k=3$($k$ 的定义详见火球术)。如果你对战力为 $8$ 与 $11$ 的两个战士施加狂暴术,剩下战士的战力将会变成 $[2,3,7,11,5,4]$(战力为 $8$ 的战士在决斗中战死)。然后如果我们对战力为 $[7,11,5]$ 的战士施加火球术,剩下战士的战力将会变成 $[2,3,4]$。
|
||||||
|
|
||||||
|
你想要组建一支军队,因此你想要将所有战士战力的序列从 $a_1,a_2,\cdots,a_n$ 变为 $b_1,b_2,\cdots,b_m$。试计算你所需的最少法力值。
|
||||||
|
|
||||||
|
## 输入格式
|
||||||
|
|
||||||
|
第一行两个整数 $n,m (1\le n,m\le 2\cdot 10^5)$ ——序列 $a$ 的长度和序列 $b$ 的长度。
|
||||||
|
|
||||||
|
第二行三个整数 $x,k,y (1\le x,y\le 10^9,1\le k\le n)$ ——火球术消耗的法力值,火球术的范围和狂暴术消耗的法力值。
|
||||||
|
|
||||||
|
第三行 $n$ 个整数 $a_1,a_2,…,a_n (1\le a_i\le n)$。保证 $a_i$ 是两两不同的。
|
||||||
|
|
||||||
|
第四行 $m$ 个整数 $b_1,b_2,…,b_m(1\le b_i\le n)$。保证 $b_i$ 是两两不同的。
|
||||||
|
|
||||||
|
## 输出格式
|
||||||
|
|
||||||
|
一行一个整数,即将序列从 $a_1,a_2,\cdots,a_n$ 变为 $b_1,b_2,\cdots,b_m$所需的最少法力值。如果无法完成变换,则输出$-1$。
|
||||||
|
|
||||||
|
## 输入输出样例 #1
|
||||||
|
|
||||||
|
### 输入 #1
|
||||||
|
|
||||||
|
```
|
||||||
|
5 2
|
||||||
|
5 2 3
|
||||||
|
3 1 4 5 2
|
||||||
|
3 5
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输出 #1
|
||||||
|
|
||||||
|
```
|
||||||
|
8
|
||||||
|
```
|
||||||
|
|
||||||
|
## 输入输出样例 #2
|
||||||
|
|
||||||
|
### 输入 #2
|
||||||
|
|
||||||
|
```
|
||||||
|
4 4
|
||||||
|
5 1 4
|
||||||
|
4 3 1 2
|
||||||
|
2 4 3 1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输出 #2
|
||||||
|
|
||||||
|
```
|
||||||
|
-1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 输入输出样例 #3
|
||||||
|
|
||||||
|
### 输入 #3
|
||||||
|
|
||||||
|
```
|
||||||
|
4 4
|
||||||
|
2 1 11
|
||||||
|
1 3 2 4
|
||||||
|
1 3 2 4
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输出 #3
|
||||||
|
|
||||||
|
```
|
||||||
|
0
|
||||||
|
```
|
||||||
Reference in new issue
Block a user