제출 #1249082

#제출 시각아이디문제언어결과실행 시간메모리
1249082al95ireyizBigger segments (IZhO19_segments)C++20
73 / 100
194 ms5656 KiB
//*** Bismillah ***// #pragma GCC optimize("O3", "fast-math", "unroll-loops", "no-stack-protector") #include <bits/stdc++.h> using namespace std; #if !defined(ONLINE_JUDGE) and !defined(EVAL) #include "template/debug.h" #else #define d(x...) #endif #define fr first #define er erase #define sc second #define in insert #define ll long long #define pb push_back #define vll vector<ll> #define pll pair<ll,ll> #define ull unsigned ll #define vpll vector<pll> #define len(x) (ll) x.size() #define all(x) x.begin(),x.end() const ll INF = 1e9; const ll INFL = 1e18; const ll MOD = 1e9+7; // const ll MOD = 998244353; const ll maxn = 2e5+5; ll n,m,k=0; ll a[maxn], ps[maxn], dp[maxn], mn[maxn], tree[4 * maxn]; void upd(ll x, ll val, ll l = 1, ll r = n + 1, ll v = 1){ if(l == r){ tree[v] = val; return; } ll md = (l + r) >> 1; if(x <= md) upd(x, val, l, md, v << 1); else upd(x, val, md + 1, r, v << 1 | 1); tree[v] = min(tree[v << 1], tree[v << 1 | 1]); } ll get(ll _l, ll _r, ll l = 1, ll r = n + 1, ll v = 1){ bool in = _l <= l and r <= _r; bool ot = _l <= r and l <= _r; if(in) return tree[v]; if(ot){ ll md = (l + r) >> 1; return min( get(_l, _r, l, md, v << 1), get(_l, _r, md + 1, r, v << 1 | 1) ); } return INFL; } void _(ll &tt){ cin >> n; for(ll i = 1; i <= n; i ++){ cin >> a[i]; mn[i] = INFL; ps[i] = ps[i - 1] + a[i]; } mn[0] = 0; upd(1, 0); for(ll i = 1; i <= n; i ++){ // for(ll j = i - 1; j >= 0; j --){ // if(mn[j] <= ps[i] - ps[j]){ // if(dp[i] < dp[j] + 1){ // dp[i] = dp[j] + 1; // mn[i] = ps[i] - ps[j]; // } // else if(dp[i] == dp[j] + 1){ // mn[i] = min(mn[i], ps[i] - ps[j]); // } // break; // } // } // bs for last j that mn[j] <= ps[i] - ps[j] // mn[j] + ps[j] <= ps[i] ll l = 0, r = i - 1, j; while(l <= r){ ll md = (l + r) >> 1; if(get(md + 1, i - 1 + 1) <= ps[i]) l = md + 1, j = md; else r = md - 1; } d(j); if(mn[j] <= ps[i] - ps[j]){ if(dp[i] < dp[j] + 1){ dp[i] = dp[j] + 1; mn[i] = ps[i] - ps[j]; } else if(dp[i] == dp[j] + 1){ mn[i] = min(mn[i], ps[i] - ps[j]); } } upd(i + 1, ps[i] + mn[i]); } // for(ll i = 1; i <= n; i ++) cout << dp[i] << ' '; cout << '\n'; // for(ll i = 1; i <= n; i ++) cout << mn[i] << ' '; cout << '\n'; // for(ll i = 1; i <= n; i ++) cout << ps[i] + mn[i] << ' '; cout << '\n'; cout << dp[n] << '\n'; } signed main() { ll tm = clock(); cin.tie(0)->sync_with_stdio(0); ll t = 1; // cin >> t; for(ll tt = 1; tt <= t; tt ++) { _(tt); } cerr << "\n\033[1;31mTime: \033[1;30m" \ << (double)(clock()-tm)/1000000 << "\033[1;32m seconds\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...