Submission #1140402

#TimeUsernameProblemLanguageResultExecution timeMemory
1140402LemserTeams (IOI15_teams)C++20
34 / 100
4094 ms76356 KiB
#include "teams.h" #include <bits/stdc++.h> #pragma GCC target("avx2") #pragma GCC target("popcnt") #pragma GCC optimization ("O3, Ofast") #pragma GCC optimization ("unroll-loops") using namespace std; using ll = long long; using ull = unsigned long long; using lld = long double; using pii = pair<int,int>; using pll = pair<ll, ll>; using vi = vector<int>; using vll = vector<ll>; using vpii = vector<pii>; using vpll = vector<pll>; using vlld = vector<lld>; // #define endl '\n' #define all(x) x.begin(),x.end() #define lsb(x) x&(-x) #define gcd(a,b) __gcd(a,b) #define sz(x) (int)x.size() #define mp make_pair #define pb push_back #define fi first #define se second #define fls cout.flush() #define fore(i,l,r) for(auto i=l;i<r;i++) #define fo(i,n) fore(i,0,n) #define forex(i,r,l) for(auto i=r; i>=l;i--) #define ffo(i,n) forex(i,n-1,0) bool cmin(ll &a, ll b) { if(b<a){a=b;return 1;}return 0; } bool cmax(ll &a, ll b) { if(b>a){a=b;return 1;}return 0; } void valid(ll in) { cout<<((in)?"YES\n":"NO\n"); } ll lcm(ll a, ll b) { return (a/gcd(a,b))*b; } ll gauss(ll n) { return (n*(n+1))/2; } const int INF = 1e9; const int N = 1e5 + 7; int st[4*N]; deque<int> as[N]; int a[N], b[N]; int n; void update (int id, int l, int r, int i, int x) { if (l == r) st[id] = x; else { int m = (l + r)/2; if (i <= m) update(id*2, l, m, i, x); else update(id*2+1, m+1, r, i, x); st[id] = min(st[id*2], st[id*2+1]); } } int query (int id, int l, int r, int i, int j) { if (r < i || j < l) return INF; if (i <= l && r <= j) return st[id]; int m = (l + r)/2; return min(query(id*2, l, m, i, j), query(id*2+1, m+1, r, i, j)); } void init(int N, int A[], int B[]) { n = N; vector<array<int, 2>> rs(n); fo (i, n) rs[i] = {A[i], B[i]}; sort (all(rs)); fo (i, n) a[i] = rs[i][0], b[i] = rs[i][1]; fo (i, n) as[b[i]].push_back(i); fore (i, 1, n+1) { if (sz(as[i]) == 0) { update (1, 1, n, i, INF); continue; } update(1, 1, n, i, as[i].front()); } } void clear (vector<int> &dxs) { reverse(all(dxs)); for (int i: dxs) { as[b[i]].push_front(i); update(1, 1, n, b[i], i); } } int can(int M, int K[]) { sort(K, K+M); vector<int> dxs; fo (i, M) { int l = 0, r = n-1, lb, rb; while (l <= r) { int m = (l+r)/2; if (a[m] <= K[i]) l = m+1; else r = m-1; } if (r < 0) { clear(dxs); return 0; } int w = K[i]; while (K[i] > 0) { if (query(1, 1, n, w, n) > r) { clear(dxs); return 0; } int id = 1, lb = 1, rb = n; while (lb < rb) { int m = (lb + rb)/2; if (m < w) { id = id*2+1; lb = m+1; continue; } if (query(id*2, lb, m, w, m) <= r) { id = id*2; rb = m; continue; } id = id*2+1; lb = m+1; } int j = as[lb].front(); as[lb].pop_front(); if (sz(as[lb]) == 0) update(1, 1, n, lb, INF); else update(1, 1, n, lb, as[lb].front()); dxs.pb(j); K[i]--; } } clear(dxs); return 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...