From 466f124208c08ea9ed2472af73ad8293b401c41f Mon Sep 17 00:00:00 2001 From: Bruno Freitas Tissei <bft15@inf.ufpr.br> Date: Tue, 30 Apr 2019 17:46:54 -0300 Subject: [PATCH] Add D to ICPC_LA17 Signed-off-by: Bruno Freitas Tissei <bft15@inf.ufpr.br> --- algorithms/paradigm/kadane.cpp | 2 +- contests/ICPC_LA17/D.cpp | 71 ++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 contests/ICPC_LA17/D.cpp diff --git a/algorithms/paradigm/kadane.cpp b/algorithms/paradigm/kadane.cpp index e69765d..5ce946d 100644 --- a/algorithms/paradigm/kadane.cpp +++ b/algorithms/paradigm/kadane.cpp @@ -12,7 +12,7 @@ int kadane(const vector<int> &v, int &start, int &end) { start = end = 0; // Maximum so far (msf), Maximum ending here (meh). - int msf = -0x3f3f3f3f, meh = 0; + int msf = -inf, meh = 0; for (int i = 0; i < n; ++i) { meh += v[i]; diff --git a/contests/ICPC_LA17/D.cpp b/contests/ICPC_LA17/D.cpp new file mode 100644 index 0000000..c267d5c --- /dev/null +++ b/contests/ICPC_LA17/D.cpp @@ -0,0 +1,71 @@ +#include <bits/stdc++.h> + +#define EPS 1e-6 +#define MOD 1000000007 +#define inf 0x3f3f3f3f +#define llinf 0x3f3f3f3f3f3f3f3f + +#define fi first +#define se second +#define pb push_back +#define ende '\n' + +#define all(x) (x).begin(), (x).end() +#define rall(x) (x).rbegin(), (x).rend() +#define mset(x, y) memset(&x, (y), sizeof(x)) + +using namespace std; + +using ll = long long; +using ii = pair<int,int>; +using iii = pair<ii,int>; + +int main() { + ios::sync_with_stdio(0); + cin.tie(0); + + ll l, c, n; cin >> l >> c >> n; + set<iii> S; + S.insert(iii(ii(0, l - 1), 1)); + vector<ll> num(c+1, 0); + num[1] = l; + + for (int i = 0; i < n; ++i) { + ll p, x, a, b; cin >> p >> x >> a >> b; + int m1 = (a + num[p] * num[p]) % l; + int m2 = (a + (num[p] + b) * (num[p] + b)) % l; + + if (m1 > m2) swap(m1, m2); + auto curr = prev(S.lower_bound(iii(ii(m1 + 1, -inf), -inf))); + + vector<iii> ins, del; + ins.pb(iii(ii(m1, m2), x)); + for ( ; curr != S.end() && curr->fi.fi <= m2; ++curr) { + num[curr->se] -= curr->fi.se - curr->fi.fi + 1; + + // m1 intersects with section + if (m1 >= curr->fi.fi && m1 <= curr->fi.se) { + ins.pb(iii(ii(curr->fi.fi, m1 - 1), curr->se)); + num[curr->se] += (m1 - 1) - curr->fi.fi + 1; + } + + // m2 intersects with section + if (m2 >= curr->fi.fi && m2 <= curr->fi.se) { + ins.pb(iii(ii(m2 + 1, curr->fi.se), curr->se)); + num[curr->se] += curr->fi.se - (m2 + 1) + 1; + } + + num[x] += min(m2, curr->fi.se) - max(m1, curr->fi.fi) + 1; + del.pb(*curr); + } + + for (auto j : del) S.erase(j); + for (auto j : ins) S.insert(j); + } + + ll ans = 0; + for (int i = 1; i <= c; ++i) + ans = max(ans, num[i]); + cout << ans << ende; + return 0; +} -- GitLab