Submission #707054

#TimeUsernameProblemLanguageResultExecution timeMemory
707054Chal1shkanIzbori (COCI22_izbori)C++14
110 / 110
1157 ms42592 KiB
# include <bits/stdc++.h> # define pb push_back # define ff first # define ss second # define nl "\n" # define sz(x) ((int)(x).size()) # define deb(x) cerr << #x << " = " << x << endl; # define pll pair <ll, ll> typedef long long ll; typedef unsigned long long ull; typedef long double ld; const ll maxn = 3e5 + 25; const ll inf = 2e9 + 0; const ll mod = 1e9 + 123; const ll dx[] = {-1, 1, 0, 0}; const ll dy[] = {0, 0, -1, 1}; using namespace std; ll n, a[maxn]; ll b[maxn]; vector <ll> pos[maxn]; struct node { ll sum1, sum2, upd, sz; } t[maxn * 4]; ll cnt (ll x) { return x * (x + 1) / 2; } void push (ll v, ll tl, ll tr) { if (t[v].upd && tl != tr) { ll tm = (tl + tr) >> 1; t[v * 2].sum1 += t[v].upd * (tm - tl + 1); t[v * 2 + 1].sum1 += t[v].upd * (tr - tm); t[v * 2].sum2 += t[v].upd * cnt(tm - tl + 1); t[v * 2 + 1].sum2 += t[v].upd * cnt(tr - tm); t[v * 2].upd += t[v].upd; t[v * 2 + 1].upd += t[v].upd; t[v].upd = 0; } } void update (ll l, ll r, ll x, ll v = 1, ll tl = 0, ll tr = n + n) { push(v, tl, tr); if (tr < l || r < tl) return; if (l <= tl && tr <= r) { t[v].sum1 += x * (tr - tl + 1); t[v].sum2 += x * cnt(tr - tl + 1); t[v].upd += x; return; } ll tm = (tl + tr) >> 1; update(l, r, x, v * 2, tl, tm); update(l, r, x, v * 2 + 1, tm + 1, tr); t[v].sum1 = t[v * 2].sum1 + t[v * 2 + 1].sum1; t[v].sum2 = t[v * 2].sum1 * (tr - tm) + t[v * 2].sum2 + t[v * 2 + 1].sum2; } node get (ll l, ll r, ll v = 1, ll tl = 0, ll tr = n + n) { push(v, tl, tr); if (tr < l || r < tl) return {0, 0, 0, 0}; if (l <= tl && tr <= r) return {t[v].sum1, t[v].sum2, t[v].upd, tr - tl + 1}; ll tm = (tl + tr) >> 1; node x = get(l, r, v * 2, tl, tm); node y = get(l, r, v * 2 + 1, tm + 1, tr); return {x.sum1 + y.sum1, x.sum1 * y.sz + x.sum2 + y.sum2, x.upd, x.sz + y.sz}; } void out (ll v = 1, ll tl = 0, ll tr = n + n) { push(v, tl, tr); cout << tl << ' ' << tr << ' ' << t[v].sum2 << nl; if (tl == tr) { return; } ll tm = (tl + tr) >> 1; out(v * 2, tl, tm); out(v * 2 + 1, tm + 1, tr); } ll query (ll l, ll r) { ll x = get(0, l - 1).sum1; ll y = get(l, r - 1).sum2; return x * (r - l + 1) + y; } void clear (ll v = 1, ll tl = 0, ll tr = n + n) { push(v, tl, tr); t[v].sum1 = t[v].sum2 = t[v].upd = 0; if (tl == tr) { return; } ll tm = (tl + tr) >> 1; clear(v * 2, tl, tm); clear(v * 2 + 1, tm + 1, tr); } void ma1n (/* SABR */) { cin >> n; for (ll i = 1; i <= n; ++i) { cin >> a[i]; b[i] = a[i]; } sort(b + 1, b + 1 + n); set <ll> st; for (ll i = 1; i <= n; ++i) { a[i] = lower_bound(b + 1, b + 1 + n, a[i]) - b; st.insert(a[i]); pos[a[i]].pb(i); } ll ans = 0; for (ll x : st) { pos[x].pb(0); pos[x].pb(n + 1); sort(pos[x].begin(), pos[x].end()); vector <pll> clr; ll cur = n; update(n, n, 1); clr.pb({n, n}); for (ll i = 1; i < sz(pos[x]); ++i) { ll siz = pos[x][i] - pos[x][i - 1] - 1; ans += query(cur - siz, cur - 1); update(cur - siz, cur - 1, 1); clr.pb({cur - siz, cur - 1}); if (pos[x][i] != n + 1) { ans += get(0, cur - siz).sum1; update(cur - siz + 1, cur - siz + 1, 1); clr.pb({cur - siz + 1, cur - siz + 1}); } cur = cur - siz + 1; } for (pll p : clr) { update(p.ff, p.ss, -1); } } cout << ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen("spainting.in", "r", stdin); // freopen("spainting.out", "w", stdout); int ttt = 1; // cin >> ttt; for (int test = 1; test <= ttt; ++test) { // cout << "Case " << test << ":" << ' '; ma1n(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...