Submission #60779


ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,n) for(int i=1;i<=(n);i++)
#define lol long long
#define SUM(n) ((n)+1)*(n)/2 //1〜nまでの総和を求める式
#define mp make_pair
#define fi first
#define se second
#define pu push_back
#define SYOU(x) fixed<<setprecision(x+1) //小数点桁数を指定する
#define abs(x,y) max(x,y)-min(x,y)
#define all(v) v.begin(),v.end()
#define UPDigit(a,b) (a+b-1)/b //小数点切り上げ
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fLL;
const int MOD=int(1e9)+7;
using namespace std;
using pii = pair<lol, lol>;
typedef vector<int> vit;
/*
struct SegmentTree{
vector<lol> SumV(1000005,0);
vector<lol> MaxV(1000005,0);
vector<lol> MinV(1000005,0);
int N;
void update(int i,int x){
i += N - 1;
minv[i] = x;
maxv[i] = x;
sumv[i] = x;
while(i > 0){
i = (i - 1)/2;
maxv[i] = max(maxv[i*2+1],maxv[i*2+2]);
minv[i] = min(minv[i*2+1],minv[i*2+2]);
sumv[i] = sumv[i*2+1]+sumv[i*2+2];
}
}
void add(int i,int x){
i += N - 1;
sumv[i] += x;
maxv[i] += x;
minv[i] += x;
while(i > 0){
i = (i - 1)/2;
sumv[i] = sumv[i*2+1]+sumv[i*2+2];
minv[i] = min(minv[i*2+1],minv[i*2+2]);
maxv[i] = max(maxv[i*2+1],maxv[i*2+2]);
}
}
int getmax(int a,int b,int k,int l,int r){
if(r <= a || b <= l) return -INF;
if(a <= l && r <= b) return maxv[k];
else{
int c1 = getmax(a,b,2*k+1,l,(l+r)/2);
int c2 = getmax(a,b,2*k+2,(l+r)/2,r);
return max(c1,c2);
}
}
int getmin(int a,int b,int k,int l,int r){
if(r <= a || b <= l) return INF;
if(a <= l && r <= b) return minv[k];
else{
int c1 = getmin(a,b,2*k+1,l,(l+r)/2);
int c2 = getmin(a,b,2*k+2,(l+r)/2,r);
return min(c1,c2);
}
}
int getsum(int a,int b,int k,int l,int r){
if(r <= a || b <= l) return 0;
if(a <= l && r <= b) return sumv[k];
else{
int c1 = getsum(a,b,2*k+1,l,(l+r)/2);
int c2 = getsum(a,b,2*k+2,(l+r)/2,r);
return c1+c2;
}
}
}
*/
//最大公約数
lol gcd(lol x, lol y){
if(x < y) swap(x, y);
lol r = x % y;
while(r != 0){
x = y;
y = r;
r = x % y;
}
return y;
}
//最小公倍数
lol lcm(lol x, lol y){
lol a = x * y;
return (a / gcd(x, y));
}
signed main(void){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
//データの入力
int n;
cin >> n;
int date[n + 5];
for(int i = 1;i <= n;i ++){
cin >> date[i];
}
//累積和をsum[]で作成する
int sum[n + 5] = {};
for(int i = 1;i <= n;i ++){
sum[i] += sum[i - 1] + date[i];
}
//累積和の出力(余分な空白は出力しない!!!)
for(int i = 0;i < n;i ++){
cout << sum[i] << " ";
}
cout << sum[n] << '\n';
//date[a] ~ date[b] の合計を出力
int m;
cin >> m;
int a, b;
for(int i = 1;i <= m;i ++){
cin >> a >> b;
cout << sum[b] - sum[a - 1] << '\n';
}
return 0;
}

ステータス

項目 データ
問題 0733 - プログラミング入門:累積和
ユーザー名 NASSUN_ei1906
投稿日時 2020-07-13 18:26:01
言語 C++17
状態 Accepted
得点 5
ソースコード長 3174 Byte
最大実行時間 276 ms
最大メモリ使用量 69772 KB

セット

セット 得点 Cases
1 ALL 5 / 5 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
Input01 AC 131 ms 16988 KB
1
Input02 AC 122 ms 25644 KB
1
Input03 AC 133 ms 34940 KB
1
Input04 AC 270 ms 52420 KB
1
Input05 AC 276 ms 69772 KB
1