根号分治 85
查看原帖
根号分治 85
539583
_huangweiliang_楼主2025/1/21 21:28
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 5e5 + 10;
int n, type, len, ans;
int a[N], bar[N], sum[N], vis[N];
struct BIT{
    int t[2 * N];
    int lowbit(int x){return x & (-x);}
    void add(int x, int val){
        x += n + 1;
        for(int i = x; i <= 2 * n + 1; i += lowbit(i))
            t[i] += val;
        return;
    }
    int sum(int x){
        x += n + 1;
        int res = 0;
        for(int i = x; i; i -= lowbit(i))
            res += t[i];
        return res;
    }
}T;
void solve1(int x){
    for(int i = 0; i <= 2 * n + 1; i++) sum[i] = T.t[i] = 0;
    T.add(0, 1);
    for(int i = 1; i <= n; i++){
        sum[i] = sum[i - 1] + (a[i] == x ? 1 : -1);
        ans += T.sum(sum[i] - 1);
        T.add(sum[i], 1);
    }
}
void solve2(){
    for(int i = 0; i < n; i++) sum[i] = 0;
    for(int i = 1; i <= n; i++){
        int maxn = 0;
        for(int j = i; j <= min(i + 2 * len - 1, n); j++){
            sum[a[j]] += vis[a[j]];
            maxn = max(sum[a[j]], maxn);
            if(2 * maxn > j - i + 1) ans++;
        }
        for(int j = i; j <= min(i + 2 * len - 1, n); j++)
            sum[a[j]] -= vis[a[j]];
    }
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> type;
    len = sqrt(n);
    for(int i = 1; i <= n; i++) cin >> a[i], bar[a[i]]++;
    for(int i = 0; i < n; i++){
        if(bar[i] >= len) solve1(i);
        else vis[i] = 1;
    }
    solve2();
    out << ans << endl;
    return 0;
}
2025/1/21 21:28
加载中...