Submission #1273457

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

struct Seat {
    int row, col;
};

struct Candidate {
    long long dist2; // lưu bình phương khoảng cách để so sánh
    int row, col;
    int L, R; // interval boundaries (occupied rows around)
    bool operator<(const Candidate& o) const {
        if (dist2 != o.dist2) return dist2 < o.dist2; // max-heap
        if (row != o.row) return row > o.row;
        return col > o.col;
    }
};

int N, M;
vector<Seat> answer; // lưu ghế đã chọn cho mỗi event E
vector<bool> isEnter; // đánh dấu sự kiện nào là E
vector<vector<bool>> taken; // taken[row][col]

priority_queue<Candidate> pq;
set<int> occRows;

bool validCandidate(const Candidate& c) {
    if (c.row < 1 || c.row > N) return false;
    if (taken[c.row][c.col]) return false;
    // kiểm tra interval còn hợp lệ
    auto itL = occRows.lower_bound(c.L);
    if (itL == occRows.end() || *itL != c.L) return false;
    auto itR = occRows.lower_bound(c.R);
    if (itR == occRows.end() || *itR != c.R) return false;
    return true;
}

// thêm ứng viên cho interval (L,R)
void addInterval(int L, int R) {
    if (L > R) return;
    int mid = (L + R) / 2;
    // ta thử cả 2 cột
    for (int col = 1; col <= 2; col++) {
        long long dL = 1LL*(mid-L)*(mid-L) + (col==1?0:1);
        long long dR = 1LL*(R-mid)*(R-mid) + (col==2?0:1);
        long long mind = min(dL, dR);
        Candidate c = {mind, mid, col, L, R};
        pq.push(c);
    }
}

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

    cin >> N >> M;
    answer.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 (occRows.empty()) {
                chosen = {1,1};
            } else {
                // lấy ứng viên hợp lệ nhất
                while (!pq.empty() && !validCandidate(pq.top())) pq.pop();
                Candidate best = pq.top(); pq.pop();
                chosen = {best.row, best.col};
            }

            taken[chosen.row][chosen.col] = true;
            answer[k] = chosen;
            cout << chosen.row << " " << chosen.col << "\n";

            // cập nhật occRows và intervals
            if (!occRows.count(chosen.row)) {
                // lần đầu có người ở row này
                auto it = occRows.insert(chosen.row).first;
                int L = (it==occRows.begin()?1:*prev(it));
                int R = (next(it)==occRows.end()?N:*next(it));
                // thêm interval trái
                if (it != occRows.begin()) addInterval(L, chosen.row);
                // thêm interval phải
                if (next(it) != occRows.end()) addInterval(chosen.row, R);
                // nếu biên
                if (it == occRows.begin()) addInterval(1, chosen.row);
                if (next(it) == occRows.end()) addInterval(chosen.row, N);
            }
        } else { // L
            int p; cin >> p;
            Seat s = answer[p];
            taken[s.row][s.col] = false;

            // nếu cả 2 ghế hàng đó trống thì xóa row khỏi occRows
            if (!taken[s.row][1] && !taken[s.row][2]) {
                auto it = occRows.find(s.row);
                int L = (it==occRows.begin()?1:*prev(it));
                int R = (next(it)==occRows.end()?N:*next(it));
                occRows.erase(it);
                // merge interval
                addInterval(L,R);
            }
        }
    }

    return 0;
}
#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...