RE求助
查看原帖
RE求助
218223
chenxsir楼主2020/7/29 13:57

全部re求助

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=200500,mod=998244353;
int n,ma,a[maxn],cnt[maxn],S[maxn],C[maxn];
long long ans;
int ca(int n);
int ef(int l,int r,int num);

int main()
{
	cin>>n; 
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		cnt[a[i]]++;
	}
	
	int top=1;
	for(int i=1;i<=200000;i++) if(cnt[i]) 
	{
		a[top]=i;
		S[top]=cnt[i]+S[top-1]; top++;
	}
	top--;
	ca(n);
	//cout<<ef(0,top,1);
	for(int i=1;i<=top;i++)
	{
		int x=cnt[a[i]];
		if(x<=1) continue;
		else 
		{
			int z=ef(0,top,2*a[i]);
			if(x==2) { ans=(ans+S[z]-2)%mod; /*printf("2:%d %d\n",a[i],ans);*/continue;}
			else 
			{
				ans=(((S[z]-S[i])*x*(x-1))%mod+C[x]%mod+ans)%mod; //printf("3:%d %d\n",a[i],ans);
			}
		}
	}
	cout<<ans;
	//for(int i=1;i<=top;i++) cout<<a[i]<<" ";
	return 0;
}
int ca(int n)
{
	C[3]=1;
	for(int i=4; i<=n; i++)
		C[i]=(C[i-1]+(i-2)*(i-1)/2)%mod; 
}
int ef(int l,int r,int num)
{
	while(r>l)
	{
		int mid=(l+r+1)>>1;
		if(a[mid]<num) l=mid;
		else r=mid-1;
	}
	return l;
}
2020/7/29 13:57
加载中...