Codeforces Round 935-D

83 阅读2分钟
Problem - D - Codeforces Round 935
思路

最后停在第 mm 位上那么一定会支付 amam ,在 mm 之后的位置由于可以执行任意次交换位置的操作,那么每个位置所给的硬币为 min(ai,bi)min(ai,bi)

又因为要排在前 mm 位,那么在 mm 之前的位置都是可行的,图解:

image.png

最后将前后最小花费相加即可。

Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int fast_io=[](){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	return 0;
}();
ll a[200022],b[200022];
ll t,n,m,sum,m_sum;
int main(){
    cin >> t;
    while(t--){
        cin >> n >> m;
        for(ll i=1;i<=n;++i)
            cin >> a[i];
        for(ll i=1;i<=n;++i)
            cin >> b[i];
        sum=a[m],m_sum=a[m];
        for(ll i=m-1;i>0;--i){
        	m_sum=m_sum-a[i+1]+a[i]+b[i+1];
        	sum=min(sum,m_sum);
		} 
        for(ll i=m+1;i<=n;++i)
            sum+=min(a[i],b[i]);
        cout << sum << endl;
    }
    return 0;
}
翻译题意

题目描述

这些人排成了一个 𝑛𝑛 人的队列,从编号 𝑖=1𝑖=1 的人开始,向 D 询问生命的意义。不幸的是,A 正在忙于为这个问题编写传奇故事,所以他来得稍晚一些,站在 𝑛𝑛 号人的后面。A 对这种情况非常不满意,所以他决定贿赂一些他前面的人。

对于队列中的第 𝑖𝑖 个人,A 知道两个值:𝑎𝑖𝑎𝑖 和 𝑏i𝑏i。如果此刻 A 站在位置 𝑖𝑖 ,那么他可以选择任何一个位置 𝑗𝑗 (𝑗<𝑖)(𝑗<𝑖) ,并与位置 𝑗𝑗 的人交换位置。在这种情况下,A 必须支付 𝑎𝑗𝑎𝑗 个硬币给他。对于每个 𝑘𝑘(𝑗<𝑘<𝑖)(𝑗<𝑘<𝑖),A 必须支付 𝑏𝑘𝑏𝑘 个硬币给位置 𝑘𝑘 的人。A 可以执行任意次数的这个动作。

A 很节俭,所以他希望尽可能少花费硬币,但他又不想等太久,所以他认为自己应该排在前 𝑚𝑚 个人中。

帮助 A 确定他需要花费的最少硬币数量,以便不用等待太久。

输入格式

每个测试包含多组输入数据。第一行包含一个整数 𝑡𝑡 (1𝑡104)(1≤𝑡≤10^4) — 测试用例的数量。接下来是测试用例的描述。

每个测试用例的第一行包含两个整数 𝑛𝑛 和 𝑚𝑚 (1𝑚𝑛200000)(1≤𝑚≤𝑛≤200 000) — 队列中除 A 外的人数和 A允许的最大最终位置。

第二行包含 𝑛𝑛 个整数 𝑎1,𝑎2,…,𝑎𝑛,由空格分隔 (1𝑎𝑖1091≤𝑎𝑖≤10^9)。

第三行包含 𝑛𝑛 个整数 𝑏1,𝑏2,…,𝑏𝑛,由空格分隔 (1𝑏𝑖1091≤𝑏𝑖≤10^9)。

保证所有测试用例中 𝑛𝑛 的值之和不超过 21052⋅10^5

输出格式

对于每个测试用例,输出一个整数 - A需要花费的最少硬币数量。

输入数据 1

4
4 2
7 3 6 9
4 3 8 5
6 2
6 9 7 1 8 3
5 8 8 1 4 1
7 7
7 2 9 2 6 5 9
9 1 10 7 1 4 9
2 1
2 3
1 1

输出数据 1

14
22
9
3