Submission #1195734

#TimeUsernameProblemLanguageResultExecution timeMemory
1195734byunjaewooRoad Construction (JOI21_road_construction)C++20
0 / 100
10137 ms1107412 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=250010, INF=4e9;
int n, k, x[N], y[N], v=INF+1;
array<int, 2> a[N];
vector<int> com, vec;

class seg {
public:
    void update(int k) {
        vec.push_back(k);
        for(int i=k; i<=n; i+=i&-i) tree[i]++;
    }
    int query(int k) {
        int ret=0;
        for(int i=k; i>=1; i-=i&-i) ret+=tree[i];
        return ret;
    }
    int query(int l, int r) {return query(r)-query(l-1);}
    void clear() {
        for(int k:vec) {
            for(int i=k; i<=n; i+=i&-i) tree[i]=0;
        }
        vec.clear();
    }
private:
    int tree[N];
    vector<int> vec;
}T;

int f(int t) {
    int ret=0;
    vector<array<int, 3>> p;
    for(int i=1; i<=n; i++) {
        p.push_back({a[i][0]+a[i][1], INF, lower_bound(com.begin(), com.end(), a[i][0]-a[i][1])-com.begin()+1});
        int l=lower_bound(com.begin(), com.end(), a[i][0]-a[i][1]-t)-com.begin()+1;
        int r=lower_bound(com.begin(), com.end(), a[i][0]-a[i][1]+t+1)-com.begin();
        p.push_back({a[i][0]+a[i][1]-t, l, -r}), p.push_back({a[i][0]+a[i][1]+t+1, l, r});
    }
    sort(p.begin(), p.end());
    for(auto [x, l, r]:p) {
        if(l==INF) T.update(r);
        else if(l>0) ret+=T.query(l, r);
        else ret-=T.query(-l, r);
    }
    T.clear();
    return (ret-n)/2;
}

void g(int s, int e, int t) {
    if(s>=e) return;
    int m=(s+e)/2, ret=0;
    priority_queue<int> pq;
    vector<array<int, 2>> vl, vr;
    for(int i=s; i<=m; i++) vl.push_back({y[i], x[i]+y[i]});
    for(int i=m+1; i<=e; i++) vr.push_back({y[i], x[i]+y[i]});
    sort(vl.begin(), vl.end()), sort(vr.begin(), vr.end());
    for(int i=0, j=0; i<vr.size(); i++) {
        while(j<vl.size() && vl[j][0]<=vr[i][0]) pq.push(vl[j][1]), j++;
        vector<int> tmp;
        while(!pq.empty() && pq.top()>=vr[i][1]-t) vec.push_back(vr[i][1]-pq.top()), tmp.push_back(pq.top()), pq.pop();
        for(int t:tmp) pq.push(t);
    }
    g(s, m, t), g(m+1, e, t);
}


void g2(int s, int e, int t) {
    if(s>=e) return;
    int m=(s+e)/2, ret=0;
    priority_queue<int> pq;
    vector<array<int, 2>> vl, vr;
    for(int i=s; i<=m; i++) vl.push_back({y[i], x[i]-y[i]});
    for(int i=m+1; i<=e; i++) vr.push_back({y[i], x[i]-y[i]});
    sort(vl.rbegin(), vl.rend()), sort(vr.rbegin(), vr.rend());
    for(int i=0, j=0; i<vr.size(); i++) {
        while(j<vl.size() && vl[j][0]>vr[i][0]) pq.push(vl[j][1]), j++;
        vector<int> tmp;
        while(!pq.empty() && pq.top()>=vr[i][1]-t) vec.push_back(vr[i][1]-pq.top()), tmp.push_back(pq.top()), pq.pop();
        for(int t:tmp) pq.push(t);
    }
    g2(s, m, t), g2(m+1, e, t);
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>k;
    for(int i=1; i<=n; i++) cin>>a[i][0]>>a[i][1], com.push_back(a[i][0]-a[i][1]);
    sort(com.begin(), com.end()), com.erase(unique(com.begin(), com.end()), com.end());
    sort(a+1, a+n+1);
    for(int i=1; i<=n; i++) x[i]=a[i][0], y[i]=a[i][1];
    for(int s=0, e=INF; s<=e; ) {
        int m=(s+e)/2;
        if(f(m)>=k) v=m, e=m-1;
        else s=m+1;
    }
    g(1, n, v-1), g2(1, n, v-1);
    while(vec.size()<k) vec.push_back(v);
    sort(vec.begin(), vec.end());
    for(int i=0; i<k; i++) cout<<vec[i]<<"\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...