第一个就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;
}