Submission #730689

#TimeUsernameProblemLanguageResultExecution timeMemory
730689vjudge1Izbori (COCI22_izbori)C++17
110 / 110
2775 ms6084 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int NM = 2e5, SZ = 450; int n, a[NM+5], cnt[NM+5]; bool type[NM+5]; vector <int> v; ll ans = 0; int pref[NM+5]; int bit[2*NM+5]; void compress(){ for (int i = 1; i <= n; i++) v.push_back(a[i]); sort(v.begin(), v.end()); for (int i = 1; i <= n; i++) a[i] = lower_bound(v.begin(), v.end(), a[i])-v.begin(); } void solve1(){ memset(cnt, 0, sizeof(cnt)); for (int i = 1; i <= n; i++){ int best = -1; for (int j = i; j < min(i+2*SZ, n+1); j++){ if (type[a[j]] == 0) cnt[a[j]]++; if (best == -1 || cnt[a[j]] > cnt[best]) best = a[j]; if (cnt[best]*2 > j-i+1){ ans++; } } for (int j = i; j < min(i+2*SZ, n+1); j++) if (type[a[j]] == 0) cnt[a[j]]--; } } void update(int p){ while (p <= 2*n+1){ bit[p]++; p += p & (-p); } } int get(int p){ int res = 0; while (p > 0){ res += bit[p]; p -= p & (-p); } return res; } void solve2(int s){ pref[0] = 0; for (int i = 1; i <= n; i++){ pref[i] = pref[i-1]; if (a[i] == s) pref[i]++; } memset(bit, 0, sizeof(bit)); update(n+1); for (int i = 1; i <= n; i++){ ans += get(2*pref[i]-i+n); update(2*pref[i]-i+n+1); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; compress(); for (int i = 1; i <= n; i++) cnt[a[i]]++; for (int i = 0; i < n; i++) if (cnt[i] > SZ) type[i] = 1; solve1(); for (int i = 0; i < n; i++) if (type[i]) solve2(i); cout << ans; 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...