Submission #1195702

#TimeUsernameProblemLanguageResultExecution timeMemory
1195702byunjaewooRoad Construction (JOI21_road_construction)C++20
5 / 100
10093 ms24068 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], v1=INF+1, v2=INF+1;
array<int, 2> a[N];
vector<int> vec1, vec2;

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 s, int e, int t) {
    if(s>=e) return 0;
    int m=(s+e)/2, ret=0;
    vector<int> com;
    vector<array<int, 2>> vl, vr;
    for(int i=s; i<=m; i++) com.push_back(x[i]+y[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(com.begin(), com.end()), com.erase(unique(com.begin(), com.end()), com.end());
    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]) T.update(lower_bound(com.begin(), com.end(), vl[j][1])-com.begin()+1), j++;
        ret+=T.query(lower_bound(com.begin(), com.end(), vr[i][1]-t)-com.begin()+1, com.size());
    }
    T.clear();
    return ret+f(s, m, t)+f(m+1, e, t);
}

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) vec1.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);
}


int f2(int s, int e, int t) {
    if(s>=e) return 0;
    int m=(s+e)/2, ret=0;
    vector<int> com;
    vector<array<int, 2>> vl, vr;
    for(int i=s; i<=m; i++) com.push_back(x[i]-y[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(com.begin(), com.end()), com.erase(unique(com.begin(), com.end()), com.end());
    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]) T.update(lower_bound(com.begin(), com.end(), vl[j][1])-com.begin()+1), j++;
        ret+=T.query(lower_bound(com.begin(), com.end(), vr[i][1]-t)-com.begin()+1, com.size());
    }
    T.clear();
    return ret+f2(s, m, t)+f2(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) vec2.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];
    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(1, n, m)>=k) v1=m, e=m-1;
        else s=m+1;
    }
    g(1, n, v1-1);
    if(v1<=INF) while(vec1.size()<k) vec1.push_back(v1);
    for(int s=0, e=INF; s<=e; ) {
        int m=(s+e)/2;
        if(f2(1, n, m)>=k) v2=m, e=m-1;
        else s=m+1;
    }
    g2(1, n, v2-1);
    if(v2<=INF) while(vec2.size()<k) vec2.push_back(v2);
    for(int i:vec2) vec1.push_back(i);
    sort(vec1.begin(), vec1.end());
    for(int i=0; i<k; i++) cout<<vec1[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...