30pt TLE 卡常不过关?
查看原帖
30pt TLE 卡常不过关?
593798
cowhorse楼主2023/3/9 14:42

t了后7个点

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e4+10;
int n,m,c[N],pos[N];
LL s[N],ans;
struct Q{
    int l;int r;int id;
    LL a,b;
}ask[N];
bool cmp(Q a,Q b){
    if(pos[a.l]==pos[b.l])return a.r<b.r;
    return a.l<a.l;
}
bool cmp_id(Q a,Q b){
    return a.id<b.id;
}
void update(int p,int add){
    ans-=s[c[p]]*s[c[p]];
    s[c[p]]+=add;
    ans+=s[c[p]]*s[c[p]];
}
void solve(){
    int l=1,r=0;
    for(int i=1;i<=m;i++){
        for(;r<ask[i].r;r++){
            update(r+1,1);
        }
        for(;r>ask[i].r;r--){
            update(r,-1);
        }
        for(;l<ask[i].l;l++){
            update(l,-1);
        }
        for(;l>ask[i].l;l--){
            update(l-1,1);
        }
        if(ask[i].l==ask[i].r){
            ask[i].a=0;ask[i].b=1;
            continue;
        }
        ask[i].a=ans-(ask[i].r-ask[i].l+1);
        ask[i].b=(ask[i].r-ask[i].l+1)*(ask[i].r-ask[i].l);
        int g=__gcd(ask[i].a,ask[i].b);
        ask[i].a/=g;
        ask[i].b/=g;
    }
}
signed main() {
//freopen("x.in","r",stdin);
//freopen("x.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>c[i];
int bl=sqrt(n);
for(int i=1;i<=n;i++){
    pos[i]=(i-1)/bl+1;
}
for(int i=1;i<=m;i++){
    cin>>ask[i].l>>ask[i].r;
    ask[i].id=i;
}
sort(ask+1,ask+1+m,cmp);
solve();
sort(ask+1,ask+1+m,cmp_id);
for(int i=1;i<=m;i++) cout<<ask[i].a<<"/"<<ask[i].b<<'\n';

return 0;
}
2023/3/9 14:42
加载中...