Submission #205985

#TimeUsernameProblemLanguageResultExecution timeMemory
205985gratus907Robots (IOI13_robots)C++17
100 / 100
2605 ms47652 KiB
#include "robots.h" #include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define ll long long #define all(x) ((x).begin()),((x).end()) #define usecppio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); using namespace std; using pii = pair<int, int>; struct toy { int w, s, ind; void print() { printf("Toy %d : Weight %d, Size %d\n",ind,w,s); } }; bool by_weight(toy &a, toy &b) { return a.w < b.w; } bool by_size(toy &a, toy &b) { return a.s < b.s; } vector <toy> toy_w, toy_s; vector <int> weak; vector <int> small; toy all_toy[1010101]; bool took[1010101]; int a, b, t; const bool debug = false; priority_queue<pii> pq; bool check(int x) { memset(took, 0, sizeof(took)); int pt = 0; for (int i = 0; i<a; i++) { while(pt<t && toy_w[pt].w < weak[i]) { pq.push({toy_w[pt].s, toy_w[pt].ind}); pt++; } int gt = 0; while(gt<x && !pq.empty()) { took[pq.top().second] = true; pq.pop(); gt++; } } while(pt<t) { pq.push({toy_w[pt].s, toy_w[pt].ind}); pt++; } vector <pii> temp; while(!pq.empty()) { temp.push_back(pq.top()); pq.pop(); } for (int i = 0; i<b; i++) { int gt = 0; while(gt<x && !temp.empty() && temp.back().first < small[i]) { took[temp.back().second] = true; temp.pop_back(); gt++; } } for (int i = 0; i<t; i++) { if (took[i]==0) return false; } return true; } int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) { a = A, b = B, t = T; for (int i = 0; i<a; i++) { int x; x = X[i]; weak.push_back(x); } for (int i = 0; i<b; i++) { int x; x = Y[i]; small.push_back(x); } sort(all(weak)); sort(all(small)); for (int i = 0; i<t; i++) { int ww, ss; ww = W[i], ss = S[i]; toy_w.push_back({ww, ss, i}); toy_s.push_back({ww, ss, i}); all_toy[i] = {ww, ss, i}; } sort(all(toy_w),by_weight); sort(all(toy_s),by_size); int lo = 1, hi = 1e6+1; if (!check(1e6+1)) { return -1; } while(lo + 1 < hi) { int mid = (lo + hi)/2; if (check(mid)) hi = mid; else lo = mid; } return (check(lo)?lo:hi); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...