莫队TLE&RE0分求调
查看原帖
莫队TLE&RE0分求调
1772213
Ahler楼主2025/7/24 08:00
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
    int id,l,r,A,B;
}ans[50009];
int ar[50009];
int len;
int gcd(int a,int b){
    return (b==0?a:b%a);
}
bool cmp(node a,node b){
    if(a.l/len==b.l/len){
        return a.l<b.l;
    }
    return a.l/len<b.l/len;
}
bool cmp1(node a,node b){
    return a.id<b.id;
}
int sum[50009];//sum[i]表示数字i出现个数
int now=0;
void add(int i){//i是下标
    now-=sum[ar[i]]*(sum[ar[i]]-1);
    sum[ar[i]]++;
    now+=sum[ar[i]]*(sum[ar[i]]-1);
}
void del(int i){
    now-=sum[ar[i]]*(sum[ar[i]]-1);
    sum[ar[i]]--;
    now+=sum[ar[i]]*(sum[ar[i]]-1);
}
main(){
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n;i++){
        cin >> ar[i];
    }
    len=sqrt(n);
    for(int i=0;i<m;i++){
        cin >> ans[i].l >> ans[i].r;
        ans[i].id=i;
    }
    sort(ans,ans+m,cmp);
    int l=0,r=0;
    for(int i=0;i<m;i++){
        if(ans[i].l==ans[i].r){
            ans[i].A=0,ans[i].B=1;
            continue;
        }
        while(l<ans[i].l)del(l++);
        while(l>ans[i].l)add(l--);
        while(r<ans[i].r)add(r++);
        while(r>ans[i].r)del(r--);
        int temp=gcd((r-l+1)*(r-l+1),now);
        ans[i].A=now/temp;
        ans[i].B=(r-l+1)*(r-l+1)/temp;
    }
    sort(ans,ans+m,cmp1);
    for(int i=0;i<m;i++){
        cout << ans[i].A << "/" << ans[i].B;
        cout << endl;
    }
    return 0;
}
2025/7/24 08:00
加载中...