话说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; }
全部评论
(1) 回帖