样例没过求调
查看原帖
样例没过求调
742017
zhangxiao666楼主2024/1/3 20:29

rt 思路与第一篇题解一样

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 10;
int n, m, k;
int a[N];
struct stu
{
    int l, r;
    int id;
}ask[N];
int l, r, now;
int cnt[N], ansa[N], ansb[N];

int gcd(int x, int y)
{
    if(y == 0) return x;
    return gcd(y, x % y);
}

bool cmp(stu a1, stu a2)
{
    return a1.l / k ^ a2.l / k ? a1.l < a2. l : a1.r < a2.r;
}

void add(int x)
{
    now -= cnt[a[x]] * cnt[a[x]];
    cnt[a[x]]++;
    now += cnt[a[x]] * cnt[a[x]];
}

void del(int x)
{
    now -= cnt[a[x]] * cnt[a[x]];
    cnt[a[x]]--;
    now += cnt[a[x]] * cnt[a[x]];
}

signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    k = sqrt(n);
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= m; i++)
    {
        cin >> ask[i].l >> ask[i].r;
        ask[i].id = i;
    }
    sort(ask + 1, ask + m + 1, cmp);
    for(int i = 1; i <= m; i++)
    {
        while(l > ask[i].l) add(--l);
        while(r < ask[i].r) add(++r);
        while(l < ask[i].l) del(l++);
        while(r > ask[i].r) del(r--);
        if(ask[i].l == ask[i].r)
        {
            ansa[ask[i].id] = 0, ansb[ask[i].id] = 1;
            continue;
        }
        ansa[ask[i].id] = now - (ask[i].r - ask[i].l + 1);
        ansb[ask[i].id] = (ask[i].r - ask[i].l + 1) * (ask[i].r - ask[i].l);
        int x = gcd(ansa[ask[i].id], ansb[ask[i].id]);
        ansa[ask[i].id] /= x, ansb[ask[i].id] /= x;
    }
    for(int i = 1; i <= m; i++) cout << ansa[i] << "/" << ansb[i] << "\n"; 
    return 0;
}
2024/1/3 20:29
加载中...