Submission #1139524

#TimeUsernameProblemLanguageResultExecution timeMemory
1139524steveonalexTeams (IOI15_teams)C++20
100 / 100
729 ms227432 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1ULL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll gcd(ll a, ll b){return __gcd(a, b);} ll lcm(ll a, ll b){return a / gcd(a, b) * b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ull mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} double rngesus_d(double l, double r){ double cur = rngesus(0, MASK(60) - 1); cur /= MASK(60) - 1; return l + cur * (r - l); } template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } #include "teams.h" const int N = MASK(19); struct PST{ struct Node{ int val; int child[2]; Node(){val = 0; memset(child, -1, sizeof child);} }; int n; vector<Node> a; vector<int> root_pos; PST(int _n){ n = _n; a.push_back(Node()); root_pos.push_back(0); build_tree(1, n, 0); } int get_version(){return root_pos.size();} void add_child(int &x){ x = a.size(); a.push_back(Node()); } void build_tree(int l, int r, int id){ if (l == r){a[id].val = 0; return;} int mid = (l + r) >> 1; add_child(a[id].child[0]); add_child(a[id].child[1]); build_tree(l, mid, a[id].child[0]); build_tree(mid + 1, r, a[id].child[1]); a[id].val = a[a[id].child[0]].val + a[a[id].child[1]].val; } void update(int i, int l, int r, int id, int old_id){ a[id] = a[old_id]; a[id].val++; if (l == r) return; int mid = (l + r) >> 1; if (i <= mid){ add_child(a[id].child[0]); update(i, l, mid, a[id].child[0], a[old_id].child[0]); } else{ add_child(a[id].child[1]); update(i, mid + 1, r, a[id].child[1], a[old_id].child[1]); } } void update(int i, int old_ver = -1){ if (old_ver == -1) old_ver = get_version() - 1; int id; add_child(id); root_pos.push_back(id); int old_id = root_pos[old_ver]; update(i, 1, n, id, old_id); } ll get(int u, int v, int l, int r, int id){ if (u <= l && r <= v) return a[id].val; int mid = (l + r) >> 1; ll s1 = 0, s2 = 0; if (u <= mid) s1 += get(u, v, l, mid, a[id].child[0]); if (v > mid) s2 += get(u, v, mid + 1, r, a[id].child[1]); return s1 + s2; } ll get(int u, int v, int ver){ return get(u, v, 1, n, root_pos[ver]); } }; int n; vector<int> query_enter[N]; PST st(N); vector<int> ver_queue; void init(int _n, int A[], int B[]) { n = _n; for(int i = 0; i < n; ++i){ query_enter[A[i]].push_back(B[i]); } ver_queue.push_back(st.get_version() - 1); for(int i = 1; i <= n; ++i){ for(int j: query_enter[i]) st.update(j); ver_queue.push_back(st.get_version() - 1); } } int can(int m, int K[]) { ll sum = 0; for(int i = 0; i < m; ++i) sum += K[i]; if (sum > n) return 0; map<int,int> mp; for(int i= 0; i < m; ++i) mp[K[i]]++; vector<pair<int, int>> sigma(ALL(mp)); m = sigma.size(); int dp[m]; memset(dp, 0, sizeof dp); vector<int> drake; for(int i = 0; i < m; ++i){ int F = sigma[i].first; dp[i] = sigma[i].first * sigma[i].second - st.get(F, N, ver_queue[F]); int ma = 0; vector<int> tmp; for(int j: drake){ int G = sigma[j].first; // cout << dp[j] << " " << st.get(G, N, ver_queue[G]) << "\n"; if (maximize(ma, dp[j] + st.get(F, N, ver_queue[G]))) tmp.push_back(j); } dp[i] += ma; if (dp[i] > 0) return 0; drake = tmp; while(drake.size() && dp[drake.back()] <= dp[i]) drake.pop_back(); drake.push_back(i); } return 1; } // int main(void){ // ios::sync_with_stdio(0);cin.tie(0); cout.tie(0); // clock_t start = clock(); // int n, q; cin >> n >> q; // int a[n], b[n]; // for(int i = 0; i < n; ++i) cin >> a[i] >> b[i]; // init(n, a, b); // while(q--){ // int m; cin >> m; // int k[m]; // for(int i = 0; i < m; ++i) cin >> k[i]; // if (can(m, k)) cout << "YES\n"; // else cout << "NO\n"; // } // cerr << "Time elapsed: " << clock() - start << " ms\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...