码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 3781 小B的询问

时间:2016-10-23 23:29:44      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:blog   include   name   pac   string   define   sort   i++   lock   

上一道题的双倍经验。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 50050
using namespace std;
long long n,m,k,col[maxn],cnt[maxn],ret=0,pos[maxn],block;
struct query
{
    long long l,r,id,ans;
}p[maxn];
bool cmp1(query x,query y)
{
    if (pos[x.l]!=pos[y.l]) return pos[x.l]<pos[y.l];
    return x.r<y.r;
}
bool cmp2(query x,query y)
{
    return x.id<y.id;
}
long long gcd(long long x,long long y)
{
    if (y==0) return x;
    return gcd(y,x%y);
}
void modify(long long x,long long val)
{
    ret-=cnt[col[x]]*cnt[col[x]];
    cnt[col[x]]+=val;
    ret+=cnt[col[x]]*cnt[col[x]];
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&k);
    for (long long i=1;i<=n;i++) scanf("%lld",&col[i]);
    for (long long i=1;i<=m;i++)
    {
        scanf("%lld%lld",&p[i].l,&p[i].r);
        p[i].id=i;
    }
    block=sqrt(n);
    for (long long i=1;i<=n;i++) pos[i]=(i-1)/block+1;
    sort(p+1,p+m+1,cmp1);
    long long l=1,r=0;
    for (long long i=1;i<=m;i++)
    {
        for (;r<p[i].r;r++) modify(r+1,1);
        for (;r>p[i].r;r--) modify(r,-1);
        for (;l<p[i].l;l++) modify(l,-1);
        for (;l>p[i].l;l--) modify(l-1,1);
        p[i].ans=ret;
    }
    sort(p+1,p+m+1,cmp2);
    for (long long i=1;i<=m;i++) printf("%lld\n",p[i].ans);
    return 0;
}

 

BZOJ 3781 小B的询问

标签:blog   include   name   pac   string   define   sort   i++   lock   

原文地址:http://www.cnblogs.com/ziliuziliu/p/5991269.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!