題目大意:給定一個序列,多次詢問某個區間中所有數字出現次數的平方和
莫隊算法 不解釋
#include#include #include #include #include #define M 50500 using namespace std; struct query{ int l,r,pos; bool operator < (const query &Y) const; }q[M]; int n,m,k,block,a[M]; int l=1,r=0,cnt[M]; unsigned int now,ans[M]; bool query :: operator < (const query &Y) const { if( (l>>8) != (Y.l>>8) ) return l < Y.l; return r < Y.r; } inline void Update(int x,int y) { now-=cnt[x]*cnt[x]; cnt[x]+=y; now+=cnt[x]*cnt[x]; } int main() { int i; cin>>n>>m>>k; for(i=1;i<=n;i++) scanf("%d",&a[i]); block=static_cast (sqrt(n)+1e-7); for(i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].pos=i; sort(q+1,q+m+1); for(i=1;i<=m;i++) { while(r q[i].l) Update(a[--l],1); while(r>q[i].r) Update(a[r--],-1); while(l