Submission #1118419

#TimeUsernameProblemLanguageResultExecution timeMemory
1118419IcelastBigger segments (IZhO19_segments)C++17
13 / 100
4 ms1360 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 2*1e5+5, INF = 4e18+9; void chmax(pair<ll, ll> &a, pair<ll, ll> b){ if(a.first < b.first){ a = b; }else if(a.first == b.first){ if(a.second > b.second){ a = b; } } } struct normalize{ vector<ll> poi, pot; void add(ll x){ poi.push_back(x); } void start(){ sort(poi.begin(), poi.end()); if(poi.size() > 0) pot.push_back(poi[0]); for(int i = 1; i < (int)poi.size(); i++){ if(poi[i] != poi[i-1]){ pot.push_back(poi[i]); } } } int encode(ll x){ return lower_bound(pot.begin(), pot.end(), x) - pot.begin()+1; } }; struct ImplicitSegmentTree{ struct Node{ pair<ll, ll> v = {-INF, 0}; int ln = 0, rn = 0; }; ll n, N; vector<Node> T; int cnt; ImplicitSegmentTree(ll n): n(n){ N = n; T.push_back(Node()); T.push_back(Node()); cnt = 1; }; int new_node(){ T.push_back(Node()); cnt++; return cnt; } void down(int node, ll low, ll high){ } void apply(int i, pair<ll, ll> x){ auto apply = [&](auto apply, int node, ll low, ll high, int i, pair<ll, ll> x) -> void{ down(node, low, high); if(low == high){ chmax(T[node].v, x); down(node, low, high); return; } ll mid = (low+high)/2; if(i <= mid){ if(T[node].ln == 0){ int x = new_node(); T[node].ln = x; } apply(apply, T[node].ln, low, mid, i, x); }else{ if(T[node].rn == 0){ int x = new_node(); T[node].rn = x; } apply(apply, T[node].rn, mid+1, high, i, x); } chmax(T[node].v, T[T[node].ln].v); chmax(T[node].v, T[T[node].rn].v); }; apply(apply, 1, 1, N, i, x); } pair<ll, ll> get(ll l, ll r){ auto get = [&](auto self, int node, ll low, ll high, ll l, ll r) -> pair<ll, ll>{ down(node, low, high); if(low > r || l > high) return {-INF, 0}; if(low >= l && r >= high){ return T[node].v; } ll mid = (low+high)/2; if(T[node].ln == 0){ int x = new_node(); T[node].ln = x; } if(T[node].rn == 0){ int x = new_node(); T[node].rn = x; } pair<ll, ll> res = {-INF, 0}; chmax(res, self(self, T[node].ln, low, mid, l, r)); chmax(res, self(self, T[node].rn, mid+1, high, l, r)); chmax(T[node].v, T[T[node].ln].v); chmax(T[node].v, T[T[node].rn].v); return res; }; return get(get, 1, 1, N, l, r); } }; void solve(){ int n; cin >> n; vector<ll> a(n+1); for(int i = 1; i <= n; i++){ cin >> a[i]; } vector<ll> pf(n+1, 0); for(int i = 1; i <= n; i++){ pf[i] = pf[i-1]+a[i]; } auto sum = [&](int l, int r) -> ll{ return pf[r]-pf[l-1]; }; vector<pair<ll, ll>> f(n+1, {-INF, 0}); f[0] = {0, 0}; ImplicitSegmentTree T(1e16); T.apply(0, {0, 0}); for(int i = 1; i <= n; i++){ f[i] = T.get(0, pf[i]); f[i].first++; f[i].second += pf[i]; T.apply(pf[i]+f[i].second, {f[i].first, -pf[i]}); } cout << f[n].first; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }

Compilation message (stderr)

segments.cpp: In function 'void solve()':
segments.cpp:119:10: warning: variable 'sum' set but not used [-Wunused-but-set-variable]
  119 |     auto sum = [&](int l, int r) -> ll{
      |          ^~~
#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...