萌新刚学莫队1ms求助

P2709 小B的询问

@[wpy233](/user/214172) ```cpp #include <bits/stdc++.h> using namespace std; #define ll long long inline ll read() { char ch; ll x=0,f=1; for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(; isdigit(ch);ch=getchar()) x*=10,x+=(ch-'0'); return x*f; } int n,sq; int a[50005]; int Q,k; struct QAQ{ int l; int r; int id; }q[50005]; bool comp(QAQ x,QAQ y) { int xl=x.l/sq,yl=x.l/sq; if(xl!=yl) return xl<yl; return x.r<y.r; } ll cnt[50005],cur,l=1,r; ll ans[50005]; inline void add(int p) { cur+=(2*cnt[a[p]]+1); cnt[a[p]]++; } inline void del(int p) { cnt[a[p]]--; cur-=(2*cnt[a[p]]+1); } int main() { n=read(); Q=read(); k=read(); sq=pow(n, 0.667); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=Q;i++) { q[i].l=read(); q[i].r=read(); q[i].id=i; } sort(q+1,q+Q+1,comp); for(int i=1;i<=Q;i++) { while(l>q[i].l) add(--l); while(r<q[i].r) add(++r); while(l<q[i].l) del(l++); while(r>q[i].r) del(r--); ans[q[i].id]=cur; } for(int i=1;i<=Q;i++) printf("%lld\n",ans[i]); return 0; } ```
by juruoCms @ 2023-01-16 12:07:12


改了一下排序和块长
by CmsMartin @ 2023-01-16 12:08:05


@[juruoCms](/user/431577) 谢谢,已经过题了 Orz %%%
by wpy233 @ 2023-01-16 12:10:53


@[CmsMartin](/user/461426) 谢谢,学到了
by wpy233 @ 2023-01-16 12:11:49


|