結果
問題 |
No.3185 Three Abs
|
ユーザー |
|
提出日時 | 2025-06-20 21:32:20 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 324 ms / 2,000 ms |
コード長 | 942 bytes |
コンパイル時間 | 713 ms |
コンパイル使用メモリ | 80,512 KB |
実行使用メモリ | 16,100 KB |
最終ジャッジ日時 | 2025-06-20 21:32:37 |
合計ジャッジ時間 | 9,479 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 30 |
ソースコード
#include<iostream> #include<vector> #include<algorithm> #include<cassert> #include<atcoder/segtree> using namespace std; long op(long a,long b){return max(a,b);} long e(){return -1e18;} int N; long S[2<<17]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T;cin>>T; for(;T--;) { cin>>N; for(int i=0;i<N;i++) { int A;cin>>A; S[i+1]=S[i]+A; } vector<long>vs(S,S+N+1); sort(vs.begin(),vs.end()); vs.erase(unique(vs.begin(),vs.end()),vs.end()); atcoder::segtree<long,op,e>segL(vs.size()),segR(vs.size()); long ans=e(); for(int i=2;i<N;i++) { {//add i-1 long s=S[i-1]; int j=lower_bound(vs.begin(),vs.end(),s)-vs.begin(); segL.set(j,op(segL.get(j),abs(s)-s)); segR.set(j,op(segR.get(j),abs(s)+s)); } long s=S[i]; int j=lower_bound(vs.begin(),vs.end(),s)-vs.begin(); ans=max(ans,max(segL.prod(0,j)+s,segR.prod(j,vs.size())-s)+abs(S[N]-s)); } cout<<ans<<"\n"; } }