結果
問題 |
No.3185 Three Abs
|
ユーザー |
![]() |
提出日時 | 2025-06-21 11:47:34 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 529 ms / 2,000 ms |
コード長 | 2,557 bytes |
コンパイル時間 | 8,641 ms |
コンパイル使用メモリ | 483,472 KB |
実行使用メモリ | 17,164 KB |
最終ジャッジ日時 | 2025-06-21 11:47:59 |
合計ジャッジ時間 | 24,250 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 30 |
ソースコード
#include <bits/stdc++.h> #include <atcoder/all> #include <boost/multiprecision/cpp_dec_float.hpp> #include <boost/multiprecision/cpp_int.hpp> namespace mp = boost::multiprecision; using Bint = mp::cpp_int; using namespace std; using namespace atcoder; #define rep(i, n) for(int i=0;i<(n);++i) #define rep1(i, n) for(int i=1;i<=(n);i++) #define ll long long using mint = modint998244353; using P = pair<ll,ll>; using lb = long double; using T = tuple<ll, ll, ll>; #ifdef LOCAL # include <debug_print.hpp> # define dbg(...) debug_print::multi_print(#__VA_ARGS__, __VA_ARGS__) #else # define dbg(...) (static_cast<void>(0)) #endif // Coodinate Compression // https://youtu.be/fR3W5IcBGLQ?t=8550 template<typename T=long long> struct CC { bool initialized; vector<T> xs; CC(): initialized(false) {} void add(T x) { xs.push_back(x);} void init() { sort(xs.begin(), xs.end()); xs.erase(unique(xs.begin(),xs.end()),xs.end()); initialized = true; } int operator()(T x) { if (!initialized) init(); return upper_bound(xs.begin(), xs.end(), x) - xs.begin() - 1; } T operator[](int i) { if (!initialized) init(); return xs[i]; } int size() { if (!initialized) init(); return xs.size(); } }; ll op(ll a, ll b) { return max(a,b); } ll e() { return -1e18; } ll op2(ll a, ll b) { return min(a,b); } ll e2() { return 1e18; } int main() { int t; cin >> t; while(t--) { int n; cin >> n; vector<int> a(n); rep(i,n) cin >> a[i]; vector<ll> s(n+1); rep(i,n) s[i+1] = s[i] + a[i]; vector<pair<ll,int>> vs; CC cc; rep(i,n+1) cc.add(s[i]); int m = cc.size(); segtree<ll,op,e> maxseg(m); segtree<ll,op2,e2> minseg(m); ll ans = 0; maxseg.set(cc(s[n-1]),s[n-1]); minseg.set(cc(s[n-1]),s[n-1]); for(int i=n-2;i>=1;i--) { int x1 = cc(s[i]); int xn = cc(s[n]); if(x1<xn && maxseg.prod(x1, xn+1)!=-1e18) ans = max(ans, s[n]-s[i]+abs(s[i])); if(x1>xn && maxseg.prod(xn, x1+1)!=-1e18) ans = max(ans, s[i]-s[n]+abs(s[i])); ll v1 = maxseg.prod(max(x1,xn),m); ll v2 = minseg.prod(0, min(x1,xn)+1); ans = max(ans, 2*v1-s[i]-s[n]+abs(s[i])); ans = max(ans, s[n]+s[i]-2*v2+abs(s[i])); maxseg.set(x1,max(maxseg.get(x1) ,s[i])); minseg.set(x1,min(minseg.get(x1), s[i])); dbg(ans); } cout << ans << endl; } return 0; }