Submission #68275
ソースコード
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 | #include <bits/stdc++.h> #define lol long long using namespace std; struct Segment { int n; vector<lol> dat; vector< int > mem; vector< int > meml; vector< int > memr; Segment( int size){ n = 1; while (size>n){ n *= 2; } dat.resize(n*2, 0); mem.resize(n*2, 0); meml.resize(n*2, 0); memr.resize(n*2, 0); return ; } void set( int i, lol x){dat[i+n-1]=x;} void build(){ for ( int k=n-2;k>=0;k--) dat[k]=dat[2*k+1]+dat[2*k+2]; return ; } void update( int a, int b, int y, vector<lol>& p){ update(a,b, 0, 0, n, p, y); } void update( int a, int b, int k, int l, int r, vector<lol>& p, int y){ eval(k, p); if (a<=l && r<=b){ mem[k] = 1; meml[k] = y+l-a; memr[k] = y+l-a + r-l ; eval(k, p); } else if (a < r && l < b){ update(a, b, k*2+1, l, (l+r)/2, p, y); update(a, b, k*2+2, (l+r)/2, r, p, y); dat[k] = dat[2*k+1]+dat[2*k+2]; } } void eval( int k, vector<lol>& p){ if (mem[k]==0) return ; if (k < n-1){ mem[k*2+1] = 1; meml[k*2+1] = meml[k]; memr[k*2+1] = (meml[k]+memr[k])/2; mem[k*2+2] = 1; meml[k*2+2] = (meml[k]+memr[k])/2; memr[k*2+2] = memr[k]; } //dat[k] = p.query(meml[k], memr[k], p); dat[k] = p[memr[k]] - p[meml[k]]; mem[k] = 0; } lol query( int a, int b, vector<lol>& p){ return (query(a, b, 0, 0, n, p)); } lol query( int a, int b, int k, int l, int r, vector<lol>& p){ eval(k, p); if (r<=a||b<=l) return (0); else if (a<=l&&r<=b) return (dat[k]); else { return (query(a,b,2*k+1,l,(l+r)/2, p) + query(a,b,2*k+2,(l+r)/2, r, p)); } } }; signed main(){ cin.tie(0); ios::sync_with_stdio( false ); int n,m; cin>>n>>m; vector<lol> a(n),b(n+1,0); for ( int i=0;i<n;i++) cin >>a[i]; for ( int i=1;i<=n;i++){ cin >>b[i]; b[i] += b[i-1]; } Segment A(n); for ( int i=0;i<n;i++){ A.set(i, a[i]); } A.build(); while (m--){ int op,x,y,z; int p,q; cin >>op; if (op){ cin >>p>>q; p--,q--; cout <<A.query(p,q+1, b)<< '\n' ; } else { cin >>x>>y>>z; x--,y--; A.update(x,x+z,y, b); /* for(int i=0;i<n;i++){ cout <<A.query(i,i+1,b)<<' '; }cout <<'\n';*/ } } return (0); } |
ステータス
項目 | データ |
---|---|
問題 | 1446 - Copy&Sum |
ユーザー名 | 保守性不在 |
投稿日時 | 2021-09-03 19:06:00 |
言語 | C++17 |
状態 | Accepted |
得点 | 12 |
ソースコード長 | 2767 Byte |
最大実行時間 | 362 ms |
最大メモリ使用量 | 21956 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 12 / 12 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
in1 | AC | 27 ms | 476 KB |
1
|
in2 | AC | 21 ms | 580 KB |
1
|
in3 | AC | 30 ms | 8652 KB |
1
|
in4 | AC | 19 ms | 8608 KB |
1
|
in5 | AC | 24 ms | 8564 KB |
1
|
in6 | AC | 20 ms | 8644 KB |
1
|
in7 | AC | 21 ms | 8596 KB |
1
|
in8 | AC | 20 ms | 8680 KB |
1
|
in9 | AC | 19 ms | 8636 KB |
1
|
in10 | AC | 20 ms | 564 KB |
1
|
in11 | AC | 24 ms | 652 KB |
1
|
in12 | AC | 22 ms | 604 KB |
1
|
in13 | AC | 16 ms | 680 KB |
1
|
in14 | AC | 21 ms | 628 KB |
1
|
in15 | AC | 23 ms | 576 KB |
1
|
in16 | AC | 14 ms | 396 KB |
1
|
in17 | AC | 18 ms | 472 KB |
1
|
in18 | AC | 20 ms | 520 KB |
1
|
in19 | AC | 25 ms | 540 KB |
1
|
in20 | AC | 24 ms | 532 KB |
1
|
in21 | AC | 255 ms | 14760 KB |
1
|
in22 | AC | 265 ms | 16304 KB |
1
|
in23 | AC | 362 ms | 17844 KB |
1
|
in24 | AC | 326 ms | 19384 KB |
1
|
in25 | AC | 170 ms | 20668 KB |
1
|
in26 | AC | 174 ms | 21956 KB |
1
|