nbut1457 Sona 【莫队算法+离散化】

来源:互联网 发布:自己录制电台软件 编辑:程序博客网 时间:2024/05/18 17:26
  1. map离散化会超时
  2. 答案会爆int,long long 输出控制为%I64d
#include<algorithm>#include<iostream>#include<string.h>#include<stdio.h>#include<math.h>#include<map>using namespace std;typedef long long ll;const int N=100000+10;struct node{    int l,r,id;}Q[N];int pos[N],n,m,L,R,a[N],b[N],has[N];int cmp(node a,node b){    if(pos[a.l]==pos[b.l])        return a.r<b.r;    return pos[a.l]<pos[b.l];}ll out[N],ans,mp[N];void add(int x){    int t=a[x];    ans=ans-(ll)mp[t]*mp[t]*mp[t];    mp[t]++;    ans=ans+(ll)mp[t]*mp[t]*mp[t];}void del(int x){    int t=a[x];    ans=ans-mp[t]*mp[t]*mp[t];    mp[t]--;    ans=ans+mp[t]*mp[t]*mp[t];}int main(){    while(~scanf("%d",&n))    {        int sz=(int)sqrt(1.0*n);        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            pos[i]=i/sz;            b[i]=a[i];        }        sort(b+1,b+n+1);        int t=1;        has[t]=b[1];        for(int i=2;i<=n;i++)        {            if(b[i]==b[i-1]) continue;            t++;            has[t]=b[i];        }        for(int i=1;i<=n;i++)        {            a[i]=lower_bound(has+1,has+t+1,a[i])-has+1;        }        scanf("%d",&m);        for(int i=1;i<=m;i++)        {            scanf("%d%d",&Q[i].l,&Q[i].r);            Q[i].id=i;        }        sort(Q+1,Q+1+m,cmp);       memset(mp,0,sizeof(mp));        L=1;        R=0;        ans=0;        for(int i=1;i<=m;i++)        {            while(L<Q[i].l)            {                del(L);                L++;            }            while(L>Q[i].l)            {                L--;                add(L);            }            while(R<Q[i].r)            {                R++;                add(R);            }            while(R>Q[i].r)            {                del(R);                R--;            }            out[Q[i].id]=ans;        }        for(int i=1;i<=m;i++)            printf("%I64d\n",out[i]);    }    return 0;}
0 0
原创粉丝点击