#include<bits/stdc++.h>
#define f first
#define int long long
#define s second
#define pii pair<int,int>
using namespace std;
const int N=3e5+5,mod=1e9+7,Inf=5e9+16;
int t,n,k,le_[50*N],ri_[50*N],pos[N][2],K,cur,root[N],ind[N],I[N];
pair<int,int> tree[50*N][2];
pair<int,int>p[N];
set<pair<int,int> > s;
vector<pair<int,int> > v;
vector<pair<int,pair<int,int> > > c;
void build(int u,int l,int r){
tree[u][0] = tree[u][1] = {Inf,l};
if(l==r) return;
le_[u]=++cur;
ri_[u]=++cur;
int mid=(l+r)/2;
build(le_[u],l,mid);
build(ri_[u],mid+1,r);
}
void update(int u,int ind,int l,int r,int val1,int val2){
if(l>ind || r<ind) return;
if(l==r) {
tree[cur][0]={val1,l};
tree[cur][1]={val2,l};
return;
}
int mid = (l+r)/2,x = cur;
le_[x]= le_[u];
ri_[x] = ri_[u];
if(ind<=mid) le_[x]=++cur;
else ri_[x]=++cur;
update(le_[u],ind,l,mid,val1,val2);
update(ri_[u],ind,mid+1,r,val1,val2);
tree[x][0]=min(tree[le_[x]][0],tree[ri_[x]][0]);
tree[x][1]=min(tree[le_[x]][1],tree[ri_[x]][1]);
// cout<<x<<"++"<<endl;
}
pair<int,int> getans(int u,int start,int end,int l,int r,int type){
if(l>end|| r<start) return {Inf,0};
if(start<=l && r<=end) {
return tree[u][type];}
int mid=(l+r)/2;
return min(getans(le_[u],start,end,l,mid,type) , getans(ri_[u],start,end,mid+1,r,type));
}
main(){
cin>>n>>k;
for(int i=1;i<=n;i++) {
cin >> p[i].f>>p[i].s;
}
sort(p+1,p+n+1);
for(int i=1;i<=n;i++) {
int diff = p[i].s;
v.push_back({diff,i});
}
v.push_back({-5e9,0});
sort(v.begin(),v.end());
for(int i=1;i<=n;i++) {
ind[v[i].s] = i; //cout<<v[i].s<<" ++ "<<i<<endl;
// pos[i] = v[i].s;
}
cur=1;
root[1] = cur;
build(1,1,n);
for(int i=1;i<=n;i++) {
int diff = 2*p[i].s;
int l = 1,r=n,id = n;
while(l<=r){
int mid=(l+r)/2;
if(v[mid].f>=diff) {
id = mid;
r=mid-1;
}else l=mid+1;
}
if(i-1)root[i] = ++cur;
I[i] = id;
// cout<<id<<endl; // - y[i] +y[j] < -y[j] + y[i] y[j] < y[i]
if(i-1)update(root[i-1],ind[i-1],1,n,-p[i-1].f-p[i-1].s,-p[i-1].f+p[i-1].s);
s.insert({min(getans(root[i],1,id,1,n,0).f +p[i].f+p[i].s,getans(root[i],id+1,n,1,n,1).f +p[i].f - p[i].s),i} );
}
while(k--){
pii c = *s.begin();
int i = c.s;
// int g1 = getans(root[c.s],1,I[c.s],1,n,0).f+p[i].f+p[i].s, g2 = getans(root[c.s],I[c.s]+1,n,1,n,1);
cout<<c.f<<endl;
s.erase(c);
int ind = 0;
if(getans(root[c.s],1,I[c.s],1,n,0).f+p[i].f+p[i].s < getans(root[c.s],I[c.s]+1,n,1,n,1).f +p[i].f-p[i].s ) ind =getans(root[c.s],1,I[c.s],1,n,0).s;
else ind = getans(root[c.s],I[c.s]+1,n,1,n,1).s;
int bef = root[c.s];
root[c.s] = ++cur;
update(bef,ind,1,n,Inf,Inf);
s.insert({min(getans(root[i],1,I[i],1,n,0).f +p[i].f+p[i].s,getans(root[i],I[i]+1,n,1,n,1).f +p[i].f - p[i].s),c.s});
//cout<<getans(root[i],1,I[i],1,n,0).f+p[i].f+p[i].s<<"++"<<getans(root[i],1,I[i],1,n,0).s<<endl;
}
}
Compilation message
road_construction.cpp:51:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
51 | main(){
| ^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1039 ms |
132612 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2435 ms |
499396 KB |
Output is correct |
2 |
Correct |
2430 ms |
502388 KB |
Output is correct |
3 |
Correct |
803 ms |
127052 KB |
Output is correct |
4 |
Correct |
1724 ms |
502288 KB |
Output is correct |
5 |
Correct |
1758 ms |
502428 KB |
Output is correct |
6 |
Correct |
1767 ms |
502520 KB |
Output is correct |
7 |
Correct |
1770 ms |
501852 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1325 ms |
275688 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1325 ms |
275688 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1039 ms |
132612 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1039 ms |
132612 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |