제출 #56808

#제출 시각아이디문제언어결과실행 시간메모리
56808hamzqq9로봇 (IOI13_robots)C++14
100 / 100
2371 ms64628 KiB
#include "robots.h" #include<bits/stdc++.h> using namespace std; #define ii pair<int,int> #define st first #define nd second #define orta ((bas+son)/2) #define MAX1 1000005 #define MAX2 50005 int A,B,T; int X[MAX2],Y[MAX2]; ii toy[MAX1]; bool S[MAX2*4]; int fr[2][MAX2]; int DAYS; void build(int node,int bas,int son) { if(bas>son) return ; if(bas==son) { S[node]=true; return ; } build(node*2,bas,orta); build(node*2+1,orta+1,son); S[node]=S[node*2]|S[node*2+1]; } priority_queue<int> H; void zero() { while(!H.empty()) H.pop(); build(1,0,B-1); for(int i=0;i<A;i++) fr[0][i]=0; for(int i=0;i<B;i++) fr[1][i]=0; } void up(int node,int bas,int son,int x) { if(bas>x || son<x) return ; if(bas==x && son==x) { S[node]=false; return ; } up(node*2,bas,orta,x); up(node*2+1,orta+1,son,x); S[node]=S[node*2]|S[node*2+1]; } int get(int node,int bas,int son,int x,int y) { if(bas>=x && son<=y) { if(!S[node]) return bas; if(bas==son) return bas; if(S[node*2]) return get(node*2,bas,orta,x,y); return get(node*2+1,orta+1,son,x,y); } if(orta>=x) { if(orta+1<=y) { int L=get(node*2,bas,orta,x,y); if(fr[1][L]<DAYS) return L; return get(node*2+1,orta+1,son,x,y); } return get(node*2,bas,orta,x,y); } return get(node*2+1,orta+1,son,x,y); } priority_queue<int> LST; bool check() { zero(); while(!LST.empty()) LST.pop(); int last=A; for(int i=0;i<T;i++) { while(last-1>=0 && X[last-1]>=toy[i].st) { last--; LST.push(-last); } int cur=last; while(!LST.empty()) { int tp=-LST.top(); if(fr[0][tp]==DAYS) { LST.pop(); continue ; } cur=tp; break ; } H.push(-toy[i].nd); if(last==A || fr[0][cur]==DAYS) { int valB=-H.top(); H.pop(); int pos=lower_bound(Y,Y+B,valB)-Y; int RASB=(pos<B?get(1,0,B-1,pos,B-1):-1); if(pos==B || fr[1][RASB]==DAYS) { return false; } else { fr[1][RASB]++; if(fr[1][RASB]==DAYS) { up(1,0,B-1,RASB); } } } else { fr[0][cur]++; } } 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++) { X[i]--; ::X[i]=X[i]; } for(int i=0;i<B;i++) { Y[i]--; ::Y[i]=Y[i]; } for(int i=0;i<T;i++) { toy[i]={W[i],S[i]}; } sort(::X,::X+A); sort(::Y,::Y+B); sort(toy,toy+T,greater<ii>()); int bas=1,son=T; while(bas<=son) { DAYS=orta; if(check()) son=orta-1; else bas=orta+1; } if(bas==T+1) { return -1; } return bas; }
#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...