답안 #392951

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
392951 2021-04-22T11:41:53 Z nvmdava Road Construction (JOI21_road_construction) C++17
65 / 100
10000 ms 77792 KB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 1000005;
const ll MOD = 1000000007;
const ll INF = 0x3f3f3f3f3f3f3f3f;

vector<pair<ll, int> > s, d;

ll a[N], b[N];
int loc[N], w[N], rev[N];

vector<int> seg[N];

void build(int id, int l, int r){
    if(l == r){
        seg[id].push_back({w[l]});
        return;
    }
    int m = (l + r) >> 1;
    build(id << 1, l, m);
    build(id << 1 | 1, m + 1, r);
    int i1 = 0;
    int i2 = 0;
    while(i1 < seg[id << 1].size() && i2 < seg[id << 1 | 1].size()){
        if(seg[id << 1][i1] < seg[id << 1 | 1][i2])
            seg[id].push_back(seg[id << 1][i1++]);
        else
            seg[id].push_back(seg[id << 1 | 1][i2++]);
    }
    while(i1 < seg[id << 1].size())
        seg[id].push_back(seg[id << 1][i1++]);
    while(i2 < seg[id << 1 | 1].size())
        seg[id].push_back(seg[id << 1 | 1][i2++]);
}
int n;
ll k;
vector<ll> ans;
int query(int id, int l, int r, int L, int R, int le, int ri, int x){
    if(l > R || r < L) return 0;
    if(L <= l && r <= R){
        le = lower_bound(seg[id].begin(), seg[id].end(), le) - seg[id].begin();
        ri = upper_bound(seg[id].begin(), seg[id].end(), ri) - seg[id].begin() - 1;
        if(x)
            for(int i = le; i <= ri; ++i)
                ans.push_back(max(abs(a[x] - a[seg[id][i]]), abs(b[rev[x]] - b[rev[seg[id][i]]])));
        return ri - le + 1;
    }
    int m = (l + r) >> 1;
    return query(id << 1, l, m, L, R, le, ri, x) + query(id << 1 | 1, m + 1, r, L, R, le, ri, x);
}

bool count(ll len, bool get){
    ll cnt = 0;
    for(int i = 1; i <= n; ++i){
        int l1 = lower_bound(a + 1, a + i, a[i] - len) - a;
        int r1 = i - 1;
        int l2 = lower_bound(b + 1, b + rev[i], b[rev[i]] - len) - b;
        int r2 = upper_bound(b + rev[i], b + n + 1, b[rev[i]] + len) - b - 1;
        if(l1 > r1 || l2 > r2) continue;
        cnt += query(1, 1, n, l2, r2, l1, r1, get * i);
        if(cnt >= k) return 0;
    }
    return 1;
}

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

    cin>>n>>k;

    for(int x, y, i = 1; i <= n; ++i){
        cin>>x>>y;
        s.push_back({x + y, i});
        d.push_back({x - y, i});
    }
    sort(s.begin(), s.end());
    sort(d.begin(), d.end());

    for(int i = 1; i <= n; ++i){
        a[i] = s[i - 1].ff;
        loc[s[i - 1].ss] = i;
    }
    for(int i = 1; i <= n; ++i){
        b[i] = d[i - 1].ff;
        w[i] = loc[d[i - 1].ss];
        rev[w[i]] = i;
    }
    build(1, 1, n);
    ll len = 0;
    for(int i = 32; i >= 0; --i)
        if(count((1LL << i) | len, 0))
            len |= 1LL << i;
    count(len, 1);
    sort(ans.begin(), ans.end());
    ++len;
    while(ans.size() < k)
        ans.push_back(len);
    for(auto& x : ans)
        cout<<x<<'\n';
}

Compilation message

road_construction.cpp: In function 'void build(int, int, int)':
road_construction.cpp:28:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     while(i1 < seg[id << 1].size() && i2 < seg[id << 1 | 1].size()){
      |           ~~~^~~~~~~~~~~~~~~~~~~~~
road_construction.cpp:28:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     while(i1 < seg[id << 1].size() && i2 < seg[id << 1 | 1].size()){
      |                                       ~~~^~~~~~~~~~~~~~~~~~~~~~~~~
road_construction.cpp:34:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |     while(i1 < seg[id << 1].size())
      |           ~~~^~~~~~~~~~~~~~~~~~~~~
road_construction.cpp:36:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     while(i2 < seg[id << 1 | 1].size())
      |           ~~~^~~~~~~~~~~~~~~~~~~~~~~~~
road_construction.cpp: In function 'int main()':
road_construction.cpp:102:22: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  102 |     while(ans.size() < k)
      |           ~~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 105 ms 28600 KB Output is correct
2 Correct 88 ms 28604 KB Output is correct
3 Correct 69 ms 28732 KB Output is correct
4 Correct 68 ms 28660 KB Output is correct
5 Correct 76 ms 27472 KB Output is correct
6 Correct 26 ms 24020 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1393 ms 77792 KB Output is correct
2 Correct 1401 ms 75492 KB Output is correct
3 Correct 64 ms 28600 KB Output is correct
4 Correct 778 ms 75280 KB Output is correct
5 Correct 1254 ms 75552 KB Output is correct
6 Correct 1365 ms 75692 KB Output is correct
7 Correct 1226 ms 74880 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1389 ms 73732 KB Output is correct
2 Correct 2286 ms 71236 KB Output is correct
3 Correct 15 ms 23756 KB Output is correct
4 Correct 348 ms 71404 KB Output is correct
5 Correct 5386 ms 71240 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1389 ms 73732 KB Output is correct
2 Correct 2286 ms 71236 KB Output is correct
3 Correct 15 ms 23756 KB Output is correct
4 Correct 348 ms 71404 KB Output is correct
5 Correct 5386 ms 71240 KB Output is correct
6 Correct 3837 ms 71300 KB Output is correct
7 Correct 3507 ms 71432 KB Output is correct
8 Correct 15 ms 23756 KB Output is correct
9 Correct 15 ms 23756 KB Output is correct
10 Correct 2414 ms 71212 KB Output is correct
11 Correct 318 ms 71316 KB Output is correct
12 Correct 5713 ms 71316 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 105 ms 28600 KB Output is correct
2 Correct 88 ms 28604 KB Output is correct
3 Correct 69 ms 28732 KB Output is correct
4 Correct 68 ms 28660 KB Output is correct
5 Correct 76 ms 27472 KB Output is correct
6 Correct 26 ms 24020 KB Output is correct
7 Correct 5000 ms 48696 KB Output is correct
8 Correct 5007 ms 49556 KB Output is correct
9 Correct 69 ms 28728 KB Output is correct
10 Correct 2305 ms 48804 KB Output is correct
11 Correct 1100 ms 48676 KB Output is correct
12 Correct 2987 ms 49564 KB Output is correct
13 Correct 1980 ms 48024 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 105 ms 28600 KB Output is correct
2 Correct 88 ms 28604 KB Output is correct
3 Correct 69 ms 28732 KB Output is correct
4 Correct 68 ms 28660 KB Output is correct
5 Correct 76 ms 27472 KB Output is correct
6 Correct 26 ms 24020 KB Output is correct
7 Correct 1393 ms 77792 KB Output is correct
8 Correct 1401 ms 75492 KB Output is correct
9 Correct 64 ms 28600 KB Output is correct
10 Correct 778 ms 75280 KB Output is correct
11 Correct 1254 ms 75552 KB Output is correct
12 Correct 1365 ms 75692 KB Output is correct
13 Correct 1226 ms 74880 KB Output is correct
14 Correct 1389 ms 73732 KB Output is correct
15 Correct 2286 ms 71236 KB Output is correct
16 Correct 15 ms 23756 KB Output is correct
17 Correct 348 ms 71404 KB Output is correct
18 Correct 5386 ms 71240 KB Output is correct
19 Correct 3837 ms 71300 KB Output is correct
20 Correct 3507 ms 71432 KB Output is correct
21 Correct 15 ms 23756 KB Output is correct
22 Correct 15 ms 23756 KB Output is correct
23 Correct 2414 ms 71212 KB Output is correct
24 Correct 318 ms 71316 KB Output is correct
25 Correct 5713 ms 71316 KB Output is correct
26 Correct 5000 ms 48696 KB Output is correct
27 Correct 5007 ms 49556 KB Output is correct
28 Correct 69 ms 28728 KB Output is correct
29 Correct 2305 ms 48804 KB Output is correct
30 Correct 1100 ms 48676 KB Output is correct
31 Correct 2987 ms 49564 KB Output is correct
32 Correct 1980 ms 48024 KB Output is correct
33 Execution timed out 10069 ms 71324 KB Time limit exceeded
34 Halted 0 ms 0 KB -