답안 #387040

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
387040 2021-04-07T20:20:58 Z keko37 Road Construction (JOI21_road_construction) C++14
13 / 100
6777 ms 40988 KB
#include<bits/stdc++.h>

using namespace std;

typedef long long llint;
typedef pair <int, int> pi;

const int MAXN = 250005;
const int LOG = 18;

int n, k;
int x[MAXN], y[MAXN], sx[MAXN], sy[MAXN], fen[MAXN], ind[MAXN];
vector <llint> sazx, sazy, vx[MAXN], vy[MAXN], sol;

void ubaci (int x, int k) {
    for (x++; x < MAXN; x += x&-x) fen[x] += k;
}

int upit (int x) {
    int res = 0;
    for (x++; x > 0; x -= x&-x) res += fen[x];
    return res;
}

int kth (int br) {
    int pos = 0;
    for (int i = LOG - 1; i >= 0; i--) {
        if (pos + (1 << i) < MAXN && br > fen[pos + (1 << i)]) {
            pos += 1 << i;
            br -= fen[pos];
        }
    }
    return pos;
}

void sazmi () {
    for (int i = 1; i <= n; i++) {
        sazx.push_back(x[i]);
        sazy.push_back(y[i]);
    }
    sort(sazx.begin(), sazx.end());
    sort(sazy.begin(), sazy.end());
    sazx.erase(unique(sazx.begin(), sazx.end()), sazx.end());
    sazy.erase(unique(sazy.begin(), sazy.end()), sazy.end());
    for (int i = 1; i <= n; i++) {
        sx[i] = lower_bound(sazx.begin(), sazx.end(), x[i]) - sazx.begin();
        sy[i] = lower_bound(sazy.begin(), sazy.end(), y[i]) - sazy.begin();
        vx[sx[i]].push_back(i);
    }
    for (int i = 0; i < sazx.size(); i++) {
        for (auto j : vx[i]) {
            vy[sy[j]].push_back(j);
        }
    }
}

llint get_dist (int i, int j) {
    return max(abs(x[i] - x[j]), abs(y[i] - y[j]));
}

llint calc (llint len, bool flg) {
    llint res = 0;
    int p = 0;
    for (int i = 0; i < sazy.size(); i++) {
        ind[i] = 0;
    }
    for (int i = 0; i < sazx.size(); i++) {
        while (p < i && sazx[i] - sazx[p] > len) {
            for (auto j : vx[p]) {
                ubaci(sy[j], -1);
                ind[sy[j]]++;
            }
            p++;
        }
        for (auto j : vx[i]) {
            int lo = lower_bound(sazy.begin(), sazy.end(), y[j] - len) - sazy.begin();
            int hi = upper_bound(sazy.begin(), sazy.end(), y[j] + len) - sazy.begin() - 1;
            int br_lo = upit(lo - 1);
            int br_hi = upit(hi);
            res += br_hi - br_lo;
            if (flg == 1) {
                vector <int> tmp;
                for (int br = br_lo + 1; br <= br_hi; br++) {
                    tmp.push_back(kth(br));
                }
                tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
                for (auto h : tmp) {
                    for (int br = ind[h]; br < vy[h].size(); br++) {
                        int sus = vy[h][br];
                        if (x[sus] > x[j] || x[sus] == x[j] && y[sus] >= y[j]) break;
                        sol.push_back(get_dist(j, sus));
                    }
                }
            }
            ubaci(sy[j], 1);
        }
    }
    while (p < sazx.size()) {
        for (auto j : vx[p]) {
            ubaci(sy[j], -1);
        }
        p++;
    }
    return res;
}

llint get_len () {
    llint lo = 1, hi = 4e9 + 5;
    while (lo < hi) {
        llint mid = (lo + hi) / 2;
        if (calc(mid, 0) >= k) {
            hi = mid;
        } else {
            lo = mid + 1;
        }
    }
    return lo;
}

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    cin >> n >> k;
    //n = 250000; k = 250000;
    for (int i = 1; i <= n; i++) {
        cin >> x[i] >> y[i];
        //x[i] = uniform_int_distribution<int>(-1e9, 1e9)(rng);
        //y[i] = uniform_int_distribution<int>(-1e9, 1e9)(rng);
        int nx = x[i] - y[i];
        int ny = x[i] + y[i];
        x[i] = nx; y[i] = ny;
        //cout << "bla " << nx << " " << ny << endl;
    }
    sazmi();
    llint len = get_len();
    calc(len - 1, 1);
    sort(sol.begin(), sol.end());
    while (sol.size() < k) sol.push_back(len);
    for (auto x : sol) cout << x << '\n';
    return 0;
}

Compilation message

road_construction.cpp: In function 'void sazmi()':
road_construction.cpp:50:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for (int i = 0; i < sazx.size(); i++) {
      |                     ~~^~~~~~~~~~~~~
road_construction.cpp: In function 'llint calc(llint, bool)':
road_construction.cpp:64:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |     for (int i = 0; i < sazy.size(); i++) {
      |                     ~~^~~~~~~~~~~~~
road_construction.cpp:67:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     for (int i = 0; i < sazx.size(); i++) {
      |                     ~~^~~~~~~~~~~~~
road_construction.cpp:88:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |                     for (int br = ind[h]; br < vy[h].size(); br++) {
      |                                           ~~~^~~~~~~~~~~~~~
road_construction.cpp:90:61: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   90 |                         if (x[sus] > x[j] || x[sus] == x[j] && y[sus] >= y[j]) break;
      |                                              ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
road_construction.cpp:98:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |     while (p < sazx.size()) {
      |            ~~^~~~~~~~~~~~~
road_construction.cpp: In function 'int main()':
road_construction.cpp:139:23: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  139 |     while (sol.size() < k) sol.push_back(len);
      |            ~~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 16988 KB Output is correct
2 Correct 81 ms 16988 KB Output is correct
3 Incorrect 78 ms 17116 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3673 ms 40932 KB Output is correct
2 Correct 3649 ms 40916 KB Output is correct
3 Correct 72 ms 16860 KB Output is correct
4 Correct 3644 ms 40664 KB Output is correct
5 Correct 3751 ms 40988 KB Output is correct
6 Correct 3725 ms 40916 KB Output is correct
7 Correct 3741 ms 40664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6777 ms 37592 KB Output is correct
2 Correct 6713 ms 37592 KB Output is correct
3 Correct 8 ms 12140 KB Output is correct
4 Correct 3627 ms 37592 KB Output is correct
5 Correct 2172 ms 25540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6777 ms 37592 KB Output is correct
2 Correct 6713 ms 37592 KB Output is correct
3 Correct 8 ms 12140 KB Output is correct
4 Correct 3627 ms 37592 KB Output is correct
5 Correct 2172 ms 25540 KB Output is correct
6 Correct 6703 ms 37712 KB Output is correct
7 Correct 6639 ms 37712 KB Output is correct
8 Correct 8 ms 12140 KB Output is correct
9 Incorrect 9 ms 12140 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 16988 KB Output is correct
2 Correct 81 ms 16988 KB Output is correct
3 Incorrect 78 ms 17116 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 16988 KB Output is correct
2 Correct 81 ms 16988 KB Output is correct
3 Incorrect 78 ms 17116 KB Output isn't correct
4 Halted 0 ms 0 KB -