CF797F Mice and Holes 题解
_Jocularly_ · · 题解
首先根据贪心的思想可知,如果老鼠
设
考虑如何优化。设
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int x[5005];
pair<int,int> p[5005];
int cnt[5005],sum[5005];
int dp[5005][5005];
int q[5005];
signed main(){
memset(dp,0x3f,sizeof(dp));
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> x[i];
}
for(int i=1;i<=m;i++){
cin >> p[i].first >> p[i].second;
}
sort(x + 1,x + n + 1);
sort(p + 1,p + m + 1);
for(int i=1;i<=m;i++){
sum[i] = sum[i - 1] + p[i].second;
}
if(sum[m] < n){
cout << -1;
return 0;
}
for(int i=0;i<=m;i++){
dp[i][0] = 0;
}
for(int i=1;i<=m;i++){
int l = 0,r = 0;
q[++ r] = 0;
for(int j=1;j<=min(sum[i],n);j++){
cnt[j] = cnt[j - 1] + abs(p[i].first - x[j]);
dp[i][j] = dp[i - 1][j];
while(l <= r && j - q[l] > p[i].second) l ++;
while(l <= r && dp[i - 1][q[l]] - cnt[q[l]] > dp[i - 1][j] - cnt[j]) l ++;
q[++ r] = j;
if(l <= r) dp[i][j] = min(dp[i][j],dp[i - 1][q[l]] - cnt[q[l]] + cnt[j]);
}
}
cout << dp[m][n];
return 0;
}