提出 #77980768


ソースコード 拡げる

Copy
#include <stdio.h>
#include <inttypes.h>
struct data_s {
uint64_t a, b, c, d, e;
};
struct data_s create_first_data(int v) {
return (struct data_s){ v, v, v, v, 1 };
}
struct data_s merge_data(struct data_s l, struct data_s r) {
return (struct data_s){
l.a + r.a + l.c * r.e + r.b * l.e,
l.b + l.d * r.e + r.b,
l.c + r.d * l.e + r.c,
l.d + r.d,
l.e + r.e
};
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <inttypes.h>

struct data_s {
	uint64_t a, b, c, d, e;
};

struct data_s create_first_data(int v) {
	return (struct data_s){ v, v, v, v, 1 };
}

struct data_s merge_data(struct data_s l, struct data_s r) {
	return (struct data_s){
		l.a + r.a + l.c * r.e + r.b * l.e,
		l.b + l.d * r.e + r.b,
		l.c + r.d * l.e + r.c,
		l.d + r.d,
		l.e + r.e
	};
}

#define KI_MAX (1 << 19) /* 524288 */

struct data_s ki[KI_MAX * 2 - 1];

void ki_init(void) {
	int i;
	for (i = KI_MAX - 2; i >= 0; i--) {
		ki[i] = merge_data(ki[i * 2 + 1], ki[i * 2 + 2]);
	}
}

struct data_s ki_get_i(int idx, int ss, int se, int qs, int qe) {
	if (qs <= ss && se <= qe) { /* セグメントがクエリに完全に含まれる */
		return ki[idx];
	} else if (se <= qs || qe <= ss) { /* 完全に外れている */
		return (struct data_s){ 0, 0, 0, 0, 0 };
	} else {
		int sm = ss + (se - ss) / 2;
		return merge_data(
			ki_get_i(idx * 2 + 1, ss, sm, qs, qe),
			ki_get_i(idx * 2 + 2, sm, se, qs, qe)
		);
	}
}

uint64_t ki_get(int qs, int qe) {
	struct data_s ans = ki_get_i(0, 0, KI_MAX, qs, qe);
	return ans.a;
}

int N, Q;
int A[312345];
int L[312345], R[312345];

int main(void) {
	int i;
	if (scanf("%d%d", &N, &Q) != 2) return 1;
	for (i = 0; i < N; i++) {
		if (scanf("%d", &A[i]) != 1) return 1;
	}
	for (i = 0; i < Q; i++) {
		if (scanf("%d%d", &L[i], &R[i]) != 2) return 1;
	}
	for (i = 0; i < N; i++) {
		ki[KI_MAX - 1 + i] = create_first_data(A[i]);
	}
	ki_init();
	for (i = 0; i < Q; i++) {
		printf("%" PRIu64 "\n", ki_get(L[i] - 1, R[i]));
	}
	return 0;
}

/*

* a: 答え
* b: 左端から各要素までの和の和
* c: 各要素から右端までの和の和
* d: 各要素の和
* e: 要素数

を持つ
左 (a1, b1, c1, d1, e1) と、右 (a2, b2, c2, d2, e2) をマージすると

e = e1 + e2
d = d1 + d2
ここまでは自明

左の要素から始まる部分は、右は全要素を足す
右の要素から始まる部分は、そのまま
なので
c = c1 + d2 * e1 + c2

同様に
b = b1 + d1 * e2 + b2

答えは、左と右それぞれの範囲内のやつの和に加えて、左と右をまたぐやつの和
またぐやつは、左の各要素から始めて、右の各要素で終わる
(左の要素それぞれについて、右の全要素までの和が加わる)
また、右の各要素で終わって、左の各要素で始まる
(右の要素それぞれについて、左の全要素からの和が加わる)
なので
a = a1 + a2 + c1 * e2 + b2 * e1

*/

提出情報

提出日時
問題 E - Sum of Subarrays
ユーザ mikecat
言語 C23 (GCC 14.2.0)
得点 475
コード長 2610 Byte
結果 AC
実行時間 260 ms
メモリ 41896 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 475 / 475
結果
AC × 1
AC × 16
セット名 テストケース
Sample sample00.txt
All sample00.txt, testcase00.txt, testcase01.txt, testcase02.txt, testcase03.txt, testcase04.txt, testcase05.txt, testcase06.txt, testcase07.txt, testcase08.txt, testcase09.txt, testcase10.txt, testcase11.txt, testcase12.txt, testcase13.txt, testcase14.txt
ケース名 結果 実行時間 メモリ
sample00.txt AC 12 ms 22076 KiB
testcase00.txt AC 11 ms 22080 KiB
testcase01.txt AC 90 ms 24544 KiB
testcase02.txt AC 177 ms 28588 KiB
testcase03.txt AC 121 ms 27308 KiB
testcase04.txt AC 114 ms 31916 KiB
testcase05.txt AC 104 ms 34476 KiB
testcase06.txt AC 58 ms 24444 KiB
testcase07.txt AC 169 ms 28836 KiB
testcase08.txt AC 259 ms 41132 KiB
testcase09.txt AC 260 ms 41124 KiB
testcase10.txt AC 252 ms 41132 KiB
testcase11.txt AC 255 ms 41128 KiB
testcase12.txt AC 253 ms 41132 KiB
testcase13.txt AC 252 ms 41132 KiB
testcase14.txt AC 106 ms 41896 KiB


2026-08-01 (土)
02:19:30 +09:00