Submission #1164476

#TimeUsernameProblemLanguageResultExecution timeMemory
1164476pb2008Izbori (COCI22_izbori)C++20
40 / 110
3095 ms3548 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize ("Ofast,unroll-loops") #pragma GCC target ("tune=native,avx2") const int N = 2e5 + 5, T = 1800; bool mark[N]; long long ans; int n, a[N], cnt[N], seg[N << 1]; void readInput(); void compress(); void pre(); void add(int i); int get(int i); long long calc1(int x); long long calc2(int x); void solve(); void writeOutput(); int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); readInput(); solve(); writeOutput(); return 0; } void readInput() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; } void compress() { vector<pair<int, int>> v; for (int i = 0; i < n; i++) v.push_back({a[i], i}); int tmp = 0; sort(v.begin(), v.end()); for (int i = 0; i < n - 1; i++) a[v[i].second] = tmp, tmp += (v[i].first != v[i + 1].first); a[v[n - 1].second] = tmp; } void pre() { compress(); for (int i = 0; i < n; i++) cnt[a[i]]++; } void add(int i) { for (; i <= (n << 1 | 1); i += (i & -i)) seg[i]++; } int get(int i) { int res = 0; for (; i; i -= (i & -i)) res += seg[i]; return res; } long long calc1(int x) { long long res = 0; for (int len = 1; len <= min(2 * cnt[x], n); len++) { int num = 0; for (int i = 0; i < n; i++) { if (i < len) num += (a[i] == x); else { res += ((len / 2) < num); num += (a[i] == x) - (a[i - len] == x); } } res += ((len / 2) < num); } return res; } long long calc2(int x) { int sum = 0; long long res = 0; memset(seg, 0, sizeof seg); for (int i = 0; i < n; i++) { sum += 1 - 2 * (a[i] != x); res += get(sum + n) + (0 < sum), add(sum + n + 1); } return res; } void solve() { pre(); for (int i = 0; i < n; i++) { if (mark[a[i]]) continue; mark[a[i]] = true; if (cnt[a[i]] < T) ans += calc1(a[i]); else ans += calc2(a[i]); } } void writeOutput() { cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...