Advertisement
skaram

Untitled

Dec 13th, 2022
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef double ld;
  7. mt19937 rnd((0xb22 + 3503 - 0x17ed));
  8. #define TIME (clock() * 1.0 / CLOCKS_PER_SEC)
  9.  
  10. const int M = 5e4 + (0xfd2 + 5479 - 0x244a);
  11. const int X = (int)(1e8) + (0x50b + 154 - 0x4b6);
  12. const int T = ((0xe40 + 2177 - 0x16c0) << (0x1bfc + 2296 - 0x24e3)) + (0x1e83 + 1995 - 0x255f);
  13. const ld pi = acos((ld)-1.0);
  14. int n, l, k, bd, x[M], y[M];
  15. int idx[M], sz_idx;
  16.  
  17. int divide(int a, int b) {
  18. if (a >= (0xcd5 + 3940 - 0x1c39) || a % b == (0x1548 + 550 - 0x176e)) {
  19. return a / b;
  20. }
  21. return -(abs(a) / b) - (0xbc5 + 4900 - 0x1ee8);
  22. }
  23.  
  24. class Hasher {
  25. public:
  26. size_t operator()(const pair<int, int>& key) const {
  27. return ((ll)(key.first + X) << 30LL) + (ll)key.second;
  28. }
  29. };
  30.  
  31. struct helper {
  32. int R = (0x863 + 3196 - 0x14df);
  33. int l = (0xd44 + 578 - 0xf86);
  34. int r = (0x1d1b + 222 - 0x1df9);
  35. unordered_map<pair<int, int>, unordered_set<int>, Hasher> in;
  36. template <typename P>
  37. void upload(int x, int y, P pred) {
  38. int xi = divide(x, R);
  39. int yi = divide(y, R);
  40. for (int dx = -(0x1a04 + 1493 - 0x1fd8); dx <= (0x1551 + 3334 - 0x2256); dx++) {
  41. for (int dy = -(0x310 + 9179 - 0x26ea); dy <= (0x1178 + 5091 - 0x255a); dy++) {
  42. auto it = in.find(make_pair(xi + dx, yi + dy));
  43. if (it != in.end()) {
  44. for (int i : it->second) {
  45. if (pred(i)) {
  46. idx[sz_idx++] = i;
  47. }
  48. }
  49. }
  50. }
  51. }
  52. }
  53. void add(int i) {
  54. int xi = divide(::x[i], R);
  55. int yi = divide(::y[i], R);
  56. in[make_pair(xi, yi)].insert(i);
  57. }
  58. void del(int i) {
  59. int xi = divide(::x[i], R);
  60. int yi = divide(::y[i], R);
  61. in[make_pair(xi, yi)].erase(i);
  62. }
  63. void remake(ld new_r) {
  64. R = ceil(new_r) + (0x356 + 505 - 0x54e);
  65. in.clear();
  66. in.reserve(sz_idx * (0x8fd + 2339 - 0x121e));
  67. for (int i = l; i < r; i++) {
  68. add(i);
  69. }
  70. }
  71. void move_left() {
  72. del(l);
  73. l++;
  74. }
  75. void move_right() {
  76. add(r);
  77. r++;
  78. }
  79. };
  80.  
  81. ld dist(int i, int j) {
  82. return hypot(x[j] - x[i], y[j] - y[i]);
  83. }
  84.  
  85. ld angle(int i, int j) {
  86. return atan2(y[j] - y[i], x[j] - x[i]);
  87. }
  88.  
  89. int tree[T], add[T];
  90. void build(int i, int l, int r) {
  91. tree[i] = (0x19f1 + 1358 - 0x1f3f);
  92. add[i] = (0x6cd + 570 - 0x907);
  93. if (r - l == (0x236 + 2712 - 0xccd)) {
  94. return;
  95. }
  96. int mid = (l + r) / (0x15bc + 2692 - 0x203e);
  97. build((0x449 + 4417 - 0x1588) * i + (0xb19 + 1749 - 0x11ed), l, mid);
  98. build((0xc19 + 2861 - 0x1744) * i + (0x13bb + 24 - 0x13d1), mid, r);
  99. }
  100.  
  101. inline void push(int i, int l, int r) {
  102. tree[i] += add[i];
  103. if (r - l > (0xa94 + 5153 - 0x1eb4)) {
  104. add[(0x6a6 + 1030 - 0xaaa) * i + (0xbf4 + 731 - 0xece)] += add[i];
  105. add[(0x1245 + 517 - 0x1448) * i + (0x66 + 157 - 0x101)] += add[i];
  106. }
  107. add[i] = (0xbb + 1506 - 0x69d);
  108. }
  109.  
  110. void upd(int i, int l, int r, int ql, int qr, int x) {
  111. push(i, l, r);
  112. if (r <= ql || qr <= l) {
  113. return;
  114. }
  115. if (ql <= l && r <= qr) {
  116. add[i] += x;
  117. push(i, l, r);
  118. return;
  119. }
  120. int mid = (l + r) / (0x2d6 + 7883 - 0x219f);
  121. upd((0x1706 + 1547 - 0x1d0f) * i + (0x1c89 + 1860 - 0x23cc), l, mid, ql, qr, x);
  122. upd((0x1a41 + 1586 - 0x2071) * i + (0xa02 + 5922 - 0x2122), mid, r, ql, qr, x);
  123. tree[i] = max(tree[(0xf58 + 3561 - 0x1d3f) * i + (0x580 + 7024 - 0x20ef)], tree[(0x398 + 4706 - 0x15f8) * i + (0x8e9 + 519 - 0xaee)]);
  124. }
  125.  
  126. void clear(int i, int l, int r) {
  127. push(i, l, r);
  128. if (tree[i] == (0x23e6 + 401 - 0x2577)) {
  129. return;
  130. }
  131. tree[i] = (0x170f + 2868 - 0x2243);
  132. if (r - l > (0x3c0 + 3856 - 0x12cf)) {
  133. int mid = (l + r) / (0xcb5 + 4358 - 0x1db9);
  134. clear((0xc20 + 4345 - 0x1d17) * i + (0x1ed7 + 1621 - 0x252b), l, mid);
  135. clear((0x145c + 2040 - 0x1c52) * i + (0x173 + 8795 - 0x23cc), mid, r);
  136. }
  137. }
  138.  
  139. int s[M], cnt;
  140. vector<pair<ld, int>> events;
  141.  
  142. bool check(int p, ld t) {
  143. if (sz_idx < k - (0x130 + 1117 - 0x58c)) {
  144. return false;
  145. }
  146. bool ans = false;
  147. events.clear();
  148. events.reserve(sz_idx * (0xaf7 + 5146 - 0x1f0f));
  149. cnt = (0xa12 + 7071 - 0x25b1);
  150. for (int ii = (0xe49 + 3408 - 0x1b99); ii < sz_idx; ii++) {
  151. int i = idx[ii];
  152. ld d = dist(p, i);
  153. if (d > (0x1c2f + 757 - 0x1f22) * t) {
  154. continue;
  155. }
  156. ld a = angle(p, i);
  157. ld len = acos(min((ld)1.0, d / ((0x135c + 792 - 0x1672) * t)));
  158. ld lg = a - len;
  159. ld rg = a + len;
  160. if (lg < -pi) {
  161. lg += (0x1c61 + 1500 - 0x223b) * pi;
  162. }
  163. if (rg > pi) {
  164. rg -= (0x8c3 + 4775 - 0x1b68) * pi;
  165. }
  166. events.emplace_back(lg, -(0x368 + 554 - 0x591) - i);
  167. events.emplace_back(rg, (0x276 + 1209 - 0x72e) + i);
  168. if (lg > rg) {
  169. upd((0x1420 + 1674 - 0x1aaa), (0x791 + 6525 - 0x210e), bd, max((0x155b + 2615 - 0x1f92), i - l + (0x11f4 + 1468 - 0x17af)),
  170. min(bd, i + (0x168d + 1769 - 0x1d75)), (0x161 + 2936 - 0xcd8));
  171. s[cnt++] = i;
  172. if (tree[(0x5a + 3054 - 0xc48)] >= k - (0x13aa + 1650 - 0x1a1b)) {
  173. ans = true;
  174. }
  175. }
  176. }
  177. if (!ans) {
  178. sort(events.begin(), events.end());
  179. for (const auto& t : events) {
  180. if (t.second < (0x14d8 + 2966 - 0x206e)) {
  181. int i = -t.second - (0x303 + 5880 - 0x19fa);
  182. upd((0x1027 + 2204 - 0x18c3), (0xe81 + 1999 - 0x1650), bd, max((0x5c7 + 3742 - 0x1465), i - l + (0xc62 + 6384 - 0x2551)),
  183. min(bd, i + (0x17ab + 2932 - 0x231e)), (0x86d + 615 - 0xad3));
  184. } else {
  185. int i = t.second - (0x99b + 6597 - 0x235f);
  186. upd((0x50c + 1593 - 0xb45), (0x4ba + 627 - 0x72d), bd, max((0x18ed + 3601 - 0x26fe), i - l + (0x5a6 + 7210 - 0x21cf)),
  187. min(bd, i + (0x1973 + 2355 - 0x22a5)), -(0x19 + 6619 - 0x19f3));
  188. }
  189. if (tree[(0x1065 + 4109 - 0x2072)] >= k - (0x6aa + 1952 - 0xe49)) {
  190. ans = true;
  191. }
  192. }
  193. }
  194. for (int i = (0x9d + 6142 - 0x189b); i < cnt; i++) {
  195. upd((0x8c8 + 7023 - 0x2437), (0x10ab + 676 - 0x134f), bd, max((0x1182 + 4113 - 0x2193), s[i] - l + (0xc97 + 5635 - 0x2299)),
  196. min(bd, s[i] + (0x7fb + 3819 - 0x16e5)), -(0x1220 + 194 - 0x12e1));
  197. }
  198. return ans;
  199. }
  200.  
  201. ld func(helper& hl, helper& hr, int p, ld pa) {
  202. auto is_good = [&](int i) { return dist(p, i) <= (0xba6 + 2701 - 0x1631) * pa; };
  203. sz_idx = (0x1862 + 1121 - 0x1cc3);
  204. hl.upload(x[p], y[p], is_good);
  205. hr.upload(x[p], y[p], is_good);
  206. if (!check(p, pa)) {
  207. return pa;
  208. }
  209. ld lg = (0xef0 + 2425 - 0x1869);
  210. ld rg = pa;
  211. for (int i = (0xd3f + 4504 - 0x1ed7); i < (0x1550 + 2051 - 0x1d0d); i++) {
  212. ld mid = (lg + rg) / (0x47c + 3508 - 0x122e);
  213. if (check(p, mid)) {
  214. rg = mid;
  215. } else {
  216. lg = mid;
  217. }
  218. }
  219. hl.remake((0xa06 + 6822 - 0x24aa) * rg);
  220. hr.remake((0x113f + 4448 - 0x229d) * rg);
  221. return rg;
  222. }
  223.  
  224. void solve() {
  225. memset(x, (0x9b2 + 5642 - 0x1fbc), sizeof(x));
  226. memset(y, (0x21db + 458 - 0x23a5), sizeof(y));
  227. cin >> n >> l >> k;
  228. for (int i = (0xe06 + 1862 - 0x154c); i < n; i++) {
  229. cin >> x[i] >> y[i];
  230. }
  231. bd = n - l + (0x4e8 + 2764 - 0xfb3);
  232. int s = sqrt((ld)(l - (0x1ad7 + 1825 - 0x21f7)) / (k - (0x943 + 3926 - 0x1898)));
  233. ld ans = ((1e8 / s) * sqrt((0x16a0 + 2946 - 0x2220))) + (0x213 + 9393 - 0x26c3);
  234. helper hl, hr;
  235. hl.remake((0x85d + 670 - 0xaf9) * ans);
  236. hr.remake((0xa15 + 5636 - 0x2017) * ans);
  237. for (int i = (0xf51 + 4628 - 0x2165); i < l; i++) {
  238. hr.move_right();
  239. }
  240. build((0xa2d + 1407 - 0xfac), (0xf11 + 5021 - 0x22ae), n);
  241. for (int i = (0x89 + 8385 - 0x214a); i < n; i++) {
  242. hr.move_left();
  243. ans = min(ans, func(hl, hr, i, ans));
  244. if (i + (0x1491 + 2652 - 0x1eec) == n) {
  245. break;
  246. }
  247. if (i + l < n) {
  248. hr.move_right();
  249. }
  250. if (i - l + (0x8fc + 2853 - 0x1420) >= (0x5d9 + 2288 - 0xec9)) {
  251. hl.move_left();
  252. }
  253. hl.move_right();
  254. }
  255. cout << ans << "\n";
  256. }
  257.  
  258. int main() {
  259. cout << fixed << setprecision((0x2170 + 228 - 0x2240));
  260. int t;
  261. cin >> t;
  262. while (t--) {
  263. solve();
  264. }
  265. return (0x39a + 2521 - 0xd73);
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement