답안 #567798

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
567798 2022-05-24T08:27:39 Z hoanghq2004 Team Contest (JOI22_team) C++14
0 / 100
19 ms 19124 KB
#include <bits/stdc++.h>
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;

const int N = 15e4 + 10;

int n;

struct dta {
    int x, y, z;
    int operator < (const dta& other) const {
        return z > other.z;
    }
} A[N];

struct SegmentTree {
    int st[N * 4];
    SegmentTree() {
        memset(st, -1, sizeof(st));
    }
    void reset() {
        memset(st, -1, sizeof(st));
    }
    void add(int id, int L, int R, int i, int val) {
        if (L == R) {
            st[id] = val;
            return;
        }
        int mid = L + R >> 1;
        if (i <= mid) add(id * 2, L, mid, i, val);
        else add(id * 2 + 1, mid + 1, R, i, val);
        st[id] = max(st[id * 2], st[id * 2 + 1]);
    }
    int get(int id, int L, int R, int k) {
        if (st[id] <= k) return -1;
        if (L == R) return L;
        int mid = L + R >> 1;
        int ans = get(id * 2, L, mid, k);
        if (ans == -1) ans = get(id * 2 + 1, mid + 1, R, k);
        return ans;
    }
} ST[2];

struct RangeTree {
    vector <int> BIT[N];
    vector <int> dta[N];
    void fake_add(int x, int y) {
        ++x, ++y;
        for (; x < N; x += x & - x)
            dta[x].push_back(y);
    }
    void build() {
        for (int i = 0; i < N; ++i) sort(dta[i].begin(), dta[i].end()), BIT[i].assign(dta[i].size() + 10, 1e9);
    }
    void add(int x, int y, int w) {
        ++x, ++y;
        for (; x < N; x += x & - x) {
            int z = lower_bound(dta[x].begin(), dta[x].end(), y) - dta[x].begin() + 1;
            for (; z < BIT[x].size(); z += z & - z)
                BIT[x][z] = min(BIT[x][z], w);
        }
    }
    int get(int x, int y) {
        ++x, ++y;
        int ans = 1e9;
        for (; x; x -= x & - x) {
            int z = upper_bound(dta[x].begin(), dta[x].end(), y) - dta[x].begin();
            for (; z; z -= z & - z)
                ans = min(ans, BIT[x][z]);
        }
        return ans;
    }
} T;

int main() {
    ios :: sync_with_stdio(0); cin.tie(0);
    vector <int> X, Y;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> A[i].x >> A[i].y >> A[i].z;
        A[i].x = - A[i].x, A[i].y = - A[i].y, A[i].z = - A[i].z;
    }
    for (int i = 0; i < n; ++i) X.push_back(A[i].x), Y.push_back(A[i].y);
    sort(A, A + n);
    sort(X.begin(), X.end());
    sort(Y.begin(), Y.end());
    for (int i = 0; i < n; ++i) {
        A[i].x = lower_bound(X.begin(), X.end(), A[i].x) - X.begin();
        A[i].y = lower_bound(Y.begin(), Y.end(), A[i].y) - Y.begin();
    }
    for (int i = 0; i < n; ++i) {
        int x = ST[0].get(1, 0, X.size() - 1, A[i].y);
        int y = ST[1].get(1, 0, Y.size() - 1, A[i].x);
        if (x != -1 && x < A[i].x) T.fake_add(x, A[i].y);
        if (y != -1 && y < A[i].y) T.fake_add(A[i].x, y);
        ST[0].add(1, 0, X.size() - 1, A[i].x, A[i].y);
        ST[1].add(1, 0, Y.size() - 1, A[i].y, A[i].x);
    }
    ST[0].reset(), ST[1].reset();
    T.build();
    int ans = 0;
    for (int i = 0; i < n;) {
        int j = i;
        while (j < n && A[i].z == A[j].z) ++j;
        for (int k = i; k < j; ++k) ans = min(ans, A[k].z + T.get(A[k].x, A[k].y));
        for (int k = i; k < j; ++k) {
            int x = ST[0].get(1, 0, X.size() - 1, A[k].y);
            int y = ST[1].get(1, 0, Y.size() - 1, A[k].x);
            if (x != -1 && x < A[k].x) T.add(x, A[k].y, X[x] + Y[A[k].y]);
            if (y != -1 && y < A[k].y) T.add(A[k].x, y, X[A[k].x] + Y[y]);
            ST[0].add(1, 0, X.size() - 1, A[k].x, A[k].y);
            ST[1].add(1, 0, Y.size() - 1, A[k].y, A[k].x);
        }
        i = j;
    }
    cout << - ans;
}

Compilation message

team.cpp:2: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    2 | #pragma GCC optimization ("O3")
      | 
team.cpp:3: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    3 | #pragma GCC optimization ("unroll-loops")
      | 
team.cpp: In member function 'void SegmentTree::add(int, int, int, int, int)':
team.cpp:37:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |         int mid = L + R >> 1;
      |                   ~~^~~
team.cpp: In member function 'int SegmentTree::get(int, int, int, int)':
team.cpp:45:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   45 |         int mid = L + R >> 1;
      |                   ~~^~~
team.cpp: In member function 'void RangeTree::add(int, int, int)':
team.cpp:67:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |             for (; z < BIT[x].size(); z += z & - z)
      |                    ~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 19116 KB Output is correct
2 Correct 14 ms 19028 KB Output is correct
3 Incorrect 15 ms 19120 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 19116 KB Output is correct
2 Correct 14 ms 19028 KB Output is correct
3 Incorrect 15 ms 19120 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 19112 KB Output is correct
2 Correct 18 ms 19112 KB Output is correct
3 Incorrect 15 ms 19124 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 19112 KB Output is correct
2 Correct 18 ms 19112 KB Output is correct
3 Incorrect 15 ms 19124 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 19112 KB Output is correct
2 Correct 18 ms 19112 KB Output is correct
3 Incorrect 15 ms 19124 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 19112 KB Output is correct
2 Correct 18 ms 19112 KB Output is correct
3 Incorrect 15 ms 19124 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 19116 KB Output is correct
2 Correct 14 ms 19028 KB Output is correct
3 Incorrect 15 ms 19120 KB Output isn't correct
4 Halted 0 ms 0 KB -