求调60pts开了ll WAon3478
查看原帖
求调60pts开了ll WAon3478
947029
Chen_Three楼主2025/8/29 19:51
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 5e4 + 5;
ll n, m, sl, sr, a[N], num[N], len, ans;
struct node{
    ll l, r, ans, id;
}q[N];
bool cmp(node a, node b){
    if(a.l / len == b.l / len) return a.r / len < b.r / len;
    return a.l / len < b.l / len;
}
bool cmp2(node a, node b){
    return a.id < b.id;
}
int main(){
    cin >> n >> m;
    len = sqrt(n);
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= m; i++) cin >> q[i].l >> q[i].r, q[i].id = i;
    sort(q + 1, q + m + 1, cmp);
    for(int i = 1; i <= m; i++){
        while(sl < q[i].l) {
            if(sl){
                num[a[sl]]--;
                ans -= num[a[sl]];
                q[i].ans = ans;
            }
            sl++;
        }
        while(sl > q[i].l){
            sl--;
            ans += num[a[sl]];
            num[a[sl]]++;
            q[i].ans = ans;
        }
        while(sr < q[i].r){
            sr++;
            ans += num[a[sr]];
            num[a[sr]]++;
            q[i].ans = ans;
        }
        while(sr > q[i].r){
            num[a[sr]]--;
            ans -= num[a[sr]];
            q[i].ans = ans;
            sr--;
        }
    }
    sort(q + 1, q + m + 1, cmp2);
    for(int i = 1; i <= m; i++) {
        if(!(q[i].r - q[i].l)) cout << "0/1\n";
        else cout << q[i].ans / __gcd(q[i].ans, ((q[i].r - q[i].l + 1) * (q[i].r - q[i].l) >> 1)) << "/" << ((q[i].r - q[i].l + 1) * (q[i].r - q[i].l) >> 1) / __gcd(q[i].ans, ((q[i].r - q[i].l + 1) * (q[i].r - q[i].l) >> 1)) << "\n";
    }
    return 0;
}
2025/8/29 19:51
加载中...