Advertisement
a53

rufe

a53
Mar 14th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.27 KB | None | 0 0
  1. // autor Ciobanu Bogdan
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <memory>
  5. using namespace std;
  6.  
  7. long long n, m, x, y, k;
  8.  
  9. long long unwrap(long long a) {
  10. return a > 0LL ? a : 0LL;
  11. }
  12.  
  13. long long sum(long long from, long long to, long long i0) {
  14. if (from > to) return 0LL;
  15. return (to - from + 2 * i0) * (to - from + 1) / 2;
  16. }
  17.  
  18. long long count_corner(long long x, long long y, long long d) {
  19. return sum(unwrap(x + d - n), min(d, m - y), unwrap(n - x - d) + 1)
  20. + unwrap(m - y - d) * (n - x + 1);
  21. }
  22.  
  23. long long count_greater_equal(long long d) {
  24. if (d == 0) return n * m;
  25.  
  26. return count_corner(x, y, d) + count_corner(n - x + 1, m - y + 1, d)
  27. + count_corner(n - x + 1, y, d) + count_corner(x, m - y + 1, d)
  28. - unwrap(x - d) - unwrap(y - d) - unwrap(n - (x + d - 1)) - unwrap(m - (y + d - 1));
  29. }
  30.  
  31. int main() {
  32. unique_ptr<FILE, decltype(&fclose)> f(fopen("rufe.in", "r"), &fclose);
  33. fscanf(f.get(), "%lld%lld%lld%lld%lld", &n, &m, &x, &y, &k);
  34.  
  35. long long l = -1, r = n + m - 1;
  36. while (r - l > 1LL) {
  37. long long p = (l + r) / 2;
  38. ((count_greater_equal(p) < k) ? r : l) = p;
  39. }
  40.  
  41. f.reset(fopen("rufe.out", "w"));
  42. fprintf(f.get(), "%lld\n", l);
  43. return 0;
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement