Advertisement
Georgiy031

Untitled

Mar 20th, 2021
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1.     #define _CRT_SECURE_NO_WARNINGS
  2.     #pragma comment(linker, "/STACK:10000000000")
  3.     #include <bits/stdc++.h>
  4.     #include <unordered_set>
  5.  
  6.     using namespace std;
  7.     typedef long long ll;
  8.     typedef long double ld;
  9.     typedef unsigned long long ull;
  10.     #define all(x) x.begin(), x.end()
  11.     #define rall(x) x.rbegin(), x.rend()
  12.     #define endl '\n'
  13.     #define int ll
  14.     #define boostIO() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  15.     ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
  16.     ll lca(ll a, ll b) { return a / gcd(a, b) * b; }
  17.     int Mod = 998'244'353;
  18.  
  19.     struct Ans {
  20.         int ded;
  21.         int A;
  22.         int start;
  23.     };
  24.  
  25.     bool comp(Ans& l, Ans& r) {
  26.         if (l.ded != r.ded) return l.ded < r.ded;
  27.         if (l.A != r.A) return l.A < r.A;
  28.         return l.start > r.start;
  29.     }
  30.  
  31.     signed main() {
  32.  
  33.         boostIO();
  34.         int T, N;
  35.         cin >> T >> N;
  36.         vector<pair<int, int>> v(N);
  37.         for (auto& [l, r] : v) cin >> l >> r;
  38.        
  39.         vector<Ans> ans;
  40.         for (int A = 1; A <= T; ++A) {
  41.             int start = 0;
  42.             int ded = 0;
  43.             vector<int> count_s(2 * A);
  44.             vector<int> count_f(2 * A);
  45.             for (int i = 0; i < N; ++i) {
  46.                 count_s[v[i].first % (2 * A)]++;
  47.                 count_f[(v[i].second  - 1) % (2 * A)]++;
  48.                 for (int x = v[i].first; x < v[i].second; ++x) {
  49.                     int pos = x % (2 * A);
  50.                     if (pos < A) ++ded;
  51.                 }
  52.             }
  53.             ans.push_back({ ded, A, 0 });
  54.  
  55.             int sum_f = 0, sum_s = 0;
  56.             for (int i = 0; i < A; ++i) sum_f += count_f[i];
  57.             for (int i = A; i < 2 * A; ++i) sum_s += count_s[i];
  58.  
  59.             for (int start = -2 * A + 1; start <= min(2 * A, T - 1); ++start) {
  60.                 int days = (T - start) / (2 * A) * A;
  61.                 days += min((T - start) % (2 * A), A);
  62.  
  63.                 if (start < 0) {
  64.                     days -= (-start) / (2 * A) * A;
  65.                     days -= min((-start) % (2 * A), A);
  66.                 }
  67.                 if (2 * days < T) continue;
  68.                 //через левую границу как изменилось:
  69.                 //
  70.                 // Если в позиции start % 2A [0; A - 1] есть начало, то -- вышло
  71.  
  72.                 //через правую границу как изменилось:
  73.                 //ded -= count_f[(start - 1 + 4*A) % (2 * A)];
  74.                 //ded += count_s[(start + A - 1+ 4*A) % (2 * A)];
  75.                 ded -= sum_f;
  76.                 ded += sum_s;
  77.                 ans.push_back({ ded, A, start });
  78.                 sum_s += count_s[(start + 4*A) % (2*A)];
  79.                 sum_s -= count_s[(A + start - 1 + 4*A) % (2*A)];
  80.  
  81.                 sum_f += count_f[(A + start - 1 + 4*A) % (2*A)];
  82.                 sum_f -= count_f[(start + 4*A) % (2*A)];
  83.             }
  84.         }
  85.         sort(all(ans),comp);
  86.         cout << ans[0].ded << " " << ans[0].A << " " << ans[0].start;
  87.  
  88.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement