답안 #709432

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
709432 2023-03-13T14:45:15 Z cig32 Road Construction (JOI21_road_construction) C++17
5 / 100
10000 ms 292956 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace std;
#define int long long
using namespace __gnu_pbds;
typedef tree<pair<pair<int,int>,int>,null_type,less<pair<pair<int,int>,int> >,rb_tree_tag,tree_order_statistics_node_update>ordered_set;
const int MAXN = 250010;
const int MOD = 1e9 + 7;
mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int rnd(int x, int y) {
  int u = uniform_int_distribution<int>(x, y)(rng); return u;
}
int bm(int b, int p) {
  if(p==0) return 1 % MOD;
  int r = bm(b, p >> 1);
  if(p&1) return (((r*r) % MOD) * b) % MOD;
  return (r*r) % MOD;
}
int inv(int b) { 
  return bm(b, MOD-2);
}
int fastlog(int x) {
  return (x == 0 ? -1 : 64 - __builtin_clzll(x) - 1);
}
void printcase(int i) { cout << "Case #" << i << ": "; }
bool cmp1(pair<int,int> x, pair<int,int> y) {
  return x.first+x.second < y.first+y.second;
}
bool cmp2(pair<int,int> x, pair<int,int> y) {
  return x.first-x.second < y.first-y.second;
}
ordered_set bit[MAXN]; // 2D bit in regular matrices but only supporting single add/del
int id = 0;
map<pair<int, int>,vector<int> > mp;
void insert(int x, int y) {
  id++;
  mp[{y, x}].push_back(id);
  int fixx = x;
  for(;x<MAXN;x+=x&-x) bit[x].insert({{y, fixx}, id});
}
void erase(int x, int y) {
  int ono = mp[{y, x}].back(); mp[{y, x}].pop_back();
  int fixx = x;
  for(;x<MAXN;x+=x&-x) bit[x].erase({{y, fixx}, ono});
}
int query(int x, int y) {
  int sum = 0;
  for(;x;x-=x&-x) sum += bit[x].order_of_key({{y+1, 0}, 0});
  return sum;
}
vector<pair<int,int>> exhaust(int x, int y) {
  vector<pair<int, int> > g;
  for(;x;x-=x&-x) {
    if(bit[x].empty()) continue;
    int b = bit[x].order_of_key({{y+1, 0}, 0});
    auto it = bit[x].begin();
    for(int i=0; i<b; i++) {
      pair<int, int> get = (*bit[x].find_by_order(i)).first;
      swap(get.first, get.second);
      if(i+1 < b) it++;
      g.push_back(get);
    }
  }
  return g;
}
void clear() {
  for(int i=0; i<MAXN; i++) bit[i].clear();
  mp.clear();
  id = 0;
}
int count(vector<pair<int,int> >v, int d) {
  int n = v.size();
  set<int>xx,yy;
  for(int i=0; i<n; i++) {
    xx.insert(v[i].first);
    yy.insert(v[i].second);
  }
  map<int,int>isx,isy;
  int it=1;
  for(int x: xx) {
    isx[x] = it++;
  }
  it = 1;
  for(int y: yy) {
    isy[y] = it++;
  }
  vector<pair<int,int> > w = v;
  
  int ans=0;
  sort(v.begin(), v.end(), cmp1);
  
  for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];
  
  clear();
  int j=0;
  for(int i=0; i<v.size(); i++) {
    while(j<i && (v[i].first+v[i].second)-(v[j].first+v[j].second) > d) {
      erase(w[j].first, w[j].second);
      j++;
    }
    ans += query(w[i].first, w[i].second);
    insert(w[i].first, w[i].second);
  }
  sort(v.begin(), v.end(), cmp2);
  for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];

  clear();
  j=0;
  for(int i=0; i<v.size(); i++) {
    while(j<i && (v[i].first-v[i].second)-(v[j].first-v[j].second) > d) {
      erase(w[j].first, n+1-w[j].second);
      j++;
    }
    ans += query(w[i].first, n+1-w[i].second);
    insert(w[i].first, n+1-w[i].second);
  }
  vector<int> c[n+1];
  for(int i=1; i<=n; i++) c[i].clear();
  for(int i=0; i<v.size(); i++) c[w[i].first].push_back(v[i].second);
  for(int i=1; i<=n; i++) {
    sort(c[i].begin(), c[i].end());
    for(int j=0; j+1<c[i].size(); j++) {
      int lb = j+1, rb = c[i].size() - 1;
      while(lb < rb) {
        int mid = (lb + rb + 1) >> 1;
        if(c[i][mid] - c[i][j] <= d) lb = mid;
        else rb = mid - 1;
      }
      if(c[i][lb] - c[i][j] <= d) {
        ans -= (lb - j);
      }
    }
  }
  for(int i=1; i<=n; i++) c[i].clear();
  for(int i=0; i<v.size(); i++) c[w[i].second].push_back(v[i].first);
  for(int i=1; i<=n; i++) {
    sort(c[i].begin(), c[i].end());
    for(int j=0; j+1<c[i].size(); j++) {
      int lb = j+1, rb = c[i].size() - 1;
      while(lb < rb) {
        int mid = (lb + rb + 1) >> 1;
        if(c[i][mid] - c[i][j] <= d) lb = mid;
        else rb = mid - 1;
      }
      if(c[i][lb] - c[i][j] <= d) ans -= (lb - j);
    }
  }
  return ans;
}

vector<int> all(vector<pair<int,int> >v, int d) {
  vector<int> result;
  int n = v.size();
  set<int>xx,yy;
  for(int i=0; i<n; i++) {
    xx.insert(v[i].first);
    yy.insert(v[i].second);
  }
  map<int,int>isx,isy;
  int it=1;

  int realx[n+1], realy[n+1];
  for(int x: xx) {
    isx[x] = it;
    realx[it] = x;
    it++;
  }
  it = 1;
  for(int y: yy) {
    isy[y] = it;
    realy[it] = y;
    it++;
  }
  vector<pair<int,int> > w = v;
  int ans=0;
  sort(v.begin(), v.end(), cmp1);
  for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];
  clear();
  int j=0;
  for(int i=0; i<v.size(); i++) {
    while(j<i && (v[i].first+v[i].second)-(v[j].first+v[j].second) > d) {
      erase(w[j].first, w[j].second);
      j++;
    }
    vector<pair<int, int> > newadd = exhaust(w[i].first, w[i].second);
    int chek = query(w[i].first, w[i].second);
    for(pair<int, int> x: newadd) {
      result.push_back(v[i].first + v[i].second - realx[x.first] - realy[x.second]);
    }
    insert(w[i].first, w[i].second);
  }
  sort(v.begin(), v.end(), cmp2);
  for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];
  clear();
  j=0;
  for(int i=0; i<v.size(); i++) {
    while(j<i && (v[i].first-v[i].second)-(v[j].first-v[j].second) > d) {
      erase(w[j].first, n+1-w[j].second);
      j++;
    }
    vector<pair<int, int> > newadd = exhaust(w[i].first, n+1-w[i].second);
    for(pair<int, int> x: newadd) {
      result.push_back(v[i].first - v[i].second - realx[x.first] + realy[n+1-x.second]);
    }
    insert(w[i].first, n+1-w[i].second);
  }
  vector<int> c[n+1];
  for(int i=1; i<=n; i++) c[i].clear();
  for(int i=0; i<v.size(); i++) c[w[i].first].push_back(v[i].second);
  for(int i=1; i<=n; i++) {
    sort(c[i].begin(), c[i].end());
    for(int j=0; j+1<c[i].size(); j++) {
      int lb = j+1, rb = c[i].size() - 1;
      while(lb < rb) {
        int mid = (lb + rb + 1) >> 1;
        if(c[i][mid] - c[i][j] <= d) lb = mid;
        else rb = mid - 1;
      }
      if(c[i][lb] - c[i][j] <= d) {
        for(int k=j+1; k<=lb; k++) {
          result.push_back(-(c[i][k] - c[i][j]));
        }
      }
    }
  }
  for(int i=1; i<=n; i++) c[i].clear();
  for(int i=0; i<v.size(); i++) c[w[i].second].push_back(v[i].first);
  for(int i=1; i<=n; i++) {
    sort(c[i].begin(), c[i].end());
    for(int j=0; j+1<c[i].size(); j++) {
      int lb = j+1, rb = c[i].size() - 1;
      while(lb < rb) {
        int mid = (lb + rb + 1) >> 1;
        if(c[i][mid] - c[i][j] <= d) lb = mid;
        else rb = mid - 1;
      }
      if(c[i][lb] - c[i][j] <= d) {
        for(int k=j+1; k<=lb; k++) {
          result.push_back(-(c[i][k] - c[i][j]));
        }
      }
    }
  }
  return result;
}
void solve(int tc) {
  int n, k;
  cin >> n >> k;
  vector<pair<int,int> > points;
  for(int i=0; i<n; i++) {
    int x, y;
    cin >> x >> y;
    points.push_back({x, y});
  }
  int lb = 0, rb = 4e9;
  while(lb < rb) {
    int mid = (lb + rb + 1) >> 1;
    int c = count(points, mid);
    if(c <= k) lb = mid;
    else rb = mid - 1;
  }
  vector<int> res = all(points, lb);
  sort(res.begin(), res.end());
  vector<int> finres;
  map<int,int> cnt;
  for(int x: res) {
    if(x < 0) cnt[x]++;
    if(cnt[-x] > 0) {
      cnt[-x]--;
    }
    else if(x > 0) {
      finres.push_back(x);
    }
  }
  for(int x: finres) cout << x << "\n";
  int finc = count(points, lb);
  if(finc < k) {
    rb = 4e9;
    lb++;
    while(lb < rb) {
      int mid = (lb + rb) >> 1;
      int c = count(points, mid);
      if(c != finc) rb = mid;
      else lb = mid + 1;
    }
    for(int i=finc+1; i<=k; i++) cout << lb << "\n";
  }
}
int32_t main() {
  ios::sync_with_stdio(0); cin.tie(0);
  int t = 1; //cin >> t;
  for(int i=1; i<=t; i++) solve(i);
}

Compilation message

road_construction.cpp: In function 'long long int count(std::vector<std::pair<long long int, long long int> >, long long int)':
road_construction.cpp:94:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |   for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];
      |                ~^~~~~~~~~
road_construction.cpp:98:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp:107:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |   for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];
      |                ~^~~~~~~~~
road_construction.cpp:111:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp:121:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |   for(int i=0; i<v.size(); i++) c[w[i].first].push_back(v[i].second);
      |                ~^~~~~~~~~
road_construction.cpp:124:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |     for(int j=0; j+1<c[i].size(); j++) {
      |                  ~~~^~~~~~~~~~~~
road_construction.cpp:137:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  137 |   for(int i=0; i<v.size(); i++) c[w[i].second].push_back(v[i].first);
      |                ~^~~~~~~~~
road_construction.cpp:140:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |     for(int j=0; j+1<c[i].size(); j++) {
      |                  ~~~^~~~~~~~~~~~
road_construction.cpp: In function 'std::vector<long long int> all(std::vector<std::pair<long long int, long long int> >, long long int)':
road_construction.cpp:179:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  179 |   for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];
      |                ~^~~~~~~~~
road_construction.cpp:182:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  182 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp:188:9: warning: unused variable 'chek' [-Wunused-variable]
  188 |     int chek = query(w[i].first, w[i].second);
      |         ^~~~
road_construction.cpp:195:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  195 |   for(int i=0; i<w.size(); i++) w[i].first = isx[v[i].first], w[i].second = isy[v[i].second];
      |                ~^~~~~~~~~
road_construction.cpp:198:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  198 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp:211:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  211 |   for(int i=0; i<v.size(); i++) c[w[i].first].push_back(v[i].second);
      |                ~^~~~~~~~~
road_construction.cpp:214:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  214 |     for(int j=0; j+1<c[i].size(); j++) {
      |                  ~~~^~~~~~~~~~~~
road_construction.cpp:229:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  229 |   for(int i=0; i<v.size(); i++) c[w[i].second].push_back(v[i].first);
      |                ~^~~~~~~~~
road_construction.cpp:232:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  232 |     for(int j=0; j+1<c[i].size(); j++) {
      |                  ~~~^~~~~~~~~~~~
road_construction.cpp:177:7: warning: unused variable 'ans' [-Wunused-variable]
  177 |   int ans=0;
      |       ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 697 ms 50784 KB Output is correct
2 Correct 704 ms 50916 KB Output is correct
3 Correct 502 ms 50928 KB Output is correct
4 Correct 567 ms 53324 KB Output is correct
5 Correct 595 ms 36996 KB Output is correct
6 Correct 857 ms 29136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10059 ms 292956 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10067 ms 257200 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10067 ms 257200 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 697 ms 50784 KB Output is correct
2 Correct 704 ms 50916 KB Output is correct
3 Correct 502 ms 50928 KB Output is correct
4 Correct 567 ms 53324 KB Output is correct
5 Correct 595 ms 36996 KB Output is correct
6 Correct 857 ms 29136 KB Output is correct
7 Execution timed out 10102 ms 126620 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 697 ms 50784 KB Output is correct
2 Correct 704 ms 50916 KB Output is correct
3 Correct 502 ms 50928 KB Output is correct
4 Correct 567 ms 53324 KB Output is correct
5 Correct 595 ms 36996 KB Output is correct
6 Correct 857 ms 29136 KB Output is correct
7 Execution timed out 10059 ms 292956 KB Time limit exceeded
8 Halted 0 ms 0 KB -