刚学,这个为啥跑900多ms
查看原帖
刚学,这个为啥跑900多ms
633466
LiaoYF1楼主2024/3/16 12:56
#include<bits/stdc++.h>
using namespace std;
int n,m,a[50005],b[50005],block,k;
long long res=0,ans[50005];
struct query{
    int l,r,id;
}c[50005];
void add(int x){
    res+=2*b[a[x]]+1;
    b[a[x]]++;
}
void del(int x){
    res-=2*b[a[x]]-1;
    b[a[x]]--;
}
bool cmp(query x,query y){
    return (x.id/block!=y.id/block?x.id/block<y.id/block:((x.id/block)%2==0?x.r<y.r:x.r>y.r));
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    block=sqrt(n);
    for(int i=1;i<=m;i++){
        cin>>c[i].l>>c[i].r;
        c[i].id=i;
    }
    sort(c+1,c+m+1,cmp);
    int l=1,r=0;
    for(int i=1;i<=m;i++){
        while(l>c[i].l)add(--l);
        while(r<c[i].r)add(++r);
        while(l<c[i].l)del(l++);
        while(r>c[i].r)del(r--);
        ans[c[i].id]=res;
    }
    for(int i=1;i<=m;i++){
        cout<<ans[i]<<"\n";
    }
    return 0;
}

谁看看有没有哪写错了

2024/3/16 12:56
加载中...