1 条题解

  • 0
    @ 2021-8-8 0:22:43

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
     
    const int N = 50005;
     
    int n,m,c[N];
    LL s[N],ans;
    struct node{
        int l,r,id;
        int pos;
        LL a,b;
    }p[N];
    LL gcd(LL x,LL y){return !y?x:gcd(y,x%y);}
    bool cmp(node a,node b){
        if(a.pos == b.pos )
            return a.r < b.r;
        return a.pos < b.pos;
    }
    bool cmp_id(node a,node b){
        return a.id < b.id;
    }
    void update(int p,int add){
        ans -= s[c[p]]*s[c[p]];
        s[c[p]] += add;
        ans += s[c[p]]*s[c[p]];
    }
    void solve(){
        for(int i=1,l=1,r=0;i<=m;i++){
            while(r < p[i].r){update(r+1,1);r++;}
            while(r > p[i].r){update(r,-1);r--;}
            while(l < p[i].l){update(l,-1);l++;}
            while(l > p[i].l){update(l-1,1);l--;}
            if(p[i].l == p[i].r){
                p[i].a = 0;
                p[i].b = 1;
                continue;
            }
            p[i].a = ans - (p[i].r - p[i].l + 1);
            p[i].b = (p[i].r - p[i].l + 1) * 1LL * (p[i].r - p[i].l);
            LL g = gcd(p[i].a,p[i].b);
            p[i].a /= g;
            p[i].b /= g;
        }
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&c[i]);
        int len = sqrt(n);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&p[i].l,&p[i].r);
            p[i].id = i;
            p[i].pos = p[i].l / len;
        }
        sort(p+1,p+m+1,cmp);
        solve();
        sort(p+1,p+m+1,cmp_id);
        for(int i=1;i<=m;i++)
            printf("%lld/%lld\n",p[i].a,p[i].b);
        return 0;
    }
    
    • 1

    信息

    ID
    162
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    5
    已通过
    5
    上传者