CF797F Mice and Holes

#include<bits/stdc++.h>
#define int long long
#define MAXN 5010
#define INF 1145141919810
using namespace std;
int n , m;
int a[MAXN];
struct node{
	int indx;
	int suM;
}b[MAXN];
int dp[MAXN][MAXN] , sum[MAXN];
int S[MAXN];
bool cmp(node x , node y) {
	return x.indx < y.indx ;
}
signed main() {
	cin >> n >> m;
	for (int i = 1 ; i <= n ; i++) {
		cin >> a[i];
	}
	for (int i = 1 ; i <= m ; i++) {
		cin >> b[i].indx >> b[i].suM ;
	}
	sort(a + 1 , a + 1 + n);
	sort(b + 1 , b + 1 + m , cmp);
	for (int i = 1 ; i <= m ; i++) {
		S[i] += S[i-1] + b[i].suM ;
	}
	if(S[m] < n) {
		cout << -1 ;
		return 0; 
	}
	int q[MAXN] = {0}, t , f ;
	memset (dp , INF , sizeof(dp));
	dp[0][0] = 0;
	for (int i = 1 ; i <= m ; i++) {
		t = 1;
		f = 0;
		dp[i][0] = 0 , q[t] = 0;
		for (int j = 1 ; j <= S[i] && j <= n ; j++ ) {
			dp[i][j] = dp[i-1][j];
			sum[j] = sum[j - 1] + abs(a[j] - b[i].indx);
			while ((j - q[f] > b[i].suM) || f <= t && dp[i - 1][q[f]] - sum[q[f]] > dp[i - 1][j] - sum[j]) f++;
            q[++t] = j;
			dp[i][j] = min(dp[i][j] , sum[j] + dp[i - 1][q[f]] - sum[q[f]]);
//			cout << dp[i][j] << endl;
		}
		
	}
	cout << dp[m][n] ;
	return 0;
}
posted @ 2025-09-01 09:27  shuxin5  阅读(11)  评论(0)    收藏  举报