Submission #833095

#TimeUsernameProblemLanguageResultExecution timeMemory
833095annyeong1Road Construction (JOI21_road_construction)C++14
100 / 100
2707 ms927192 KiB
#include<bits/stdc++.h>
using namespace std;
using i64 = int64_t;
using p64x = pair<i64, int>;

static constexpr int digits = 19;
static constexpr i64 INF = 1e10;

struct seg {
  seg *l,*r;
  p64x mn;
  seg() : l(),r(),mn(INF, 0){}
  seg(p64x min_) : l(),r(),mn(min_){}
  seg(seg *s, seg *e) : l(s),r(e),mn(min(s->mn,e->mn)){}
  static seg init(int d = digits){
    if(d==0)return {};--d;
    auto c=new seg(init(d));
    return {c,c};
  }
  p64x get_min(int s, int e, int ll = 0, int rr = 1 << digits) {
    if (e<=ll||rr<=s)return {INF, 0};
    if (s<=ll&&rr<=e)return mn;
    int m=(ll+rr)/2;
    return min(l->get_min(s,e,ll,m),r->get_min(s,e,m,rr));
  }
  seg update(int i, i64 v, int d = digits) {
    if (d==0)return{{v,i}}; --d;
    if (i >> d & 1)return {l, new seg(r->update(i, v, d))};
    else return {new seg(l->update(i, v, d)), r};
  }
};
struct cpr {
  vector<p64x> v;
  void add(p64x x){v.push_back(x);}
  void build(){sort(v.begin(),v.end());}
  int get(p64x x){return lower_bound(v.begin(),v.end(), x)-v.begin();}
};
struct town{i64 x,y;};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n,k; cin>>n>>k;
  vector<town>towns(n);
  for (auto &[x,y]:towns)cin >> x >> y;
  sort(towns.begin(), towns.end(),[&](const auto &l,const auto &r){return l.x<r.x;});
  cpr yc;
  for (int i=0;i<n;i++) {
    const auto &[x,y]=towns[i];
    yc.add({y, i});
  }
  yc.build();
  vector<seg> u(n + 1), d(n + 1);
  u[0]=seg::init();
  d[0]=seg::init();
  for(int i=0;i<n;i++) {
    const auto &[x,y]=towns[i];
    const int pos=yc.get({y,i});
    u[i + 1]=u[i].update(pos,-x + y);
    d[i + 1]=d[i].update(pos,-x - y);
  }
  priority_queue<p64x, vector<p64x>, greater<p64x>> que;
  const auto push = [&](const int i) {
    const auto &[x,y] = towns[i];
    const int pos = yc.get({y, i});
    const auto [um, ui] = u[i].get_min(pos, 1 << digits);
    const auto [dm, di] = d[i].get_min(0, pos);
    if (um == INF && dm == INF)return;
    if (um + x - y < dm + x + y) {
      que.push({um + x - y, i});
      u[i] = u[i].update(ui, INF);
    }else{
      que.push({dm + x + y, i});
      d[i] = d[i].update(di, INF);
    }
  };
  for (int i=0;i<n;i++)push(i);
  for (int i=0;i<k;i++) {
    const auto [c,j]=que.top();que.pop();
    cout<<c<<'\n'; push(j);
  } return 0;
}

Compilation message (stderr)

road_construction.cpp: In static member function 'static seg seg::init(int)':
road_construction.cpp:16:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   16 |     if(d==0)return {};--d;
      |     ^~
road_construction.cpp:16:23: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   16 |     if(d==0)return {};--d;
      |                       ^~
road_construction.cpp: In member function 'seg seg::update(int, i64, int)':
road_construction.cpp:27:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   27 |     if (d==0)return{{v,i}}; --d;
      |     ^~
road_construction.cpp:27:29: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   27 |     if (d==0)return{{v,i}}; --d;
      |                             ^~
road_construction.cpp: In function 'int main()':
road_construction.cpp:44:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   44 |   for (auto &[x,y]:towns)cin >> x >> y;
      |              ^
road_construction.cpp:48:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   48 |     const auto &[x,y]=towns[i];
      |                 ^
road_construction.cpp:56:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   56 |     const auto &[x,y]=towns[i];
      |                 ^
road_construction.cpp: In lambda function:
road_construction.cpp:63:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   63 |     const auto &[x,y] = towns[i];
      |                 ^
road_construction.cpp:65:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   65 |     const auto [um, ui] = u[i].get_min(pos, 1 << digits);
      |                ^
road_construction.cpp:66:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   66 |     const auto [dm, di] = d[i].get_min(0, pos);
      |                ^
road_construction.cpp: In function 'int main()':
road_construction.cpp:78:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   78 |     const auto [c,j]=que.top();que.pop();
      |                ^
#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...