abc379 C
作者:
Air1222
,
2024-11-10 10:33:52
,
所有人可见
,
阅读 2
//题目描述,有m个位置有石子,其中总长度为n,每个位置可以向i+1传送石子,求让每个位置都有石子的操作最小值
//发现从每个有石子的位置开始考虑,情况太多,没法计算
//考虑补差法,即从0的位置给所有位置分配石子-把部分位置的石子移到其他位置的距离*石子数
//即转移每个线段的起始位置,方便计算
#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
const int N = 2e5+10;
typedef pair<int,int>PII;
typedef long long LL;
PII p[N];
int main()
{
LL n,m;
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>p[i].x;
for(int i=1;i<=m;i++) cin>>p[i].y;
sort(p+1,p+1+m);
LL sum=0;
for(int i=1;i<=m;i++)
{
if(sum<p[i].x-1)
{
cout<<-1;
return 0;
}
else sum+=p[i].y;
}
if(sum!=n)
{
cout<<-1;
return 0;
}
LL ans=n*(n+1)/2;
for(int i=1;i<=m;i++) ans-=1ll*p[i].x*p[i].y;
cout<<ans;
return 0;
}