洛谷P2709 BZOJ 3781 小B的询问 (莫队)
2018-08-26 12:48
330 查看
题目描述
小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。输入输出格式
输入格式:第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。
输出格式:
M行,每行一个整数,其中第i行的整数表示第i个询问的答案。
输入输出样例
输入样例#1: 复制6 4 3 1 3 2 1 1 3 1 4 2 6 3 5 5 6
输出样例#1: 复制
6 9 5 2
说明
对于全部的数据,1<=N、M、K<=50000[b]题解[/b]
第二次了……打莫队没分块……T飞了……
据说这题模拟可过……
考虑莫队,只要把每一次更改前的次数减掉,再加上更改后的次数就行了
//minamoto #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define ll long long using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) char buf[1<<21],*p1=buf,*p2=buf; inline int read(){ #define num ch-'0' char ch;bool flag=0;int res; while(!isdigit(ch=getc())) (ch=='-')&&(flag=true); for(res=num;isdigit(ch=getc());res=res*10+num); (flag)&&(res=-res); #undef num return res; } char sr[1<<21],z[20];int C=-1,Z; inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;} inline void print(ll x){ if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x; while(z[++Z]=x%10+48,x/=10); while(sr[++C]=z[Z],--Z);sr[++C]='\n'; } const int N=50005; int cnt ,a ,rt ,l,r,n,m,k,s;ll ans ,ansn; struct node{ int l,r,id; }q ; inline bool cmp(node a,node b){ return rt[a.l]==rt[b.l]?rt[a.l]&1?a.r<b.r:a.r>b.r:a.l<b.l; } inline void add(int x){ ansn-=1ll*cnt[x]*cnt[x]; ++cnt[x]; ansn+=1ll*cnt[x]*cnt[x]; } inline void del(int x){ ansn-=1ll*cnt[x]*cnt[x]; --cnt[x]; ansn+=1ll*cnt[x]*cnt[x]; } int main(){ //freopen("testdata.in","r",stdin); n=read(),m=read(),k=read(),s=sqrt(n); for(int i=1;i<=n;++i) a[i]=read(),rt[i]=(i-1)/s+1; for(int i=1;i<=m;++i) q[i].l=read(),q[i].r=read(),q[i].id=i; sort(q+1,q+1+m,cmp); l=1,r=0; for(int i=1;i<=m;++i){ while(l>q[i].l) add(a[--l]); while(r<q[i].r) add(a[++r]); while(l<q[i].l) del(a[l++]); while(r>q[i].r) del(a[r--]); ans[q[i].id]=ansn; } for(int i=1;i<=m;++i) print(ans[i]); Ot(); return 0; }
相关文章推荐
- 【P2709】【BZOJ3781】 小B的询问 莫队算法
- 洛谷 P2709 BZOJ 3781 小B的询问
- 【BZOJ】3781 小B的询问 莫队
- BZOJ 3781 小B的询问 莫队
- 【BZOj 3781】小B的询问 莫队
- bzoj 3781: 小B的询问(莫队)
- BZOJ_3781_小B的询问_莫队
- BZOJ 3781: 小B的询问 莫队算法
- 洛谷 P2709 小B的询问 莫队算法
- [bzoj] 3781 小B的询问 || 莫队
- bzoj3781 小B的询问(莫队)
- BZOJ[3781]小B的询问 莫队
- BZOJ - 3781 小B的询问 莫队算法
- BZOJ 3781: 小B的询问 [莫队]
- 【BZOJ3781】小B的询问 莫队
- bzoj3781 小B的询问【莫队】
- 【bzoj3781】小B的询问 莫队
- bzoj3781 小B的询问 莫队
- [bzoj3781]小B的询问_莫队
- BZOJ3781 小B的询问 题解&代码 【附莫队总结】