Submission #1273459

#TimeUsernameProblemLanguageResultExecution timeMemory
1273459anhkhoaTram (CEOI13_tram)C++17
0 / 100
21 ms12172 KiB
#include <bits/stdc++.h>
using namespace std;

struct Seat {int r,c;};
struct Cand {
    long long d2; int r,c;
    bool operator<(const Cand& o) const {
        if (d2!=o.d2) return d2<o.d2;
        if (r!=o.r) return r>o.r;
        return c>o.c;
    }
};

int N,M;
vector<Seat> ans;
vector<bool> isEnter;
vector<vector<bool>> taken;
set<int> occ;
priority_queue<Cand> pq;

long long dist2(int r,int c,const set<int>& occ){
    long long best=LLONG_MAX;
    auto it=occ.lower_bound(r);
    if(it!=occ.end()){
        int rr=*it;
        best=min(best,1LL*(r-rr)*(r-rr)+(c==1? (taken[rr][2]?1:0): (taken[rr][1]?1:0)));
        best=min(best,1LL*(r-rr)*(r-rr)+(c-1)*(c-1)); // check same col
        best=min(best,1LL*(r-rr)*(r-rr)+(c-2)*(c-2));
    }
    if(it!=occ.begin()){
        --it; int rr=*it;
        best=min(best,1LL*(r-rr)*(r-rr)+(c-1)*(c-1));
        best=min(best,1LL*(r-rr)*(r-rr)+(c-2)*(c-2));
    }
    return best;
}

bool valid(const Cand& x){
    if(x.r<1||x.r>N||taken[x.r][x.c]) return false;
    return true;
}

void addCand(int r,int c){
    if(r<1||r>N) return;
    if(taken[r][c]) return;
    long long d=dist2(r,c,occ);
    pq.push({d,r,c});
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin>>N>>M;
    ans.resize(M+1);
    isEnter.resize(M+1);
    taken.assign(N+1,vector<bool>(3,false));

    for(int k=1;k<=M;k++){
        char t; cin>>t;
        if(t=='E'){
            isEnter[k]=true;
            Seat chosen;
            if(occ.empty()){
                chosen={1,1};
            } else {
                while(!pq.empty() && !valid(pq.top())) pq.pop();
                Cand best=pq.top(); pq.pop();
                chosen={best.r,best.c};
            }
            taken[chosen.r][chosen.c]=true;
            ans[k]=chosen;
            cout<<chosen.r<<" "<<chosen.c<<"\n";
            occ.insert(chosen.r);

            // thêm ứng viên mới từ hàng này và lân cận
            addCand(chosen.r,3-chosen.c);
            addCand(chosen.r-1,1); addCand(chosen.r-1,2);
            addCand(chosen.r+1,1); addCand(chosen.r+1,2);
        }else{
            int p; cin>>p;
            Seat s=ans[p];
            taken[s.r][s.c]=false;
            if(!taken[s.r][1] && !taken[s.r][2]) occ.erase(s.r);
            addCand(s.r,1); addCand(s.r,2);
        }
    }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...