0pts莫队求调

P2709 小B的询问

这是我的,可以参考一下 ```cpp #include<bits/stdc++.h> #include<cmath> #define ll long long using namespace std; ll val[100010],t[100010],sum[100010],same=0; ll kuai[100010]; struct node{ ll l,r,id,ans; }a[100010]; int n,q,k; ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } bool cmp(node x,node y){ if(kuai[x.l]==kuai[y.l]){ if(kuai[x.l]&1) return x.r>y.r; else return x.r<y.r; }else return kuai[x.l]<kuai[y.l]; } void jia(int i){ same=same-(t[val[i]]*t[val[i]])+((t[val[i]]+1)*(t[val[i]]+1)); t[val[i]]++; } void jian(int i){ same=same-(t[val[i]]*t[val[i]])+((t[val[i]]-1)*(t[val[i]]-1)); t[val[i]]--; } int main() { n=read(),q=read(),k=read(); int len=sqrt(n); for(int i=1;i<=n;i++){ val[i]=read(); kuai[i]=(i-1)/len+1; } for(int i=1;i<=q;i++){ a[i].l=read(); a[i].r=read(); a[i].id=i; } sort(a+1,a+q+1,cmp); for(int i=a[1].l;i<=a[1].r;i++){ same=same-(t[val[i]]*t[val[i]])+((t[val[i]]+1)*(t[val[i]]+1)); t[val[i]]++; } a[1].ans=same; int nowl=a[1].l,nowr=a[1].r; for(int i=2;i<=q;i++){ while(nowl<a[i].l){ jian(nowl); nowl++; } while(nowl>a[i].l){ jia(nowl-1); nowl--; } while(nowr<a[i].r){ jia(nowr+1); nowr++; } while(nowr>a[i].r){ jian(nowr); nowr--; } a[i].ans=same; } for(int i=1;i<=q;i++) sum[a[i].id]=a[i].ans; for(int i=1;i<=q;i++) cout<<sum[i]<<endl; return 0; } ```
by gcx12012 @ 2023-04-28 11:59:09


@[Orange1015](/user/565378) 为啥用 map 存,不是开得下吗
by seanlsy @ 2023-04-28 12:41:38


|