답안 #130125

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
130125 2019-07-14T04:34:36 Z choikiwon Worst Reporter 2 (JOI16_worst_reporter2) C++17
0 / 100
21 ms 20728 KB
#include<bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

const int MN = 200010;

int N;
vector<int> V[MN], X[MN];
priority_queue<int> freeV;
multiset<int> freeX;

int Cn;
vector<int> C;
unordered_map<int, int> dc;

struct BIT {
    int Z;
    vector<pii> tree;
    vector<int> lazy;
    void init(int Z_) {
        Z = Z_;
        tree = vector<pii>(4 * Z);
        lazy = vector<int>(4 * Z, 0);
        build(0, Z - 1, 1);
    }
    void build(int l, int r, int n) {
        if(l == r) {
            tree[n] = {0, -l};
            return;
        }
        int m = (l + r)>>1;
        build(l, m, 2*n);
        build(m + 1, r, 2*n + 1);
        tree[n] = min(tree[2*n], tree[2*n + 1]);
    }
    void prop(int l, int r, int n) {
        if(l != r) {
            tree[2*n].first += lazy[n];
            lazy[2*n] += lazy[n];
            tree[2*n + 1].first += lazy[n];
            lazy[2*n + 1] += lazy[n];
            lazy[n] = 0;
        }
    }
    void upd(int a, int b, int d, int l, int r, int n) {
        if(b < l || r < a) return;
        if(a <= l && r <= b) {
            tree[n].first += d;
            lazy[n] += d;
            return;
        }
        prop(l, r, n);
        int m = (l + r)>>1;
        upd(a, b, d, l, m, 2*n);
        upd(a, b, d, m + 1, r, 2*n + 1);
        tree[n] = min(tree[2*n], tree[2*n + 1]);
    }
    pii quer(int a, int b, int l, int r, int n) {
        if(b < l || r < a) return pii(1e9, 1e9);
        if(a <= l && r <= b) return tree[n];
        prop(l, r, n);
        int m = (l + r)>>1;
        pii L = quer(a, b, l, m, 2*n);
        pii R = quer(a, b, m + 1, r, 2*n + 1);
        return min(L, R);
    }
    void upd(int a, int b, int d) { upd(a, b, d, 0, Z - 1, 1); }
    pii quer(int a, int b) { return quer(a, b, 0, Z - 1, 1); }
};

BIT bit[MN];

struct Info {
    int v, i, j, l;
    bool operator <(const Info &i) const {
        return v < i.v;
    }
};
priority_queue<Info> cand, pq;
vector<pii> P;
int la[MN];

void relax() {
    while(!cand.empty()) {
        Info t = cand.top();

        int x = t.j;
        if(t.l != la[x]) {
            cand.pop();
            continue;
        }
        break;
    }
}

int main() {
    //std::ios::sync_with_stdio(false);

    cin >> N;

    for(int i = 0; i < N; i++) {
        int a, b; cin >> a >> b;
        V[--a].push_back(b);
    }
    for(int i = 0; i < N; i++) {
        int c, d; cin >> c >> d;
        X[--c].push_back(d);
    }

    int ans = 0;
    for(int i = 0; i < N; i++) {
        sort(V[i].begin(), V[i].end());
        sort(X[i].begin(), X[i].end());

        vector<int> chk(V[i].size(), 0);
        vector<int> tmp;

        int pos = (int)X[i].size() - 1;
        for(int j = (int)V[i].size() - 1; j >= 0; j--) {
            if(pos >= 0 && V[i][j] <= X[i][pos]) {
                pos--;
                continue;
            }
            freeV.push(V[i][j]);
            chk[j] = 1;
        }
        for(int j = 0; j < V[i].size(); j++) if(!chk[j]) tmp.push_back(V[i][j]);
        V[i] = tmp;

        if(V[i].size() == 0) {
            for(int j = 0; j < X[i].size(); j++) {
                freeX.insert(X[i][j]);
            }
            continue;
        }

        bit[i].init(V[i].size());

        chk = vector<int>(X[i].size(), 0);

        int pos1 = 0;
        int pos2 = 0;
        for(int j = 0; j < V[i].size(); j++) {
            while(pos1 < X[i].size() && X[i][pos1] < V[i][j]) pos1++;
            while(pos2 < X[i].size() && X[i][pos2] < V[i][j]) pos2++;
            bit[i].upd(j, j, pos2 - pos1);
            chk[pos2] = 1;
            pos2++;

            P.push_back({V[i][j], i});
        }

        tmp.clear();
        for(int j = 0; j < X[i].size(); j++) {
            if(chk[j]) tmp.push_back(X[i][j]);
            else freeX.insert(X[i][j]);
        }
        X[i] = tmp;

        pii t = bit[i].tree[1];
        pq.push({ X[i].back(), V[i][-t.second], i });
        la[i] = (int)V[i].size() - 1;
    }

    ans += freeV.size();

    sort(P.begin(), P.end());

    int pos = (int)P.size() - 1;
    while(!freeV.empty()) {
        int v = freeV.top(); freeV.pop();

        //cout << v << endl;

        while(pos >= 0 && P[pos].first >= v) {
            int x = P[pos].second;
            if(la[x] >= 0 && V[x][ la[x] ] < v) continue;

            bit[x].upd(la[x], la[x], 1e9);
            la[x]--;

            if(la[x] >= 0) {
                pii t = bit[x].tree[1];
                pq.push({ X[x][ la[x] ], V[x][-t.second], x, la[x] });
            }
            pos--;
        }
        while(!pq.empty() && pq.top().v >= v) {
            Info t = pq.top(); pq.pop();
            cand.push({ -t.i, t.v, t.j });
        }

        auto it = freeX.lower_bound(v);
        if(it != freeX.end()) {
            freeX.erase(it);
            continue;
        }

        ans++;
        relax();

        Info t = cand.top(); cand.pop();

        int x = t.j;
        int s = lower_bound(V[x].begin(), V[x].end(), t.i) - V[x].begin();
        int e = la[x];

        bit[x].upd(s, e, -1);
        bit[x].upd(s, s, 1e9);

        freeV.push(V[x][s]);
    }

    cout << ans;
}

Compilation message

worst_reporter2.cpp: In function 'int main()':
worst_reporter2.cpp:128:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < V[i].size(); j++) if(!chk[j]) tmp.push_back(V[i][j]);
                        ~~^~~~~~~~~~~~~
worst_reporter2.cpp:132:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j = 0; j < X[i].size(); j++) {
                            ~~^~~~~~~~~~~~~
worst_reporter2.cpp:144:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < V[i].size(); j++) {
                        ~~^~~~~~~~~~~~~
worst_reporter2.cpp:145:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(pos1 < X[i].size() && X[i][pos1] < V[i][j]) pos1++;
                   ~~~~~^~~~~~~~~~~~~
worst_reporter2.cpp:146:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(pos2 < X[i].size() && X[i][pos2] < V[i][j]) pos2++;
                   ~~~~~^~~~~~~~~~~~~
worst_reporter2.cpp:155:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < X[i].size(); j++) {
                        ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 20600 KB Output is correct
2 Incorrect 21 ms 20728 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 20600 KB Output is correct
2 Incorrect 21 ms 20728 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 20600 KB Output is correct
2 Incorrect 21 ms 20728 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 20600 KB Output is correct
2 Incorrect 21 ms 20728 KB Output isn't correct
3 Halted 0 ms 0 KB -