# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
401724 | bonopo | 로봇 (IOI13_robots) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define el "\n"
#define f first
#define s second
typedef long long ll;
const ll MM=1e5+5, MOD=1e9+7;
int aA, aB, aT, x[MM], y[MM], u[MM];
priority_queue<pair<int,int>> pq;
struct toy {
int wt, sz, idx;
} t[10*MM];
bool cmpw(toy a, toy b) {
return a.wt<b.wt;
}
bool cmps(toy a, toy b) {
return a.sz<b.sz;
}
bool check(int sec) {
memset(u, 0, sizeof(u)); int ptr=1, hv=0;
// take highest weight you can
sort(t+1, t+aT+1, cmpw);
for(int i=1; i<=aA; ++i) {
while(ptr<=aT&&t[ptr].wt<x[i]) {
pq.push({t[ptr].sz, ptr++}); }
int cnt=sec;
while(!pq.empty()&&cnt) {
pair<int,int> e=pq.top(); pq.pop();
if(!u[t[e.s].idx]) {
u[t[e.s].idx]=1; ++hv; --cnt; }
}
}
sort(t+1, t+aT+1, cmps);
while(!pq.empty()) pq.pop(); ptr=1;
// take highest size you can
for(int i=1; i<=aB; ++i) {
while(ptr<=aT&&t[ptr].sz<y[i]) {
pq.push({t[ptr].wt, ptr++}); }
int cnt=sec;
while(!pq.empty()&&cnt) {
pair<int,int> e=pq.top(); pq.pop();
if(!u[t[e.s].idx]) {
u[t[e.s].idx]=1; ++hv; --cnt; }
}
} return hv==aT;
}
int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
aA=A; aB=B; aT=T;
for(int i=0; i<A; ++i) x[i+1]=X[i];
for(int i=0; i<B; ++i) y[i+1]=Y[i];
for(int i=0; i<T; ++i) t[i+1].wt=W[i];
for(int i=0; i<T; ++i) t[i+1].sz=S[i];
for(int i=0; i<T; ++i) t[i+1].idx=i+1;
if(A>0) sort(x+1, x+A+1);
if(B>0) sort(y+1, y+B+1);
int lo=1, hi=T, mid, ans=-1;
while(lo<=hi) {
mid=(lo+hi)/2;
if(check(mid)) hi=mid-1, ans=mid;
else lo=mid+1; }
return ans;
}