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
|