From 25abe811ae46dad8a202b7f43aa00a9cd7da0086 Mon Sep 17 00:00:00 2001 From: hanyixuanten <105723997+hanyixuanten@users.noreply.github.com> Date: Wed, 8 Jul 2026 20:34:52 +0800 Subject: [PATCH] new file: P1081.cpp --- P1081.cpp | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 P1081.cpp diff --git a/P1081.cpp b/P1081.cpp new file mode 100644 index 0000000..ae06a1f --- /dev/null +++ b/P1081.cpp @@ -0,0 +1,181 @@ +#include +#include +#include +#include +using namespace std; +const int maxn = 1e5 + 10; +const int max2 = 20; +const int inf = 2e9 + 5; +struct nextp +{ + int a, b; +} np[maxn]; +int n, h[maxn], x0, m; +int f[max2][maxn][2]; +long long da[max2][maxn][2], db[max2][maxn][2]; +/* +np(i).a/.b 从i出发的下一个点的编号 +f(i, j, k) k(0/1) 先走 从 j 出发 经过 2^i 天 +da A行驶距离 +db B行驶距离 +*/ +void init_nextp() +{ + set> nu; + nu.insert({inf, n}); + nu.insert({inf - 1, n}); + nu.insert({-inf, n}); + nu.insert({-inf + 1, n}); + for (int j = n - 1; j >= 0; --j) + { + auto t = nu.lower_bound({h[j], j}); + t++; + pair ans[5]; + for (int i = 4; i > 0; --i) + { + ans[i] = *t; + t--; + } + int m1 = inf, m2 = inf, mp1 = 0, mp2 = 0; + for (int i = 1; i <= 4; ++i) + { + int d = abs(ans[i].first - h[j]); + if (d < m1) + { + m2 = m1; + mp2 = mp1; + m1 = d; + mp1 = ans[i].second; + } + else if (d < m2) + { + m2 = d; + mp2 = ans[i].second; + } + } + np[j].a = mp2; + np[j].b = mp1; + nu.insert({h[j], j}); + } + return; +} +void init_f() +{ + for (int j = 0; j < n; ++j) + { + f[0][j][0] = np[j].a, f[0][j][1] = np[j].b; + } + f[0][n][0] = f[0][n][1] = n; + for (int i = 1; i < max2; ++i) + for (int j = 0; j <= n; ++j) + for (int k = 0; k < 2; ++k) + { + int mid = f[i - 1][j][k]; + if (mid >= n) + f[i][j][k] = n; + else + f[i][j][k] = f[i - 1][mid][(i == 1) ? (k ^ 1) : k]; + } + return; +} +void init_d() +{ + for (int j = 0; j < n; ++j) + { + da[0][j][0] = (np[j].a < n) ? abs(h[j] - h[np[j].a]) : 0; + db[0][j][0] = 0; + da[0][j][1] = 0; + db[0][j][1] = (np[j].b < n) ? abs(h[j] - h[np[j].b]) : 0; + } + da[0][n][0] = da[0][n][1] = db[0][n][0] = db[0][n][1] = 0; + for (int i = 1; i < max2; ++i) + for (int j = 0; j <= n; ++j) + for (int k = 0; k < 2; ++k) + { + int mid = f[i - 1][j][k]; + if (mid >= n) + { + da[i][j][k] = 0; + db[i][j][k] = 0; + } + else + { + int nk = (i == 1) ? (k ^ 1) : k; + da[i][j][k] = da[i - 1][j][k] + da[i - 1][mid][nk]; + db[i][j][k] = db[i - 1][j][k] + db[i - 1][mid][nk]; + } + } + return; +} +void query(int s, int x, long long &la, long long &lb) +{ + la = 0; + lb = 0; + int cur = s; + for (int k = max2 - 1; k >= 1; --k) + { + if (f[k][cur][0] < n && la + lb + da[k][cur][0] + db[k][cur][0] <= x) + { + la += da[k][cur][0]; + lb += db[k][cur][0]; + cur = f[k][cur][0]; + } + } + if (f[0][cur][0] < n && la + lb + da[0][cur][0] + db[0][cur][0] <= x) + { + la += da[0][cur][0]; + lb += db[0][cur][0]; + } +} +int main() +{ + // freopen("drive.in", "r", stdin); + // freopen("drive.out", "w", stdout); + scanf("%d", &n); + for (int i = 0; i < n; ++i) + { + scanf("%d", &h[i]); + } + init_nextp(); + init_f(); + init_d(); + scanf("%d", &x0); + long long best_a = 0, best_b = 1; + int mp = -1; + bool all_zero = true; + for (int j = 0; j < n; ++j) + { + long long la, lb; + query(j, x0, la, lb); + if (lb > 0) + { + all_zero = false; + if (mp < 0 || la * best_b < best_a * lb || (la * best_b == best_a * lb && h[j] > h[mp])) + { + best_a = la; + best_b = lb; + mp = j; + } + } + } + if (all_zero) + { + mp = 0; + for (int j = 1; j < n; ++j) + { + if (h[j] > h[mp]) + mp = j; + } + } + printf("%d\n", mp + 1); + scanf("%d", &m); + while (m--) + { + int s, x; + scanf("%d %d", &s, &x); + long long la, lb; + query(s - 1, x, la, lb); + printf("%lld %lld\n", la, lb); + } + return 0; +} \ No newline at end of file