B题?
话说B题写了莫队,如果是T了可以理解,但是为什么WA了qwq?
莫非我写了个假莫队?(大佬勿喷)
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0,f=1;char chr=getchar();
while(!isdigit(chr)){if(chr=='-')f=-1;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
return ans*f;
}const int M = 5e5+5;
struct P{int l,r,id;}q[M];
int n,a[M],pos[M],m,cnt[M],ans,Ans[M];
inline bool cmp(const P&x,const P&y){
return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
}
inline void Add(int x){
++cnt[a[x]];
if(cnt[a[x]]==1) ans+=a[x];
}
inline void Del(int x){
--cnt[a[x]];
if(cnt[a[x]]==0) ans-=a[x];
}
int main(){
n=read(),m=read();
int block=sqrt(n*2/3);
for(int i=1;i<=n;i++)a[i]=read(),pos[i]=i/block;
for(int i=1,x,y;i<=m;i++)x=read(),y=read(),q[i]=(P){x,y,i};
sort(q+1,q+m+1,cmp);
int L=1,R=0;
for(int i=1;i<=m;i++){
while(L<q[i].l) Del(L++);
while(L>q[i].l) Add(--L);
while(R<q[i].r) Add(++R);
while(R>q[i].r) Del(R--);
Ans[q[i].id]=ans;
}
for(int i=1;i<=m;i++){
printf("%d\n",Ans[i]);
}
return 0;
}

查看14道真题和解析