結果
問題 |
No.3185 Three Abs
|
ユーザー |
![]() |
提出日時 | 2025-06-21 11:42:45 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,473 bytes |
コンパイル時間 | 7,458 ms |
コンパイル使用メモリ | 483,924 KB |
実行使用メモリ | 17,116 KB |
最終ジャッジ日時 | 2025-06-21 11:43:11 |
合計ジャッジ時間 | 25,763 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 15 WA * 15 |
ソースコード
#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--) { if(cc(s[i])<cc(s[n]) && maxseg.prod(cc(s[i])+1,cc(s[n]))!=-1e18) ans = max(ans, s[n]-s[i]+abs(s[i])); ll v1 = maxseg.prod(max(cc(s[i]),cc(s[n])),m); ll v2 = minseg.prod(0, min(cc(s[i]),cc(s[n]))); 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(cc(s[i]),max(maxseg.get(cc(s[i])) ,s[i])); minseg.set(cc(s[i]),min(minseg.get(cc(s[i])), s[i])); dbg(ans); } cout << ans << endl; } return 0; }