제출 #1333342

#제출 시각아이디문제언어결과실행 시간메모리
1333342prunjuiceGrid Coloring (JOI25_ho_t1)C++20
100 / 100
182 ms47676 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    if (!(cin >> N)) return 0;
    vector<ll> A(N+1), B(N+1);
    for (int i = 1; i <= N; ++i) cin >> A[i];
    for (int j = 1; j <= N; ++j) cin >> B[j];

    // Build PA[i] = max(A2..Ai) for i=2..N, PB[j] = max(B2..Bj) for j=2..N
    vector<ll> PA(N+1), PB(N+1);
    if (N >= 2) {
        PA[2] = A[2];
        for (int i = 3; i <= N; ++i) PA[i] = max(PA[i-1], A[i]);
        PB[2] = B[2];
        for (int j = 3; j <= N; ++j) PB[j] = max(PB[j-1], B[j]);
    }

    // Collect all values that may appear (boundaries + PA + PB)
    vector<ll> vals;
    vals.reserve( (N*2) + 5 );
    for (int i = 1; i <= N; ++i) vals.push_back(A[i]);
    for (int j = 2; j <= N; ++j) vals.push_back(B[j]);
    for (int i = 2; i <= N; ++i) vals.push_back(PA[i]);
    for (int j = 2; j <= N; ++j) vals.push_back(PB[j]);

    sort(vals.begin(), vals.end());
    vals.erase(unique(vals.begin(), vals.end()), vals.end());
    int M = (int)vals.size();

    // map value -> index
    unordered_map<ll,int> idx;
    idx.reserve(M * 2);
    for (int k = 0; k < M; ++k) idx[vals[k]] = k;

    // freq arrays
    vector<ll> freqBound(M, 0); // counts from A_i (i=1..N) and B_j (j=2..N)
    for (int i = 1; i <= N; ++i) freqBound[idx[A[i]]]++;    // first column all A_i
    for (int j = 2; j <= N; ++j) freqBound[idx[B[j]]]++;    // first row except (1,1)

    vector<ll> cntPA(M, 0), cntPB(M, 0);
    for (int i = 2; i <= N; ++i) cntPA[idx[PA[i]]]++; 
    for (int j = 2; j <= N; ++j) cntPB[idx[PB[j]]]++;

    // prefix sums on PB to compute leqPB[v] quickly
    vector<ll> prefPB(M+1, 0), prefPA(M+1, 0);
    for (int k = 0; k < M; ++k) {
        prefPB[k+1] = prefPB[k] + cntPB[k];
        prefPA[k+1] = prefPA[k] + cntPA[k];
    }

    // compute interior counts and total counts
    ll bestCnt = -1;
    ll bestColor = -1;

    for (int k = 0; k < M; ++k) {
        ll v = vals[k];
        ll cntAeq = cntPA[k];
        ll cntBeq = cntPB[k];
        ll leqPB = prefPB[k+1];       // number of PB <= v
        ll ltPA  = prefPA[k];        // number of PA < v

        ll interior = cntAeq * leqPB + cntBeq * ltPA;
        ll total = interior + freqBound[k];

        // tie-break: choose larger color when counts equal
        if (total > bestCnt || (total == bestCnt && v > bestColor)) {
            bestCnt = total;
            bestColor = v;
        }
    }

    cout << bestColor << " " << bestCnt << "\n";
    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...