제출 #1186261

#제출 시각아이디문제언어결과실행 시간메모리
1186261dostsIzbori (COCI22_izbori)C++20
10 / 110
363 ms10972 KiB
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define all(x) x.begin(),x.end()
#define sp << " " << 
using namespace std;

const int N = 3e5+10,MOD = 998244353,inf = 2e12;

vi v; 

int idx(int x) {
    return upper_bound(all(v),x)-v.begin();
}
struct FT {
    vi bit;
    int n;

    FT(int nn) {
        n = nn;
        bit.assign(n+1,0);
    }

    void put(int p) {
        for (int i=p;i<=n;i+=i&-i) bit[i]++;
    }

    int get(int p) {
        int ans = 0;
        for (int i = p;i>0;i-=i&-i) ans+=bit[i];
        return ans;
    }

    void reset() {
        bit.assign(n+1,0);
    }
};
void solve() {
    int n;
    cin >> n;
    vi a(n+1);
    for (int i=1;i<=n;i++) cin >> a[i];
    const int B = 500;
    for (int i=1;i<=n;i++) v.push_back(a[i]);
    sort(all(v));
    v.erase(unique(all(v)),v.end());
    for (int i=1;i<=n;i++) a[i] = idx(a[i]);
    vi buck[n+1];
    for (int i=1;i<=n;i++) buck[a[i]].push_back(i);
    int ans = 0;
    vi cnt(n+1,0);
    for (int i=1;i<=n;i++) {
        int mx = 0,best = 0;
        for (int j = i;j<=n && j <= i+2*B-2;j++) {
            cnt[a[j]]++;
            if (cnt[a[j]] > mx) {
                mx = cnt[a[j]];
                best = a[j];
            }
            if (mx*2 > j-i+1 && buck[best].size() <= B) ans++;
        }
        for (int j=i;j<=n && j <= i+2*B-2;j++) {
            cnt[a[j]]--;
        }
    }
    FT ft(2*n);
    for (int i=1;i<=n;i++) {    
        if (buck[i].size() <= B) continue;
        //sqrt kere olcak
        int bal = 0;
        ft.put(bal+n);
        for (int j = 1;j<=n;j++) {
            ans+=ft.get(bal+n-1);
            ft.put(bal+n);
        }
        ft.reset();
    }
    cout << ans << endl;
}

signed main() {
    ios_base::sync_with_stdio(0);cin.tie(0);
    #ifdef Dodi
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) 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...