제출 #1311639

#제출 시각아이디문제언어결과실행 시간메모리
1311639PlayVoltz팀들 (IOI15_teams)C++20
0 / 100
499 ms156460 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define mp make_pair #define pb push_back #define fi first #define se second int n; vector<vector<int> > vect; struct node{ int s, e, m; vector<int> val; node *l, *r; node(int S, int E){ s = S, e = E, m = (s+e)/2; if (s!=e){ l = new node(s, m); r = new node(m+1, e); merge(l->val.begin(), l->val.end(), r->val.begin(), r->val.end(), back_inserter(val)); } else val=vect[s], sort(val.begin(), val.end()); } int query(int left, int right, int v){ if (left>right)return 0; if (s==left && e==right)return val.size()-(lower_bound(val.begin(), val.end(), v)-val.begin()); if (right<=m)return l->query(left, right, v); else if (left>m)return r->query(left, right, v); else return l->query(left, m, v)+r->query(m+1, right, v); } }*st; void init(int N, int A[], int B[]){ n=N; vect.resize(n+1); for (int i=0; i<n; ++i)vect[A[i]].pb(B[i]); st = new node(1, n); } int can(int m, int ord[]){ sort(ord, ord+m); //int extra=0; int need=0; for (int i=0, prev=0; i<m; ++i){ if (i!=m-1){ need+=ord[i]; need=max(0, need-(st->query(1, ord[i], ord[i])-st->query(1, ord[i], ord[i+1]))); } else{ need=max(0, need-st->query(1, ord[i], ord[i])); } /* if (i!=m-1){ int low=prev, high=ord[i]+1, res=0; while (low+1<high){ int mid=(low+high)/2; if (st->query(prev+1, mid, ord[i])<ord[i]+extra)low=mid, res=st->query(prev+1, mid, ord[i]); else high=mid; } if (low==ord[i])return 0; extra=extra+ord[i]-res; extra=max(0, extra-st->query(low+1, low+1, ord[i])+st->query(low+1, low+1, ord[i+1])); prev=low; } else{ if (st->query(prev+1, ord[i], ord[i])<ord[i]+extra)return 0; } */ } return !need; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...