TLE求助,是算法问题还是常数问题
查看原帖
TLE求助,是算法问题还是常数问题
496117
wyh0721楼主2024/7/29 12:01
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200005,M=1000005;
int a[N],cnt[M],sum[N],ans,n,m,bl,b[N];
int read()
{
    int x=0;
    bool f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
	{
        if(ch=='-')
            f=0;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
	{
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return f?x:-x;
}
struct node{
	int l;
	int r;
	int id;
}q[N];
bool cmp(node x,node y)
{
	return b[x.l] == b[y.l] ? x.r < y.r : x.l < y.l;
}
void add(int x)
{
	ans-=cnt[a[x]]*cnt[a[x]]*a[x];
	cnt[a[x]]++;
	ans+=cnt[a[x]]*cnt[a[x]]*a[x];
}
void del(int x)
{
	ans-=cnt[a[x]]*cnt[a[x]]*a[x];
	cnt[a[x]]--;
	ans+=cnt[a[x]]*cnt[a[x]]*a[x];
}
signed main()
{
    ios::sync_with_stdio(false);
	n=read();
	m=read();
	bl=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;
	}
	for(int i=1;i<=n;i++)
	    b[i]=(i-1)/bl+1;
	sort(q+1,q+m+1,cmp);
	int L=1,R=0;
	for(int i=1;i<=m;i++)
	{
		while(L<q[i].l) del(L++);
		while(L>q[i].l) add(--L);
		while(R<q[i].r) add(++R);
		while(R>q[i].r) del(R--);
		sum[q[i].id]=ans;
	}
	for(int i=1;i<=m;i++)
		cout<<sum[i]<<endl;
	return 0;
}
2024/7/29 12:01
加载中...