bzoj3781: 小B的询问(莫队)
2018-01-08 13:47
267 查看
题目传送门
裸
解法:
裸莫队。
之前写的
代码实现:
裸
解法:
裸莫队。
之前写的
代码实现:
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<queue> using namespace std; typedef long long ll; struct node {int l,r,s;ll ans;}a[110000];int f[110000]; bool cmp(node n1,node n2) {if(f[n1.l]==f[n2.l])return n1.r<n2.r;return n1.l<n2.l;} int col[110000];ll ans; int sum[110000]; void update(int x,int t) {ans-=sum[col[x]]*sum[col[x]];sum[col[x]]+=t;ans+=sum[col[x]]*sum[col[x]];} ll gcd(ll a,ll b) {if(a==0)return b;return gcd(b%a,a);} bool cmp1(node n1,node n2) {return n1.s<n2.s;} int main() { int n,m,K;scanf("%d%d%d",&n,&m,&K); memset(sum,0,sizeof(0)); for(int i=1;i<=n;i++) {scanf("%d",&col[i]);f[i]=i/int(sqrt(n))+1;} for(int i=1;i<=m;i++) {scanf("%d%d",&a[i].l,&a[i].r);a[i].s=i;} sort(a+1,a+1+m,cmp); int l=1,r=0;ans=0; for(int i=1;i<=m;i++) { while(l<a[i].l)update(l,-1),l++; while(l>a[i].l)update(l-1,1),l--; while(r<a[i].r)update(r+1,1),r++; while(r>a[i].r)update(r,-1),r--; a[i].ans=ans; } sort(a+1,a+1+m,cmp1); for(int i=1;i<=m;i++)printf("%lld\n",a[i].ans); return 0; }
相关文章推荐
- 【BZOj 3781】小B的询问 莫队
- bzoj 3781: 小B的询问 莫队算法+分块
- 【BZOJ】3781: 小B的询问(莫队算法)
- BZOJ[3781]小B的询问 莫队
- [bzoj] 3781 小B的询问 || 莫队
- BZOJ 3781 小B的询问 莫队
- BZOJ 3781: 小B的询问 莫队算法
- bzoj 3781 小B的询问(莫队算法)
- 【模板】BZOJ 3781: 小B的询问 莫队算法
- BZOJ - 3781 小B的询问 莫队算法
- [BZOJ3781]小B的询问(莫队)
- BZOJ 3781 小B的询问 序列莫队算法
- BZOJ 3781: 小B的询问 [莫队]
- bzoj3781 小B的询问 莫队
- [bzoj3781]小B的询问 智障莫队
- 【bzoj3781】小B的询问 莫队
- bzoj3781 小B的询问(莫队)
- bzoj3781 小B的询问【莫队】
- 【bzoj3781】小B的询问 莫队算法
- 【BZOJ3781】小B的询问【莫队算法】