답안 #724066

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
724066 2023-04-14T16:39:21 Z sysia Road Construction (JOI21_road_construction) C++17
65 / 100
10000 ms 62756 KB
//Sylwia Sapkowska
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;

void __print(int x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << "'" << x << "'";}
void __print(const char *x) {cerr << '"' << x << '"';}
void __print(const string &x) {cerr << '"' << x << '"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifdef LOCAL
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif

struct Tree {
	vector<int> s;
    Tree(){}
	Tree(int n) : s(n) {}
    void fit(int n){
        s.assign(n, 0);
    }
	void update(int pos) { // a[pos] += dif
		for (; pos < (int)s.size(); pos |= pos + 1) s[pos]++;
	}
	int query(int pos) { // sum of values in [0, pos)
		int res = 0;
		for (; pos > 0; pos &= pos - 1) res += s[pos-1];
		return res;
	}
	int query(int l, int r){
        return query(r+1) - query(l);
    }
};

#define int long long
typedef pair<int, int> T;
const int oo2 = 1e9+7;

void solve(){
    int n, k; cin >> n >> k;
    vector<T>p, p2(n);
    for (auto &[x, y]: p2) {
        cin >> x >> y;
        p.emplace_back(x+y, y-x);
    }
    vector<tuple<int, int, int8_t>>sweep;
    vector<int>s;
    Tree t;
    auto check = [&](int m){
        // debug(p);
        sweep.clear();
        s.clear();
        for (auto [x, y]: p){
            sweep.emplace_back(y-m, x, -1);
            sweep.emplace_back(y+m, x, +1);
            sweep.emplace_back(y, x, 0);
            s.emplace_back(x-m);
            s.emplace_back(x);
            s.emplace_back(x+m);
        }
        stable_sort(s.begin(), s.end());
        s.erase(unique(s.begin(), s.end()), s.end());
        int M = (int)s.size();
        t.fit(M+1);
        auto get = [&](int x)->int {
            return lower_bound(s.begin(), s.end(), x) - s.begin();
        };
        stable_sort(sweep.begin(), sweep.end());
        int all = -n;
        for (auto &[y, x, what]: sweep){
            if (what == 0){
                t.update(get(x));
            } else {
                all += what * t.query(get(x-m), get(x+m));
                if (all > 2 * k) return true;
            }
        }
        all/=2;
        debug(m, all);
        return (all >= k);
    };
    int l = 1, r = oo2 * 2;
    int d = oo2 * 2;
    while (r >= l){
        int m = (l+r)/2;
        if (check(m)){
            d = m;
            r = m-1;
        } else l = m+1;
    }
    d--;
    set<T>ss;
    vector<int>ret;
    sort(p2.begin(), p2.end());
    int j = 0;
    for (int i = 0; i<n; i++){
        auto [x, y] = p2[i];
        while (j < i && p2[i].first - p2[j].first > d) {
            ss.erase({p2[j].second, p2[j].first});
            j++;
        }
        for (auto it = ss.lower_bound({y-d, -oo2}); it != ss.upper_bound({y+d, x}); it++){
            ret.emplace_back(abs(x-it->second) + abs(y - it->first));
        }
        ss.insert({y, x});
    }
    while ((int)ret.size() < k) ret.emplace_back(d+1);
    sort(ret.begin(), ret.end());
    for (int i = 0; i<k; i++) cout << ret[i] << "\n";
}

int32_t main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    solve();

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 6176 KB Output is correct
2 Correct 80 ms 6172 KB Output is correct
3 Correct 57 ms 5124 KB Output is correct
4 Correct 59 ms 5144 KB Output is correct
5 Correct 59 ms 4052 KB Output is correct
6 Correct 14 ms 608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5052 ms 61656 KB Output is correct
2 Correct 4871 ms 61652 KB Output is correct
3 Correct 57 ms 5072 KB Output is correct
4 Correct 4778 ms 61548 KB Output is correct
5 Correct 5053 ms 61632 KB Output is correct
6 Correct 4871 ms 61720 KB Output is correct
7 Correct 4769 ms 61000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9072 ms 62604 KB Output is correct
2 Correct 9616 ms 62536 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 4823 ms 60368 KB Output is correct
5 Correct 5384 ms 62756 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9072 ms 62604 KB Output is correct
2 Correct 9616 ms 62536 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 4823 ms 60368 KB Output is correct
5 Correct 5384 ms 62756 KB Output is correct
6 Correct 9096 ms 62548 KB Output is correct
7 Correct 9573 ms 62580 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 9198 ms 62624 KB Output is correct
11 Correct 4738 ms 60352 KB Output is correct
12 Correct 5433 ms 62728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 6176 KB Output is correct
2 Correct 80 ms 6172 KB Output is correct
3 Correct 57 ms 5124 KB Output is correct
4 Correct 59 ms 5144 KB Output is correct
5 Correct 59 ms 4052 KB Output is correct
6 Correct 14 ms 608 KB Output is correct
7 Correct 4011 ms 27964 KB Output is correct
8 Correct 4014 ms 27960 KB Output is correct
9 Correct 57 ms 5144 KB Output is correct
10 Correct 3388 ms 27324 KB Output is correct
11 Correct 3181 ms 27196 KB Output is correct
12 Correct 2159 ms 27944 KB Output is correct
13 Correct 2368 ms 26528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 6176 KB Output is correct
2 Correct 80 ms 6172 KB Output is correct
3 Correct 57 ms 5124 KB Output is correct
4 Correct 59 ms 5144 KB Output is correct
5 Correct 59 ms 4052 KB Output is correct
6 Correct 14 ms 608 KB Output is correct
7 Correct 5052 ms 61656 KB Output is correct
8 Correct 4871 ms 61652 KB Output is correct
9 Correct 57 ms 5072 KB Output is correct
10 Correct 4778 ms 61548 KB Output is correct
11 Correct 5053 ms 61632 KB Output is correct
12 Correct 4871 ms 61720 KB Output is correct
13 Correct 4769 ms 61000 KB Output is correct
14 Correct 9072 ms 62604 KB Output is correct
15 Correct 9616 ms 62536 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 4823 ms 60368 KB Output is correct
18 Correct 5384 ms 62756 KB Output is correct
19 Correct 9096 ms 62548 KB Output is correct
20 Correct 9573 ms 62580 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
23 Correct 9198 ms 62624 KB Output is correct
24 Correct 4738 ms 60352 KB Output is correct
25 Correct 5433 ms 62728 KB Output is correct
26 Correct 4011 ms 27964 KB Output is correct
27 Correct 4014 ms 27960 KB Output is correct
28 Correct 57 ms 5144 KB Output is correct
29 Correct 3388 ms 27324 KB Output is correct
30 Correct 3181 ms 27196 KB Output is correct
31 Correct 2159 ms 27944 KB Output is correct
32 Correct 2368 ms 26528 KB Output is correct
33 Execution timed out 10063 ms 62500 KB Time limit exceeded
34 Halted 0 ms 0 KB -