Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #pragma comment(linker, "/STACK:10000000000")
- #include <bits/stdc++.h>
- #include <unordered_set>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef unsigned long long ull;
- #define all(x) x.begin(), x.end()
- #define rall(x) x.rbegin(), x.rend()
- #define endl '\n'
- #define int ll
- #define boostIO() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
- ll lca(ll a, ll b) { return a / gcd(a, b) * b; }
- int Mod = 998'244'353;
- struct Ans {
- int ded;
- int A;
- int start;
- };
- bool comp(Ans& l, Ans& r) {
- if (l.ded != r.ded) return l.ded < r.ded;
- if (l.A != r.A) return l.A < r.A;
- return l.start > r.start;
- }
- signed main() {
- boostIO();
- int T, N;
- cin >> T >> N;
- vector<pair<int, int>> v(N);
- for (auto& [l, r] : v) cin >> l >> r;
- vector<Ans> ans;
- for (int A = 1; A <= T; ++A) {
- int start = 0;
- int ded = 0;
- vector<int> count_s(2 * A);
- vector<int> count_f(2 * A);
- for (int i = 0; i < N; ++i) {
- count_s[v[i].first % (2 * A)]++;
- count_f[(v[i].second - 1) % (2 * A)]++;
- for (int x = v[i].first; x < v[i].second; ++x) {
- int pos = x % (2 * A);
- if (pos < A) ++ded;
- }
- }
- ans.push_back({ ded, A, 0 });
- int sum_f = 0, sum_s = 0;
- for (int i = 0; i < A; ++i) sum_f += count_f[i];
- for (int i = A; i < 2 * A; ++i) sum_s += count_s[i];
- for (int start = -2 * A + 1; start <= min(2 * A, T - 1); ++start) {
- int days = (T - start) / (2 * A) * A;
- days += min((T - start) % (2 * A), A);
- if (start < 0) {
- days -= (-start) / (2 * A) * A;
- days -= min((-start) % (2 * A), A);
- }
- if (2 * days < T) continue;
- //через левую границу как изменилось:
- //
- // Если в позиции start % 2A [0; A - 1] есть начало, то -- вышло
- //через правую границу как изменилось:
- //ded -= count_f[(start - 1 + 4*A) % (2 * A)];
- //ded += count_s[(start + A - 1+ 4*A) % (2 * A)];
- ded -= sum_f;
- ded += sum_s;
- ans.push_back({ ded, A, start });
- sum_s += count_s[(start + 4*A) % (2*A)];
- sum_s -= count_s[(A + start - 1 + 4*A) % (2*A)];
- sum_f += count_f[(A + start - 1 + 4*A) % (2*A)];
- sum_f -= count_f[(start + 4*A) % (2*A)];
- }
- }
- sort(all(ans),comp);
- cout << ans[0].ded << " " << ans[0].A << " " << ans[0].start;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement