萌新求助莫队0分
查看原帖
萌新求助莫队0分
516468
_Give_up_楼主2023/1/29 16:14
#include<bits/stdc++.h>
#define N 50010

using namespace std;

int read()
{
    int x = 0,f = 1;
    char c = getchar();
    while(c<'0' || c>'9')
	{
        if(c=='-') f = -1;
        c = getchar();
    }
    while(c>='0' && c<='9')
	{
        x = (x<<3)+(x<<1)+(c^48);
        c = getchar();
    }
    return x*f;
}

struct rec
{
	int l,r,id;
};

struct node
{
	int x,y;
	void solve()
	{
		if (x==0) y=1;
		else
		{
			int k = __gcd(x,y);
			x /= k;
			y /= k;
		}
	}
};

rec q[N];
node ans[N];
int a[N],b[N],curL=1,curR,ans_now,cnt;

bool cmp(rec a,rec b)
{
	return a.l/cnt==b.l/cnt ? a.r<b.r : a.l<b.l; 
}

void dele(int x)
{
	ans_now -= (b[a[x]]-1);
	b[a[x]]--;
	if (b[a[x]]>0) ans_now += b[a[x]]*(b[a[x]]-1)/2;
}

void add(int x)
{
	b[a[x]]++;
	if (b[a[x]]>0) ans_now += b[a[x]]-1;
}

int main()
{
	int n=read(),m=read();
	cnt = sqrt(n);
	for (int i=1;i<=n;i++)
		a[i] = read();
	for (int i=1;i<=m;i++)
	{
		q[i].l=read(),q[i].r=read();
		q[i].id = i;
	}
	sort(q+1,q+m+1,cmp);
	for (int i=1;i<=m;i++)
	{
		while (curL<q[i].l) dele(curL++);
		while (curR<q[i].r) add(++curR);
		while (curL>q[i].l) add(--curL);
		while (curR>q[i].r) dele(curR--);
		ans[q[i].id].x = ans_now;
		ans[q[i].id].y = (q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2;
		ans[q[i].id].solve();
	}
	for (int i=1;i<=m;i++)
		cout << ans[i].x << "/" << ans[i].y << endl;
	return 0; 
}

记录

2023/1/29 16:14
加载中...