Submission #998154

#TimeUsernameProblemLanguageResultExecution timeMemory
998154LOLOLOFeast (NOI19_feast)C++17
30 / 100
173 ms17968 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define f first #define s second #define pb push_back #define ep emplace #define eb emplace_back #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define uniquev(v) sort(all(v)), (v).resize(unique(all(v)) - (v).begin()) #define mem(f,x) memset(f , x , sizeof(f)) #define sz(x) (ll)(x).size() #define __lcm(a, b) (1ll * ((a) / __gcd((a), (b))) * (b)) #define mxx *max_element #define mnn *min_element #define cntbit(x) __builtin_popcountll(x) #define len(x) (int)(x.length()) const int N = 3e5 + 10; int p[N], sz[N], l[N], r[N], a[N]; ll val[N]; set <pair <ll, ll>> st; int sign(ll v) { if (v >= 0) return 1; return -1; } int get(int x) { return p[x] ? get(p[x]) : x; } void unite(int a, int b) { a = get(a), b = get(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); sz[a] += sz[b]; p[b] = a; l[a] = min(l[a], l[b]); r[a] = max(r[a], r[b]); val[a] += val[b]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k; cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> a[i]; sz[i] = 1; l[i] = r[i] = i; } while (a[n] <= 0 && n) n--; if (n == 0) { cout << 0 << '\n'; return 0; } int ft = 1; while (a[ft] <= 0) ft++; for (int j = ft; j <= n; j++) a[j - ft + 1] = a[j]; for (int i = 1; i <= n; i++) { val[i] = a[i]; } for (int i = 1; i < n; i++) { if ((a[i] >= 0) == (a[i + 1] >= 0)) unite(i, i + 1); } for (int i = 1; i <= n; i++) { if (get(i) == i) { st.insert({abs(val[get(i)]), sign(val[i]) * i}); } } int ss = 1; while (sz(st) > k * 2) { auto it = *st.begin(); st.erase(it); int p = abs(it.s); if (l[p] > ss) { int x = get(l[p] - 1); st.erase({abs(val[x]), sign(val[x]) * x}); unite(p, x); } if (r[p] < n) { int x = get(r[p] + 1); st.erase({abs(val[x]), sign(val[x]) * x}); unite(p, x); } p = get(p); st.insert({abs(val[p]), sign(val[p]) * p}); while (val[get(n)] <= 0) { st.erase({abs(val[get(n)]), get(n) * sign(val[get(n)])}); n = l[get(n)] - 1; } while (val[get(ss)] <= 0) { st.erase({abs(val[get(ss)]), get(ss) * sign(val[get(ss)])}); ss = r[get(ss)] + 1; } } ll ans = 0; while (sz(st)) { auto it = *st.begin(); st.erase(it); int p = abs(it.s); if (val[p] >= 0) ans += val[p]; } cout << ans << '\n'; return 0; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...