求调!!!!
查看原帖
求调!!!!
534872
tony0530楼主2025/1/29 13:02
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N = 5e4 + 10;

int n, m, len;
int a[N], id[N];
int cnt[N];
struct Query
{
    int l, r;
    int id;
}query[N];
struct answer
{
    int l, r;
}ans[N], now;

bool cmp(Query a, Query b)
{
    if(id[a.l] != id[b.l]) return id[a.l] < id[b.l];
    if(id[a.l] & 1 == 1) return a.r < b.r;
    return a.r > b.r;
}

void clac(int id)
{
    if(now.l == 0)
    {
        ans[id] = {0, 1};
        // now.l = now.r = 0;
        return;     
    }
    int d = gcd(now.l, now.r);
    ans[id] = {now.l / d, now.r / d};
    // now.l = now.r = 0;
}

void add(int i)
{
    cnt[i] ++ ;
    if(cnt[i] > 1) now.l += (cnt[i]) * (cnt[i] - 1) - (cnt[i] - 2) * (cnt[i] - 1);
}

void del(int i)
{
    cnt[i] -- ;
    if(cnt[i] > 0) now.l -= (cnt[i] + 1) * (cnt[i]) - (cnt[i] - 1) * (cnt[i]);
}

signed main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i ++ ) cin >> a[i];
    len = sqrt(n);
    for(int i = 1 ; i <= n ; i ++ ) id[i] = (i - 1) / len + 1;
    for(int i = 1 ; i <= m ; i ++ )
    {
        int l, r;
        cin >> l >> r;
        query[i] = {l, r, i};
    }
    sort(query + 1, query + 1 + m, cmp);
    for(int i = query[1].l ; i <= query[1].r ; i ++ ) add(a[i]);
    now.r = (query[1].r - query[1].l + 1) * (query[1].r - query[1].l);
    clac(query[1].id); 
    int l = query[1].l;
    int r = query[1].r;
    for(int i = 2 ; i <= m ; i ++ )
    {
        while(l < query[i].l) del(a[l ++ ]);
        while(l > query[i].l) add(a[ -- l]);
        while(r < query[i].r) add(a[ ++ r]);
        while(r > query[i].r) del(a[r -- ]);
        // cout << now.l << " " << now.r << endl; 
        now.r = (query[i].r - query[i].l + 1) * (query[i].r - query[i].l);
        clac(query[i].id);
    }
    
    for(int i = 1 ; i <= m ; i ++ ) cout << ans[i].l << "/" << ans[i].r << endl;
    return 0;
}
2025/1/29 13:02
加载中...