BZOJ3781 小B的询问 莫队
2017-12-01 22:47
246 查看
小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。n,m,K<=50000.
显然莫队裸题,样例一遍过。。。
#include<bits/stdc++.h>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=50005;
int n,m,K,a
,tim,cnt
,curL,curR;
LL res,ans
;
struct Q{
int l,r,id;
friend bool operator <(Q a,Q b){
return a.l/tim==b.l/tim ? a.r<b.r : a.l<b.l;
}
}q
;
inline void add(int x)
{
int v=a[x];
res+=2*cnt[v]+1;cnt[v]++;
}
inline void remove(int x)
{
int v=a[x];
res-=2*cnt[v]-1;cnt[v]--;
}
void solve()
{
int l,r;
curL=1,curR=0;
for(int i=1;i<=n;i++)
{
l=q[i].l,r=q[i].r;
while(curL<l)
remove(curL++);
while(curL>l)
add(--curL);
while(curR>r)
remove(curR--);
while(curR<r)
add(++curR);
ans[q[i].id]=res;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
tim=sqrt(n);
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+m+1);
solve();
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}
显然莫队裸题,样例一遍过。。。
#include<bits/stdc++.h>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=50005;
int n,m,K,a
,tim,cnt
,curL,curR;
LL res,ans
;
struct Q{
int l,r,id;
friend bool operator <(Q a,Q b){
return a.l/tim==b.l/tim ? a.r<b.r : a.l<b.l;
}
}q
;
inline void add(int x)
{
int v=a[x];
res+=2*cnt[v]+1;cnt[v]++;
}
inline void remove(int x)
{
int v=a[x];
res-=2*cnt[v]-1;cnt[v]--;
}
void solve()
{
int l,r;
curL=1,curR=0;
for(int i=1;i<=n;i++)
{
l=q[i].l,r=q[i].r;
while(curL<l)
remove(curL++);
while(curL>l)
add(--curL);
while(curR>r)
remove(curR--);
while(curR<r)
add(++curR);
ans[q[i].id]=res;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
tim=sqrt(n);
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+m+1);
solve();
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}
相关文章推荐
- BZOJ 3781 小B的询问 莫队
- BZOJ 3781: 小B的询问 莫队算法
- 【BZOJ3781】小B的询问 莫队
- BZOJ 3781 小B的询问 序列莫队算法
- 【模板】BZOJ 3781: 小B的询问 莫队算法
- [bzoj] 3781 小B的询问 || 莫队
- BZOJ[3781]小B的询问 莫队
- 【BZOJ】3781: 小B的询问(莫队算法)
- BZOJ 3781: 小B的询问 [莫队]
- bzoj3781: 小B的询问(莫队)
- bzoj 3781 小B的询问(莫队算法)
- 【bzoj3781】小B的询问 莫队
- bzoj3781 小B的询问【莫队】
- [BZOJ3781]小B的询问(莫队)
- BZOJ3781 小B的询问 题解&代码 【附莫队总结】
- bzoj3781 小B的询问 莫队
- BZOJ - 3781 小B的询问 莫队算法
- Bzoj 3781: 小B的询问 莫队,分块,暴力
- BZOJ_3781_小B的询问_莫队
- bzoj 3781: 小B的询问(莫队)