Submission #1139403

#TimeUsernameProblemLanguageResultExecution timeMemory
1139403steveonalexTeams (IOI15_teams)C++20
0 / 100
487 ms300352 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" struct FenwickTree{ int n; vector<ll> a; FenwickTree(int _n){ n = _n; a.resize(n+1); } void update(int i, ll v){ while(i <= n){ a[i] += v; i += LASTBIT(i); } } ll get(int i){ ll ans = 0; while(i > 0){ ans += a[i]; i -= LASTBIT(i); } return ans; } ll get(int l, int r){return get(r) - get(l-1);} int binary_lift(ll x){ int p = MASK(logOf(n)), idx =0; while(p > 0){ if (idx + p <= n && x > a[idx + p]){ idx += p; x -= a[idx]; } p >>= 1; } return idx + 1; } }; struct PST{ struct Node{ ll 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 = a.size(); a.push_back(Node()); 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]);} }; const int N = 5e5 + 69; int n; vector<int> query_enter[N]; FenwickTree bit_front(N), bit_back(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){ bit_front.update(B[i], 1); bit_back.update(A[i], 1); query_enter[A[i]].push_back(B[i]); } ver_queue.push_back(st.get_version()); for(int i = 1; i <= n; ++i){ for(int j: query_enter[i]) st.update(j); ver_queue.push_back(st.get_version()); } } 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(); vector<int> count_front(m), count_back(m); for(int i = 0; i < m; ++i){ count_front[i] = bit_front.get(sigma[i].first - 1); count_back[i] = bit_back.get(sigma[i].first + 1, N); } vector<int> count_between(m); for(int i = 0; i + 1 < m; ++i){ int l = sigma[i].first + 1, r = sigma[i+1].first - 1; if (l > r) continue; count_between[i] = st.get(l, r, ver_queue[r]) - st.get(l, r, ver_queue[l-1]); } for(int i = 0; i < m; ++i){ int sum1 = 0, sum2 = 0; for(int j = i; j < m; ++j){ sum1 += sigma[j].first * sigma[j].second; // cout << "Range: " << i << " " << j << " " << sum1 << " " << n - count_front[i] - count_back[j] - sum2 << "\n"; if (sum1 > n - count_front[i] - count_back[j] - sum2) return 0; sum2 += count_between[j]; } } 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...