30pts TLE求助
查看原帖
30pts TLE求助
617065
Ovine楼主2024/11/27 20:33

测评结果 TLE求调

#include<bits/stdc++.h>
using namespace std;
const int MAXN=50006;
int a[MAXN];
long long sum[MAXN];
int pos[MAXN];
int n,m;
struct Q
{
    int l,r,k;
}q[MAXN];

struct A
{
    long long fz,fm;
}ans[MAXN];

bool cmp(Q a,Q b)
{
    if(pos[a.l]==pos[b.l])
    {
        if(pos[a.l]&1==1)return a.r<b.r;
        else return a.r>b.r;
    }
    else return pos[a.l]<pos[b.l];
}

void ad(int x)
{
    sum[a[x]]++;
}

void op(int x)
{
    sum[a[x]]--;
}

long long gcd(long long a,long long b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}

long long c(long long a,long long b)
{
    long long Ans=1;
    for(int i=a;i>a-b;i--)Ans*=i;
    for(int i=1;i<=b;i++)Ans/=i;
    return Ans;
}

int main()
{
    cin>>n>>m;
    int Max=0;
    int t=sqrt(n);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        Max=max(Max,a[i]);
        pos[i]=(i-1)/t+1;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>q[i].l>>q[i].r;
        q[i].k=i;
    }   

    sort(q+1,q+1+m,cmp);
    int l=1;
    int r=0;
    for(int i=1;i<=m;i++)
    {
        while(q[i].l>l)op(l++);
        while(q[i].l<l)ad(--l);
        while(q[i].r>r)ad(++r);
        while(q[i].r<r)op(r--);
        long long Z=0;
        long long M=0;
        M=c(q[i].r-q[i].l+1,2);
        for(int i=1;i<=Max;i++)
        {
            if(sum[i]>=2)
            {
                Z+=c(sum[i],2);
            }
        }
        if(Z==0)
        {
            ans[q[i].k].fz=0;
            ans[q[i].k].fm=1;
        }
        else
        {
            long long p=gcd(M,Z);
            M/=p;
            Z/=p;
            ans[q[i].k].fm=M;
            ans[q[i].k].fz=Z;
        }
    }
    for(int i=1;i<=m;i++)
    {
        cout<<ans[i].fz<<'/'<<ans[i].fm<<endl;
    }
    return 0;
}
    
2024/11/27 20:33
加载中...