题解 P2709 【小B的询问】

莫队日报


题目link


不要问我变量名是什么
这本来就是半个双倍经验题啊
xs


#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,col[50010],ans,L=1,R,s[50010],FK[50010],GG;
struct node
{
	ll l;//左 
	ll r;//右 
	ll place;//原位置 
	ll ANS;
}Q[50010];//question
ll update(ll x,ll fh)
{
	s[col[x]]+=fh;
	ans+=fh*(2*s[col[x]])-1;
}
int cmp(node a,node b)
{
	if(FK[a.l]!=FK[b.l])
		return a.l<b.l;
	return a.r<b.r;
}
int Cmp(node a,node b)
{
	return a.place<b.place;
}
int main()
{
	cin>>n>>m>>GG;
	for(int i=1;i<=n;i++)
	{
		cin>>col[i];
	}
	int fk=sqrt(n);
	for(int i=1;i<=m;i++)
	{
		cin>>Q[i].l>>Q[i].r;
		Q[i].place=i;
	}
	for(int i=1;i<=n;i++)
	{
		FK[i]=(i-1)/fk+1;
	}
	sort(Q+1,Q+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		for(;R<Q[i].r;R++)
		{
			update(R+1,1);
		}
        for(;R>Q[i].r;R--)
        {
        	update(R,-1);
        }
        for(;L<Q[i].l;L++)
        {
        	update(L,-1);
        }
        for(;L>Q[i].l;L--)
        {
        	update(L-1,1);
        }
        Q[i].ANS=ans;
	}
	sort(Q+1,Q+m+1,Cmp);
	for(int i=1;i<=m;i++)
	{
		cout<<Q[i].ANS<<endl;
	}
}
posted @ 2019-02-14 20:11  G_A_TS  阅读(448)  评论(0编辑  收藏  举报