Submission #1031042

#TimeUsernameProblemLanguageResultExecution timeMemory
1031042vjudge1Robots (IOI13_robots)C++17
76 / 100
865 ms23928 KiB
#include "robots.h"
#include <bits/stdc++.h>
using namespace std;

struct{
    int*tree,*inds;
    int*p,n;
    void init(int*P,int*PP,int N){
        p=P,n=N;
        tree=new int[4*N];
        inds=PP;
        build(0,n-1,1);
    }
    int build(int l,int r,int node){
        if(l==r){
            return tree[node]=p[inds[l]];
        }
        int mid=(l+r)>>1,child=node<<1;
        return tree[node]=max(build(l,mid,child),build(mid+1,r,child|1));
    }
    int L,R;
    int query(int l,int r,int node){
        if(r<L||R<l){
            return INT_MIN;
        }
        if(L<=l&&r<=R){
            return tree[node];
        }
        int mid=(l+r)>>1,child=node<<1;
        return max(query(l,mid,child),query(mid+1,r,child|1));
    }
    int query(int l,int r){
        L=l,R=r;
        return query(0,n-1,1);
    }
    int P;
    int walk(int l,int r,int node){
        if(l==r){
            return inds[l];
        }
        int mid=(l+r)>>1,child=node<<1;
        if(P<=mid)return walk(l,mid,child);
        int val1=tree[child];
        int val2=query(mid+1,min(r,P));
        if(val2<val1)return walk(l,mid,child);
        return walk(mid+1,r,child|1);
    }
    int walk(int p){
        P=p;
        return walk(0,n-1,1);
    }
    void update(int l,int r,int node){
        if(l==r){
            tree[node]=INT_MIN;
            return;
        }
        int mid=(l+r)>>1,child=node<<1;
        if(P<=mid)update(l,mid,child);
        else update(mid+1,r,child|1);
        tree[node]=max(tree[child],tree[child|1]);
    }
    void update(int p){
        P=p;
        update(0,n-1,1);
    }
}st1,st2;

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
    sort(X,X+A);
    sort(Y,Y+B);
    for(int i=0;i<T;i++){
        if((!A||X[A-1]<=W[i])&&(!B||Y[B-1]<=S[i])){
            return -1;
        }
    }
    int P1[T];
    for(int i=0;i<T;i++)P1[i]=i;
    sort(P1,P1+T,[&](int i,int j)->bool {
        return W[i]<W[j];
    });
    int T1[T];
    for(int i=0;i<T;i++)T1[P1[i]]=i;
    st1.init(S,P1,T);
    int can=-1;
    multiset<int>ms1;
    for(int i=0;i<A;i++){
        while(can+1<T&&W[P1[can+1]]<X[i]){
            can++;
        }
        if(can!=-1){
            ms1.insert(can);
        }
    }
    int P2[T];
    for(int i=0;i<T;i++)P2[i]=i;
    sort(P2,P2+T,[&](int i,int j)->bool {
        return S[i]<S[j];
    });
    int T2[T];
    for(int i=0;i<T;i++)T2[P2[i]]=i;
    st2.init(W,P2,T);
    can=-1;
    multiset<int>ms2;
    for(int i=0;i<B;i++){
        while(can+1<T&&S[P2[can+1]]<Y[i]){
            can++;
        }
        if(can!=-1){
            ms2.insert(can);
        }
    }
    bool died[T];
    memset(died,0,T);
    int left=T,turn=0;
    while(left){
        turn++;
        vector<int>torem;
        for(int i:ms1){
            //cerr<<i<<" :: ";
            int val=st1.walk(i);
            if(died[val]){
                //cerr<<"failed\n";
                torem.push_back(i);
            }else{
                //cerr<<"killed "<<val<<" { "<<T1[val]<<" "<<T2[val]<<" }\n";
                died[val]=1;
                st1.update(T1[val]);
                st2.update(T2[val]);
                left--;
            }
        }
        for(int i:torem){
            ms1.erase(i);
        }
        //cerr<<"\n";
        torem.clear();
        for(int i:ms2){
            //cerr<<i<<" :: ";
            int val=st2.walk(i);
            if(died[val]){
                //cerr<<"failed\n";
                torem.push_back(i);
            }else{
                //cerr<<"killed "<<val<<" { "<<T1[val]<<" "<<T2[val]<<" }\n";
                died[val]=1;
                st1.update(T1[val]);
                st2.update(T2[val]);
                left--;
            }
        }
        for(int i:torem){
            ms2.erase(i);
        }
        //cerr<<"\n-----------------\n";
    }
    return turn;
}
#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...