您的位置:首页 > 其它

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

2016-04-20 14:14 411 查看
map离散化会超时

答案会爆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
;

int pos
,n,m,L,R,a
,b
,has
;
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
,ans,mp
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: