TLE了三个点,求助
查看原帖
TLE了三个点,求助
456675
a_sad_soul楼主2023/9/19 17:18
#include<bits/stdc++.h>
#define MAXN 500005
#define int long long
using namespace std;
int n,m;
int num[MAXN];
int tot[MAXN];
struct node{
    int l,r;
    int id;
}que[MAXN];
int colo[MAXN];
int ansup[MAXN];
int ansdown[MAXN];
bool cmp(node a,node b)
{
    if(colo[a.r]==colo[b.r])
        return a.r<b.r;
    return a.l<b.l;
}
int l,r;
int sum;
void add(int col)
{
    sum+=tot[col];
    tot[col]++;
}
void del(int col)
{
    tot[col]--;
    sum-=tot[col];
}
signed main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        scanf("%d",&num[i]);
    for(int i=1;i<=m;++i)
        scanf("%d%d",&que[i].l,&que[i].r),que[i].id=i;
    int block=500;
    for(int i=1;i<=n;++i)
        colo[i]=(i-1)/block+1;
    sort(que+1,que+1+m,cmp);
    for(int i=1,l=1,r=0;i<=m;++i)
    {
        if(que[i].l==que[i].r)
        {
            ansup[que[i].id]=0,ansdown[que[i].id]=1;
            continue;
        }
        while(l>que[i].l)add(num[--l]);
        while(r<que[i].r)add(num[++r]);
        while(l<que[i].l)del(num[l++]);
        while(r>que[i].r)del(num[r--]);
        ansup[que[i].id]=sum;
        ansdown[que[i].id]=(r-l+1)*(r-l)/2;
    }
    for(int i=1;i<=m;++i)
    {
        if(ansup[i]==0)
        {
            printf("0/1\n");
            continue;
        }
        int g=__gcd(ansup[i],ansdown[i]);

        printf("%d/%d\n",ansup[i]/g,ansdown[i]/g);
    }
    return 0;
}
2023/9/19 17:18
加载中...