Submission #384907

#TimeUsernameProblemLanguageResultExecution timeMemory
384907LucaDantasTeams (IOI15_teams)C++17
77 / 100
3635 ms269276 KiB
#include <bits/stdc++.h> #include "teams.h" using namespace std; #define all(a) (a).begin(), (a).end() constexpr int maxn = 2e5+10; int n, ind[maxn]; struct Node { Node *l, *r; int v; Node() : l(this), r(this), v(0) {} } *root[maxn]; struct PersistentSegmentTree { Node* upd(Node* base, int i, int j, int pos, int v) { Node *node = new Node(); *node = *base; node->v += v; if(i == j) return node; int m = (i+j) >> 1; if(pos <= m) node->l = upd(node->l, i, m, pos, v); else node->r = upd(node->r, m+1, j, pos, v); return node; } int query(Node* prev, Node* now, int i, int j, int l, int r) { if(i > r || j < l) return 0; if(i >= l && j <= r) return now->v - prev->v; int m = (i+j) >> 1; return query(prev->l, now->l, i, m, l, r) + query(prev->r, now->r, m+1, j, l, r); } int get(int l, int r, int k) { return query(root[ind[l]], root[ind[r]], 1, n, k, n); } } seg; pair<int,int> ranges[maxn]; void init(int N, int A[], int B[]) { n = N; for(int i = 0; i < N; i++) ranges[i] = {A[i], B[i]}; sort(ranges, ranges+N); root[0] = new Node(); for(int i = 1, ptr = 0; i <= N; i++) { for(; ptr < N && ranges[ptr].first == i; ptr++) root[ptr+1] = seg.upd(root[ptr], 1, n, ranges[ptr].second, 1); ind[i] = ptr; } } int fq[maxn]; long long dp[maxn]; // qual o menor valor de |v(S)| - |S| pra um subset até i int can(int M, int K[]) { vector<int> V(M); for(int i = 0; i < M; i++) V[i] = K[i], ++fq[K[i]]; sort(all(V)); V.erase(unique(all(V)), V.end()); M = (int)V.size(); bool ok = 1; for(int i = 0; i < M; i++) { int k = V[i]; dp[i] = seg.get(0, k, k) - 1ll * fq[k] * k; for(int j = 0; j < i; j++) dp[i] = min(dp[i], dp[j] + seg.get(V[j], k, k) - 1ll * fq[k] * k); ok &= dp[i] >= 0; } for(int i = 0; i < M; i++) dp[i] = fq[V[i]] = 0; return ok; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...