結果

問題 No.2988 Min-Plus Convolution Query
ユーザー 👑 ygussany
提出日時 2024-12-17 11:07:29
言語 C
(gcc 13.3.0)
結果
TLE  
実行時間 -
コード長 7,002 bytes
コンパイル時間 780 ms
コンパイル使用メモリ 36,868 KB
実行使用メモリ 12,032 KB
最終ジャッジ日時 2024-12-17 11:08:16
合計ジャッジ時間 44,289 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 24 WA * 1 TLE * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <stdio.h>
const int sup = 2000000001;
void chmin(int *a, int b)
{
if (*a > b) *a = b;
}
void chmax(int *a, int b)
{
if (*a < b) *a = b;
}
void merge_sort(int n, int x[])
{
static int y[200001] = {};
if (n <= 1) return;
merge_sort(n / 2, &(x[0]));
merge_sort((n + 1) / 2, &(x[n/2]));
int i, p, q;
for (i = 0, p = 0, q = n / 2; i < n; i++) {
if (p >= n / 2) y[i] = x[q++];
else if (q >= n) y[i] = x[p++];
else y[i] = (x[p] < x[q])? x[p++]: x[q++];
}
for (i = 0; i < n; i++) x[i] = y[i];
}
void min_plus_convolution3(int A[], int B[], int q[], int l1, int r1, int l2, int r2, int l3, int r3, int end_argmin[])
{
/*
fprintf(stderr, "[%d %d %d %d %d %d]\n", l1, r1, l2, r2, l3, r3);
for (int i = l1 - 1; i <= r1; i++) fprintf(stderr, "%d ", end_argmin[q[i]]);
fprintf(stderr, "\n");
*/
if (l3 > r3) return;
if (q[l1] + l2 > r3) {
chmin(&(end_argmin[q[l1-1]]), l3);
return;
}
if (q[r1] + r2 < l3) {
chmin(&(end_argmin[q[r1-1]]), r3);
return;
}
if (l1 == r1) {
chmin(&(end_argmin[q[l1-1]]), l3);
return;
}
chmax(&l2, l3 - q[r1]);
chmin(&r2, r3 - q[l1]);
int i, j, k = (l3 + r3) / 2, min, argmin;
for (i = l1, min = sup; i <= r1; i++) {
j = k - q[i];
if (j > r2) continue;
else if (j < l2) break;
if (min > A[q[i]] + B[j]) {
min = A[q[i]] + B[j];
argmin = i;
}
}
if (min == sup) {
if (q[l1] + l2 <= r3) argmin = l1;
else argmin = r1;
}
chmin(&(end_argmin[q[argmin-1]]), k);
min_plus_convolution3(A, B, q, l1, argmin, l2, r2, l3, k - 1, end_argmin);
min_plus_convolution3(A, B, q, argmin, r1, l2, r2, k + 1, r3, end_argmin);
}
#define THR 60
void solve3(int N, int A[], int B[], int Q, int p[], int x[], int k[], int ans[])
{
int i, j, bl, br, ql, qr, tail[2][2], l, r, m;
static int q[2][2][200001], appear[200001], end_argmin[200001];
for (i = 1; i <= N; i++) appear[i] = 0;
for (bl = 1; bl <= Q; bl = br + 1) {
for (br = bl, tail[0][1] = 0, q[0][1][0] = 0; br <= Q && tail[0][1] < THR * THR; br++) {
if (appear[p[br]] == 0) {
appear[p[br]] = 1;
q[0][1][++tail[0][1]] = p[br];
}
}
br--;
merge_sort(tail[0][1], &(q[0][1][1]));
for (i = 1, tail[0][0] = 0, q[0][0][0] = 0; i <= N; i++) if (appear[i] == 0) q[0][0][++tail[0][0]] = i;
for (i = 1, end_argmin[0] = 2; i <= tail[0][0]; i++) end_argmin[q[0][0][i]] = N * 2 + 1;
min_plus_convolution3(A, B, q[0][0], 1, tail[0][0], 1, N, 2, N * 2, end_argmin);
for (i = tail[0][0] - 1; i >= 1; i--) chmin(&(end_argmin[q[0][0][i]]), end_argmin[q[0][0][i+1]]);
for (i = bl; i <= br; i++) appear[p[i]] = 0;
/*
for (i = 0; i <= tail[0][0]; i++) printf("(%d %d) ", q[0][0][i], end_argmin[q[0][0][i]]);
printf("\n");
*/
for (ql = bl; ql <= br; ql = qr + 1) {
for (qr = ql, tail[1][1] = 0, q[1][1][0] = 0; qr <= br && tail[1][1] < THR; qr++) {
if (appear[p[qr]] == 0) {
appear[p[qr]] = 1;
q[1][1][++tail[1][1]] = p[qr];
}
}
qr--;
merge_sort(tail[1][1], &(q[1][1][1]));
for (i = 1, tail[1][0] = 0, q[1][0][0] = 0; i <= tail[0][1]; i++) if (appear[q[0][1][i]] == 0) q[1][0][++tail[1][0]] = q[0][1][i];
for (i = 1, end_argmin[0] = 2; i <= tail[1][0]; i++) end_argmin[q[1][0][i]] = N * 2 + 1;
min_plus_convolution3(A, B, q[1][0], 1, tail[1][0], 1, N, 2, N * 2, end_argmin);
for (i = tail[1][0] - 1; i >= 1; i--) chmin(&(end_argmin[q[1][0][i]]), end_argmin[q[1][0][i+1]]);
for (i = ql; i <= qr; i++) appear[p[i]] = 0;
/*
printf("- ");
for (i = 0; i <= tail[1][0]; i++) printf("(%d %d) ", q[1][0][i], end_argmin[q[1][0][i]]);
printf("\n");
*/
for (j = ql; j <= qr; j++) {
A[p[j]] = x[j];
for (i = 1, end_argmin[0] = 2; i <= tail[1][1]; i++) end_argmin[q[1][1][i]] = N * 2 + 1;
min_plus_convolution3(A, B, q[1][1], 1, tail[1][1], 1, N, 2, N * 2, end_argmin);
for (i = tail[1][1] - 1; i >= 1; i--) chmin(&(end_argmin[q[1][1][i]]), end_argmin[q[1][1][i+1]]);
/*
printf("-- ");
for (i = 0; i <= tail[1][1]; i++) printf("(%d %d) ", q[1][1][i], end_argmin[q[1][1][i]]);
printf("\n");
*/
ans[j] = sup;
if (tail[0][0] > 0) {
l = 1;
r = tail[0][0];
while (l < r) {
m = (l + r) / 2;
if (end_argmin[q[0][0][m]] <= k[j]) l = m + 1;
else r = m;
}
if (1 <= k[j] - q[0][0][l] && k[j] - q[0][0][l] <= N) chmin(&(ans[j]), A[q[0][0][l]] + B[k[j] - q[0][0][l]]);
}
if (tail[1][0] > 0) {
l = 1;
r = tail[1][0];
while (l < r) {
m = (l + r) / 2;
if (end_argmin[q[1][0][m]] <= k[j]) l = m + 1;
else r = m;
}
if (1 <= k[j] - q[1][0][l] && k[j] - q[1][0][l] <= N) chmin(&(ans[j]), A[q[1][0][l]] + B[k[j] - q[1][0][l]]);
}
if (tail[1][1] > 0) {
l = 1;
r = tail[1][1];
while (l < r) {
m = (l + r) / 2;
if (end_argmin[q[1][1][m]] <= k[j]) l = m + 1;
else r = m;
}
if (1 <= k[j] - q[1][1][l] && k[j] - q[1][1][l] <= N) chmin(&(ans[j]), A[q[1][1][l]] + B[k[j] - q[1][1][l]]);
}
}
}
}
}
#define MT_N 624
#define MT_M 397
#define MT_MATRIX_A 0x9908b0dfUL
#define MT_UPPER_MASK 0x80000000UL
#define MT_LOWER_MASK 0x7fffffffUL
static unsigned int mt[MT_N];
static int mti = MT_N + 1;
void init_genrand(unsigned int s)
{
mt[0] = s & 0xffffffffUL;
for (mti = 1; mti < MT_N; mti++) {
mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
mt[mti] &= 0xffffffffUL;
}
}
unsigned int genrand()
{
unsigned int y;
static unsigned int mag01[2] = {0x0UL, MT_MATRIX_A};
if (mti >= MT_N) {
int kk;
if (mti == MT_N + 1) init_genrand(5489UL);
for (kk = 0; kk < MT_N - MT_M; kk++) {
y = (mt[kk] & MT_UPPER_MASK) | (mt[kk+1] & MT_LOWER_MASK);
mt[kk] = mt[kk+MT_M] ^ (y >> 1) ^ mag01[y&0x1UL];
}
for (; kk < MT_N - 1; kk++) {
y = (mt[kk] & MT_UPPER_MASK) | (mt[kk+1] & MT_LOWER_MASK);
mt[kk] = mt[kk+(MT_M-MT_N)] ^ (y >> 1) ^ mag01[y&0x1UL];
}
y = (mt[MT_N-1] & MT_UPPER_MASK) | (mt[0] & MT_LOWER_MASK);
mt[MT_N-1] = mt[MT_M-1] ^ (y >> 1) ^ mag01[y&0x1UL];
mti = 0;
}
y = mt[mti++];
y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680UL;
y ^= (y << 15) & 0xefc60000UL;
y ^= (y >> 18);
return y;
}
int main()
{
int i, N, Q;
static int A[200001], B[200001], p[200001], x[200001], k[200001], ans[200001];
scanf("%d %d", &N, &Q);
for (i = 1; i <= N; i++) scanf("%d", &(A[i]));
for (i = 1; i <= N; i++) scanf("%d", &(B[i]));
for (i = 1; i <= Q; i++) scanf("%d %d %d", &(p[i]), &(x[i]), &(k[i]));
solve3(N, A, B, Q, p, x, k, ans);
for (i = 1; i <= Q; i++) printf("%d\n", ans[i]);
/*
for (i = 1; i <= N; i++) A[i] = genrand() % 10;
for (i = 1; i <= N; i++) B[i] = 0;
for (i = 1; i <= Q; i++) {
p[i] = genrand() % N + 1;
x[i] = genrand() % 10;
k[i] = genrand() % (N * 2 - 1) + 2;
}
solve3(N, A, B, Q, p, x, k, ans);
for (i = 1; i <= Q; i++) printf("%d\n", ans[i]);
*/
fflush(stdout);
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0