Submission #747587

#TimeUsernameProblemLanguageResultExecution timeMemory
747587baneTeams (IOI15_teams)C++17
0 / 100
406 ms114524 KiB
#include "teams.h" #include "bits/stdc++.h" using namespace std; int n; vector<pair<int,int>> intervals; const int maxN = (int)5e5 + 1; class SegmentTree{ public: pair<int,int> Seg[maxN * 3]; //{min A value in B range, its position} multiset<int>Left[maxN * 3]; void init(){ for (int i = 0; i < n * 3; i++){ Seg[i] = {(int)1e9, -1}; } } void upd(int pos, int val, int l = 1, int r = n, int k = 1){ if (l == r){ Left[k].insert(val); Seg[k] = {*Left[k].begin(), l}; return; } int md = (l + r) / 2; if (pos <= md)upd(pos,val,l,md,k*2); else upd(pos,val,md+1,r,k*2+1); if (Seg[k * 2].first < Seg[k * 2 + 1].first){ Seg[k] = Seg[k * 2]; }else{ Seg[k] = Seg[k * 2 + 1]; } } pair<int,int>query(int a, int b, int l = 1, int r = n, int k = 1){ if (l > b || r < a)return {(int)1e9,-1}; if (l >= a && r <= b){ return Seg[k]; } auto left = query(a,b,l,(l+r)/2,k*2); auto right = query(a,b,(l+r)/2+1,r,k*2+1); if (left.first < right.first)return left; else return right; } void remove(int pos, int val, int l = 1, int r = n, int k = 1){ if (l == r){ Left[k].erase(Left[k].find(val)); if (Left[k].size()){ Seg[k] = {*Left[k].begin(),l}; }else{ Seg[k] = {(int)1e9, -1}; } return; } int md = (l + r) / 2; if (pos <= md)remove(pos,val,l,md,k*2); else remove(pos,val,md+1,r,k*2+1); if (Seg[k * 2].first < Seg[k * 2 + 1].first){ Seg[k] = Seg[k * 2]; }else{ Seg[k] = Seg[k * 2 + 1]; } } }; SegmentTree st; void init(int N, int A[], int B[]) { n = N; intervals.resize(N); st.init(); for (int i = 0; i < N; ++i){ intervals[i] = {A[i], B[i]}; st.upd(B[i], A[i]); } } int can(int M, int K[]) { sort(K, K + M); for (int i = 0; i < M; i++){ int l = K[i], r = n; pair<int,int>ans = {(int)1e9, -1}; while(l<=r){ int md = (l + r) / 2; auto response = st.query(K[i], md); if (response.first <= K[i]){ ans = response; r = md - 1; }else{ l = md + 1; } } if (ans.first == (int)1e9){ return 0; } st.remove(ans.second,ans.first); } return 1; } /*int main(){ int N, M; cin >> N >> M; int A[N], B[N]; for (int i = 0; i < N; i++){ cin >> A[i] >> B[i]; } init(N,A,B); int K[M]; for(int i = 0; i < M; i++){ cin >> K[i]; } cout<<(can(M,K) ? "YES":"NO"); }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...