bzoj3781 小B的询问(莫队)
2017-07-20 16:53
330 查看
赤裸裸的莫队。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 50005
using namespace std;
int n,m,k,a
,f
,ans=0,block=0,ANS
;
inline int read(){
int 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;
}
struct query{
int l,r,block,id;
}q
;
inline bool cmp(query x,query y){
return x.block==y.block?x.r<y.r:x.block<y.block;
}
bool vis
;
void change(int x){
ans-=f[a[x]]*f[a[x]];
if(vis[x]) f[a[x]]--;
else f[a[x]]++;
vis[x]^=1;ans+=f[a[x]]*f[a[x]];
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();k=read();block=sqrt(n);
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=m;++i){
q[i].l=read();q[i].r=read();q[i].id=i;
q[i].block=(q[i].l-1)/block;
}
sort(q+1,q+m+1,cmp);int l=1,r=0;
for(int i=1;i<=m;++i){
for(;l<q[i].l;++l) change(l);
for(;l>q[i].l;--l) change(l-1);
for(;r<q[i].r;++r) change(r+1);
for(;r>q[i].r;--r) change(r);
ANS[q[i].id]=ans;
}
for(int i=1;i<=m;++i) printf("%d\n",ANS[i]);
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 50005
using namespace std;
int n,m,k,a
,f
,ans=0,block=0,ANS
;
inline int read(){
int 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;
}
struct query{
int l,r,block,id;
}q
;
inline bool cmp(query x,query y){
return x.block==y.block?x.r<y.r:x.block<y.block;
}
bool vis
;
void change(int x){
ans-=f[a[x]]*f[a[x]];
if(vis[x]) f[a[x]]--;
else f[a[x]]++;
vis[x]^=1;ans+=f[a[x]]*f[a[x]];
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();k=read();block=sqrt(n);
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=m;++i){
q[i].l=read();q[i].r=read();q[i].id=i;
q[i].block=(q[i].l-1)/block;
}
sort(q+1,q+m+1,cmp);int l=1,r=0;
for(int i=1;i<=m;++i){
for(;l<q[i].l;++l) change(l);
for(;l>q[i].l;--l) change(l-1);
for(;r<q[i].r;++r) change(r+1);
for(;r>q[i].r;--r) change(r);
ANS[q[i].id]=ans;
}
for(int i=1;i<=m;++i) printf("%d\n",ANS[i]);
return 0;
}
相关文章推荐
- BZOJ 3781: 小B的询问 [莫队]
- BZOJ_3781_小B的询问_莫队
- bzoj3781: 小B的询问(莫队)
- [bzoj3781]小B的询问_莫队
- 【bzoj3781】小B的询问 莫队
- 洛谷P2709 BZOJ 3781 小B的询问 (莫队)
- 【BZOJ】3781: 小B的询问(莫队算法)
- BZOJ - 3781 小B的询问 莫队算法
- bzoj3781 小B的询问 莫队
- bzoj 3781: 小B的询问(莫队)
- [BZOJ3781][小B的询问][莫队]
- BZOJ 3781 小B的询问 序列莫队算法
- 【BZOJ】3781 小B的询问 莫队
- bzoj 3781 小B的询问(莫队算法)
- [bzoj3781]小B的询问 智障莫队
- 【bzoj3781】小B的询问 莫队算法
- [BZOJ3781]小B的询问(莫队)
- bzoj 3781: 小B的询问 莫队算法+分块
- BZOJ3781 小B的询问 莫队
- BZOJ 3781: 小B的询问 | 莫队