全WA求调(玄关)
查看原帖
全WA求调(玄关)
1044226
yimao2013楼主2024/5/26 08:43
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+7;
const int SQ=300;
int n,m,c[N],ans[N],ans2[N];
array<int,3> e[N];
int gcd(int x,int y){
    if(x==0) return y;
    else return gcd(y%x,x);
}
int main(){
    cin >> n >> m;
    for(int i=1;i<=n;i++){
        cin >> c[i];
    }
    for(int i=1;i<=m;i++){
        int l,r;
        cin >> l >> r;
        e[i]={l,r,i};
        ans2[i]=(r-l)*(r-l+1)/2;
    }
    sort(e+1,e+m+1,[&](array<int,3> a,array<int,3> b){
        if(a[0]/SQ!=b[0]/SQ){
            return (bool)((a[0]/SQ)<(b[0]/SQ));
        }else{
            return (bool)(a[1]<b[1]);
        }
    });
    for(int i=1;i<n;i+=SQ){ 
        int sum=0,tot=i;
        int cnt[N];
        memset(cnt,0,sizeof(cnt));
        for(int j=i;j<=n;j++){
            sum+=cnt[c[j]];
            cnt[c[j]]++;
            while(1){
                int to2=tot;
                if(j==e[tot][1]){
                    int lasd=i;
                    for(;lasd!=e[tot][0];lasd++);
                    int sum2=sum;
                    for(int k=i;k<lasd;k++){
                        --cnt[c[k]];
                        sum2-=cnt[c[k]];
                    }
                    ans[e[tot][2]]=sum2;
                    tot++;
                    for(int k=i;k<lasd;k++){
                        ++cnt[c[k]];
                    }
                }
                if(to2==tot) break;
            }
        }
    }
    for(int i=1;i<=m;i++){
        if(ans[i]==0){
            cout << "0/1\n";
        }else{
            int d=gcd(ans[i],ans2[i]);
            cout << ans[i]/d << '/' << ans2[i]/d << '\n';
        }
    }
    return 0;
}
2024/5/26 08:43
加载中...