求助
查看原帖
求助
254733
Night_Bringer楼主2021/2/4 15:40

第一个就WA了,过了样例。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 1e17
#define int long long
void Quick_Read(int &N) {
	N = 0;
	int op = 1;
	char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-')
			op = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9') {
		N = (N << 1) + (N << 3) + (c ^ 48);
		c = getchar();
	}
	N *= op;
}
void Quick_Write(int N) {
	if(N < 0) {
		putchar('-');
		N = -N;
	}
	if(N >= 10)
		Quick_Write(N / 10);
	putchar(N % 10 + 48);
}
const int MAXN = 1e5 + 5;
struct Node {
	int hill, tim;
};
int dp[MAXN];
Node cat[MAXN];
int dis[MAXN], need[MAXN], sum[MAXN];
int n, m, p;
int que[MAXN];
int head, tail;
int Get_Dp(int i, int j) {
	return dis[j] + need[i] * (i - j) - sum[i];
}
int Get_Up(int j, int k) {
	return dis[j] - dis[k];
}
int Get_Down(int j, int k) {
	return j - k;
}
void Line_Dp() {
	for(int i = 1; i <= m; i++)
		dp[i] = INF;
	for(int i = 1; i <= p; i++) {
		for(int j = 1; j <= m; j++)
			dis[j] = dp[j] + sum[j];
		head = 1;
		tail = 1;
		for(int j = 1; j <= m; j++) {
			while(Get_Up(que[head + 1], que[head]) <= need[j] * Get_Down(que[head + 1], que[head]) && head <= tail)
				head++;
			dp[j] = Get_Dp(j, que[head]);
			while(Get_Up(j, que[tail]) * Get_Down(que[tail], que[tail - 1]) <= Get_Up(que[tail], que[tail - 1]) * Get_Down(j, que[tail]) && head <= tail)
				tail--;
			que[++tail] = j;
		}
	}
	Quick_Write(dp[m]);
}
void Read() {
	Quick_Read(n);
	Quick_Read(m);
	Quick_Read(p);
	for(int i = 2; i <= n; i++) {
		Quick_Read(dis[i]);
		dis[i] += dis[i - 1];
	}
	for(int i = 1; i <= m; i++) {
		Quick_Read(cat[i].hill);
		Quick_Read(cat[i].tim);
		need[i] = cat[i].tim - dis[cat[i].hill];
	}
	sort(need + 1, need + 1 + m);
	for(int i = 1; i <= m; i++)
		sum[i] = sum[i - 1] + need[i];
}
signed main() {
	Read();
	Line_Dp();
	return 0;
}
2021/2/4 15:40
加载中...