30pts ,求大佬帮调TLE原因
查看原帖
30pts ,求大佬帮调TLE原因
1229671
Greenqwq楼主2024/9/1 21:28
#include<bits/stdc++.h>

using namespace std;

#define int long long
#define ri register int

const int N = 1e5+10;

int n,m;
int w[N];
int len;
struct E{
    int l,r,id;
}q[N];
pair<int,int> ans[N];
map<int,int>S;
int res;

int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}

int get(int x){
    return x/len;
}

bool cmp(E& a,E& b){
    int i=get(a.l),j=get(b.l);
    if(i!=j)return i<j;
    return a.r<b.r;
}

void add(int x){
    res+=S[x];
    S[x]++;
}

void del(int x){
    S[x]--;
    res-=S[x];
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);

    cin>>n>>m;

    for(ri i=1;i<=n;i++)cin>>w[i];
    
    len=sqrt(n);
    
    for(ri i=1;i<=m;i++){
        cin>>q[i].l>>q[i].r;
        q[i].id=i;
    }

    sort(q+1,q+1+m,cmp);
    
    for(ri k=1,i=0,j=1;k<=m;k++){//j是左端点
        ri id=q[k].id,l=q[k].l,r=q[k].r;
        while(i<r)add(w[++i]);
        while(i>r)del(w[i--]);
        while(j<l)del(w[j++]);
        while(j>l)add(w[--j]);
        int div=(r-l+1)*(r-l)/2,fac=1;
        if(res)fac=gcd(res,div);
        else div=1;
        ans[id].first=res/fac,ans[id].second=div/fac;
    }

    for(ri i=1;i<=m;i++)cout<<ans[i].first<<'/'<<ans[i].second<<endl;

    return 0;
}
2024/9/1 21:28
加载中...