답안 #709447

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
709447 2023-03-13T15:29:25 Z cig32 Road Construction (JOI21_road_construction) C++17
0 / 100
10000 ms 29676 KB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5+2;
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;
}
int bit[MAXN];
void add(int x, int v) {
  for(;x<MAXN;x+=x&-x) bit[x] += v;
}
int sum(int x) {
  int s=0;
  for(;x;x-=x&-x) s += bit[x];
  return s;
}
void clear() {
  for(int i=0; i<MAXN; i++) bit[i] = 0;
}
long long count(vector<pair<int,int> >v, int d) {
  int n = v.size();
  set<int>disc;
  for(int i=0; i<n; i++) {
    disc.insert(v[i].first-v[i].second);
  }
  map<int,int>is;
  int it=1;
  for(int x: disc) {
    is[x] = it++;
  }
  long long ans=0;
  sort(v.begin(), v.end(), cmp1);
  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) {
      add(is[v[j].first-v[j].second], -1);
      j++;
    }
    auto it = disc.lower_bound(v[i].first-v[i].second+d+1);
    it--;
    int ub = is[*it];
    it = disc.lower_bound(v[i].first-v[i].second-d);
    int lb = is[*it];
    ans += sum(ub) - (lb == 0 ? 0 : sum(lb-1));
    add(is[v[i].first-v[i].second], 1);
  }
  return ans;
}

vector<int> all(vector<pair<int,int> >v, int d) {
  int n = v.size();
  set<int>disc;
  for(int i=0; i<n; i++) {
    disc.insert(v[i].first-v[i].second);
  }
  map<int,int>is;
  int it=1;
  for(int x: disc) {
    is[x] = it++;
  }
  int ans=0;
  sort(v.begin(), v.end(), cmp1);
  int j=0;
  vector<int> result;
  multiset<pair<int, int> > ms;
  for(int i=0; i<v.size(); i++) {
    while(j<i && (v[i].first+v[i].second)-(v[j].first+v[j].second) > d) {
      ms.erase(ms.lower_bound({v[j].first-v[j].second, v[j].first+v[j].second}));
      j++;
    }
    int ub = v[i].first-v[i].second+d, lb = v[i].first-v[i].second-d;
    if(ms.size()) {
      auto it = ms.lower_bound({lb, -4e9});
      while(it != ms.end() && (*it).first <= ub) {
        int x = abs((*it).first - (v[i].first - v[i].second));
        int y = abs((*it).second - (v[i].first + v[i].second));
        result.push_back(max(x, y));
        it++;
      }
    }
    ms.insert({v[i].first-v[i].second, v[i].first+v[i].second});
  }
  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;
    long long c = count(points, mid);
    if(c <= k) lb = mid;
    else rb = mid - 1;
  }
  vector<int> res = all(points, lb);
  sort(res.begin(), res.end());
  for(int x: res) cout << x << "\n";
  int finc = count(points, lb);
  if(finc < k) {
    rb = 4e9;
    lb++;
    while(lb < rb) {
      int mid = (lb + rb) >> 1;
      long long 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<int, int> >, int)':
road_construction.cpp:55:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp: In function 'std::vector<int> all(std::vector<std::pair<int, int> >, int)':
road_construction.cpp:87:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp:82:7: warning: unused variable 'ans' [-Wunused-variable]
   82 |   int ans=0;
      |       ^~~
road_construction.cpp: In function 'void solve(int)':
road_construction.cpp:115:20: warning: overflow in conversion from 'double' to 'int' changes value from '4.0e+9' to '2147483647' [-Woverflow]
  115 |   int lb = 0, rb = 4e9;
      |                    ^~~
road_construction.cpp:127:10: warning: overflow in conversion from 'double' to 'int' changes value from '4.0e+9' to '2147483647' [-Woverflow]
  127 |     rb = 4e9;
      |          ^~~
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10061 ms 2260 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10067 ms 29676 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10026 ms 29672 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10026 ms 29672 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10061 ms 2260 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10061 ms 2260 KB Time limit exceeded
2 Halted 0 ms 0 KB -