結果
| 問題 | No.2169 To Arithmetic |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-03-23 11:19:29 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 87 ms / 2,000 ms |
| コード長 | 1,827 bytes |
| 記録 | |
| コンパイル時間 | 2,185 ms |
| コンパイル使用メモリ | 341,056 KB |
| 実行使用メモリ | 8,192 KB |
| 最終ジャッジ日時 | 2026-03-23 11:19:43 |
| 合計ジャッジ時間 | 6,261 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct Line {
long long m, b;
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N, Q;
cin >> N >> Q;
vector<long long> A(N);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}
vector<long long> delta(N-1);
for (int i = 0; i < N-1; ++i) {
delta[i] = A[i+1] - A[i];
}
sort(delta.begin(), delta.end());
vector<long long> pre(N, 0);
for (int i = 0; i < N-1; ++i) {
pre[i+1] = pre[i] + delta[i];
}
vector<Line> hull;
for (int i = 0; i < N; ++i) {
long long m = -i;
long long b = A[i];
while (hull.size() >= 2) {
Line l1 = hull[hull.size()-2];
Line l2 = hull[hull.size()-1];
long long term1 = (l2.b - l1.b) * (m - l1.m);
long long term2 = (l1.m - l2.m) * (b - l1.b);
if (term1 + term2 >= 0) {
hull.pop_back();
} else {
break;
}
}
hull.push_back({m, b});
}
while (Q--) {
long long d;
cin >> d;
int k = upper_bound(delta.begin(), delta.end(), d) - delta.begin();
long long first = k * d - pre[k];
int left = 0, right = hull.size() - 1;
while (left < right) {
int mid = (left + right) / 2;
long long val1 = hull[mid].m * d + hull[mid].b;
long long val2 = hull[mid+1].m * d + hull[mid+1].b;
if (val1 >= val2) {
right = mid;
} else {
left = mid + 1;
}
}
long long max_val = hull[left].m * d + hull[left].b;
long long second = max_val - A[0];
cout << first + second << '\n';
}
return 0;
}
vjudge1