結果
問題 | No.631 Noelちゃんと電車旅行 |
ユーザー | ikd |
提出日時 | 2018-01-08 15:24:37 |
言語 | D (dmd 2.106.1) |
結果 |
AC
|
実行時間 | 642 ms / 2,000 ms |
コード長 | 1,660 bytes |
コンパイル時間 | 1,093 ms |
コンパイル使用メモリ | 103,808 KB |
実行使用メモリ | 8,552 KB |
最終ジャッジ日時 | 2024-06-12 23:22:49 |
合計ジャッジ時間 | 10,040 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 209 ms
6,812 KB |
testcase_01 | AC | 642 ms
7,376 KB |
testcase_02 | AC | 635 ms
7,340 KB |
testcase_03 | AC | 634 ms
7,424 KB |
testcase_04 | AC | 641 ms
7,356 KB |
testcase_05 | AC | 634 ms
7,368 KB |
testcase_06 | AC | 188 ms
6,940 KB |
testcase_07 | AC | 90 ms
6,940 KB |
testcase_08 | AC | 433 ms
6,944 KB |
testcase_09 | AC | 471 ms
8,552 KB |
testcase_10 | AC | 329 ms
6,940 KB |
testcase_11 | AC | 302 ms
6,944 KB |
testcase_12 | AC | 382 ms
6,940 KB |
testcase_13 | AC | 276 ms
6,944 KB |
testcase_14 | AC | 73 ms
6,944 KB |
testcase_15 | AC | 267 ms
6,940 KB |
testcase_16 | AC | 1 ms
6,944 KB |
testcase_17 | AC | 1 ms
6,944 KB |
testcase_18 | AC | 1 ms
6,940 KB |
testcase_19 | AC | 1 ms
6,940 KB |
testcase_20 | AC | 2 ms
6,940 KB |
ソースコード
void main(){ import std.stdio, std.string, std.conv, std.algorithm; int n; rd(n); auto t=readln.split.to!(long[]); assert(t.length==(n-1)); auto sqd=new SqD(t); int q; rd(q); while(q--){ int l, r; long d; rd(l, r, d); sqd.radd(l-1, r, d); writeln(sqd.rmax(0, n-1)); } } class SqD{ int sz=1, k=1; long[] buc, bucmax, laz; import std.algorithm; this(long[] a){ auto n=a.length; while(sz*sz<n) sz++; bucmax.length=laz.length=sz; buc.length=(sz*sz); foreach(i; 0..n) buc[i]=a[i]+(n-i)*3; foreach(i; 0..sz) bucmax[i]=reduce!(max)(buc[(i*sz)..((i+1)*sz)]); } void push(int i){ if(laz[i]>0){ buc[(i*sz)..((i+1)*sz)]+=laz[i]; laz[i]=0; } } void radd(int l, int r, long x){ for(auto i=l/sz; i<=r/sz && i*sz<sz*sz; i++){ if(l<=i*sz && (i+1)*sz<=r){ bucmax[i]+=x; laz[i]+=x; }else{ push(i); auto s=max(l, i*sz), t=min(r, (i+1)*sz); buc[s..t]+=x; if(s<t) bucmax[i]=reduce!(max)(buc[(i*sz)..((i+1)*sz)]); } } } long rmax(int l, int r){ long ret=0; for(auto i=l/sz; i<=r/sz && i*sz<sz*sz; i++){ if(l<=i*sz && (i+1)*sz<=r){ ret=max(ret, bucmax[i]); }else{ push(i); auto s=max(l, i*sz), t=min(r, (i+1)*sz); if(s<t) ret=max(ret, reduce!(max)(buc[s..t])); } } return ret; } } void rd(T...)(ref T x){ import std.stdio, std.string, std.conv; auto l=readln.split; assert(l.length==x.length); foreach(i, ref e; x){ e=l[i].to!(typeof(e)); } } void wr(T...)(T x){ import std.stdio; foreach(e; x) write(e, " "); writeln(); }