제출 #696671

#제출 시각아이디문제언어결과실행 시간메모리
696671LeDaiKingIzbori (COCI22_izbori)C++14
25 / 110
284 ms17404 KiB
#include<bits/stdc++.h> using namespace std; #define NMOD 3 #define ll long long #define fi first #define se second #define pb push_back #define log 17 #define mask(i) (1ll << (i)) #define setp(x) setprecision(x) #define ALL(v) v.begin(), v.end() #define ck(n, i) (((n) >> (i)) & 1) #define getbit(x) __builtin_popcount(x) const double PI = acos(-1); const long long MOD = 1e9 + 7; const long long MOD1 = 998244353; const long long MODo = 123456789; const int oo = 1e9; const long long oo15 = 1e15, oo18 = 1e18+3, oooo = 922372036854775807; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ll sg[800005], sg1[800005], lazy[800005], lazy1[800005]; int a[200005]; vector<int> ldk[200005]; void dolazy(int id, int l, int mid, int r) { sg[id*2] += 1ll*(mid - l + 1)*lazy[id]; sg[id*2 + 1] += 1ll*(r - mid)*lazy[id]; lazy[id*2] += lazy[id]; lazy[id*2 + 1] += lazy[id]; lazy[id] = 0; } void dolazy1(int id, int l, int mid, int r) { sg1[id*2] += 1ll*(l + mid)*(mid - l + 1)/2*lazy1[id]; sg1[id*2 + 1] += 1ll*(mid + 1 + r)*(r - mid)/2*lazy1[id]; lazy1[id*2] += lazy1[id]; lazy1[id*2 + 1] += lazy1[id]; lazy1[id] = 0; } void upd(int id, int l, int r, int u, int v, int val) { if (l > v || r < u) return; if (u <= l && r <= v) { sg[id] += 1ll*(r - l + 1)*val; lazy[id] += val; return; } int mid = (l + r) >> 1; dolazy(id, l, mid, r); upd(id*2, l, mid, u, v, val); upd(id*2 + 1, mid + 1, r, u, v, val); sg[id] = sg[id*2] + sg[id*2+1]; } void upd1(int id, int l, int r, int u, int v, int val) { if (l > v || r < u) return; if (u <= l && r <= v) { sg1[id] += 1ll*(l + r)*(r - l + 1)/2*1ll*val; lazy1[id] += val; return; } int mid = (l + r) >> 1; dolazy1(id, l, mid, r); upd1(id*2, l, mid, u, v, val); upd1(id*2 + 1, mid + 1, r, u, v, val); sg1[id] = sg1[id*2] + sg1[id*2+1]; } ll get(int id, int l, int r, int u, int v) { if (l > v || r < u) return 0; if (u <= l && r <= v) { return sg[id]; } int mid = (l + r) >> 1; dolazy(id, l, mid, r); return get(id*2, l, mid, u, v) + get(id*2 + 1, mid + 1, r, u, v); } ll get1(int id, int l, int r, int u, int v) { if (l > v || r < u) return 0; if (u <= l && r <= v) { return sg1[id]; } int mid = (l + r) >> 1; dolazy1(id, l, mid, r); return get1(id*2, l, mid, u, v) + get1(id*2 + 1, mid + 1, r, u, v); } int n; void update(int l, int r, int val) { l += n + 1; r += n + 1; upd(1, 1, 2*n + 1, l, r, val); upd1(1, 1, 2*n + 1, l, r, val); } ll getval(int l, int r) { l += n + 1; r += n + 1; l = max(l, 1); if (l > r) return 0; if (l == r) { return get(1, 1, 2*n + 1, 1, l); } else { return 1ll*(r - l + 1)*get(1, 1, 2*n + 1, 1, l) - get1(1, 1, 2*n + 1, l + 1, r) + 1ll*(r + 1)*get(1, 1, 2*n + 1, l + 1, r); } } void solve() { cin >> n; vector<int> diff; for (int i = 1; i <= n; i++) { cin >> a[i]; diff.pb(a[i]); } sort(ALL(diff)); diff.resize(unique(ALL(diff)) - diff.begin()); for (int i = 1; i <= n; i++) { cin >> a[i]; a[i] = lower_bound(ALL(diff), a[i]) - diff.begin(); ldk[a[i]].pb(i); } ll ans = 0; for (int i = 0; i < (int)diff.size(); i++) { update(-ldk[i][0] + 1, 0, 1); ldk[i].pb(n + 1); int su = 0; for (int j = 0; j + 1 < (int)ldk[i].size(); j++) { su++; int r = 2*su - ldk[i][j], l = 2*su - ldk[i][j + 1] + 1; ans += getval(l - 1, r - 1); update(l, r, 1); } update(-ldk[i][0] + 1, 0, -1); su = 0; for (int j = 0; j + 1 < (int)ldk[i].size(); j++) { su++; int r = 2*su - ldk[i][j], l = 2*su - ldk[i][j + 1] + 1; update(l, r, -1); } } cout << ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int testcase = 1; //cin >> testcase; while(testcase--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...