fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9.  
  10. const int N = 1e4 + 5;
  11.  
  12. int n;
  13. int c[N], t[N];
  14.  
  15. // Nhận xét: Với thời gian càng lớn thì khoảng cách đi được của mỗi cảnh sát càng lớn => càng có khả năng để sắp xếp được
  16. // => Có thể tìm kiếm nhị phân đáp án cho bài này
  17. // Giả sử thời điểm cần check là mid, thì với cảnh sát thứ i thì ta biết được đoạn [l(i), r(i)] mà họ có thể di chuyển đến.
  18. // Còn việc điều động mỗi cảnh sát thì ta có thể dùng ý tưởng tham lam như sau:
  19. // Tại nút thứ i, ta sẽ chọn cảnh sát có đầu mút r nhỏ nhất trong số các cảnh sát chưa được điều động mà có thể đến được nút này.
  20.  
  21. vector<int> R[N]; // R[l]: danh sách các đầu mút r của các cảnh sát có đầu mút di chuyển trái nhất l
  22.  
  23. bool check(int mid) {
  24. for (int i = 1; i <= n; i++) R[i].clear();
  25.  
  26. for (int i = 1; i <= n; i++) {
  27. int d = mid / t[i];
  28. int l = max(1, c[i] - d), r = min(n, c[i] + d);
  29. R[l].push_back(r);
  30. }
  31.  
  32. priority_queue<int, vector<int>, greater<int>> pq;
  33. for (int i = 1; i <= n; i++) {
  34. for (int r : R[i]) pq.push(r);
  35. while (!pq.empty() && pq.top() < i) pq.pop();
  36. if (pq.empty()) return false;
  37. pq.pop();
  38. }
  39.  
  40. return true;
  41. }
  42.  
  43. int main() {
  44. ios::sync_with_stdio(0); cin.tie(0);
  45. cin >> n;
  46. for (int i = 1; i <= n; i++) cin >> c[i] >> t[i];
  47.  
  48. int l = 0, r = 1e8, ans = -1;
  49. while (l <= r) {
  50. int mid = (l + r) >> 1;
  51.  
  52. if (check(mid)) {
  53. ans = mid;
  54. r = mid - 1;
  55. }
  56. else {
  57. l = mid + 1;
  58. }
  59. }
  60.  
  61. cout << ans << '\n';
  62. }
Success #stdin #stdout 0.01s 5292KB
stdin
5
5 10
3 10
3 20
2 9
2 15
stdout
10