萌新求助,O(nv)的算法T了后4个点
  • 板块P4933 大师
  • 楼主ShineEternal萌新
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/12/3 16:43
  • 上次更新2023/11/5 06:48:44
查看原帖
萌新求助,O(nv)的算法T了后4个点
45475
ShineEternal萌新楼主2020/12/3 16:43

RT,洛谷的机子 1s 大概跑多少啊,或者我这份代码有没有可以显著优化的地方。(除了改为 n2n^2 的三亚部分

#include<cstdio>
#include<algorithm>
using namespace std;
long long mod=998244353;
long long f[1005][50005],g[200005];//f[i][j]表示到i为止公差为j的方案数。 
long long a[1005];
long long max(long long x,long long y)
{
	if(x>y)return x;
	return y;
}
long long min(long long x,long long y)
{
	if(x<y)return x;
	return y;
}
inline long long read() {
    char ch = getchar(); long long x = 0, f = 1;
    while(ch < '0' || ch > '9') {
        if(ch == '-') f = -1;
        ch = getchar();
    } while('0' <= ch && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    } return x * f;
}
int main()
{
	int n;
	long long tmp=20000;
	scanf("%d",&n);
	long long Max=0,Min=1000000000;
	for(int i=1;i<=n;i++)
	{
		a[i]=read(); 
		//scanf("%lld",&a[i]);
		Max=max(Max,a[i]);
		Min=min(Min,a[i]);
		//f[i][0]=1;
	} 
	//f[1]=1;
	/*for(long long d=-20000;d<=20000;d++)
	{
		g[d+tmp]=1;
	}*/
	long long ans=0,qaq,qwq;
	long long orz=Max-Min;
	for(register long long d=-orz;d<=orz;d++)
	{
		for(register int i=1;i<=n;i++)
		{
			g[a[i]+2*tmp]=0;
		}
		qaq=d+tmp;
		for(register int i=1;i<=n;i++)
		{
			
			qwq=a[i]+2*tmp;
			f[i][qaq]=g[qwq-d];
			f[i][qaq]%=mod;
			g[qwq]+=f[i][qaq]+1;
			g[qwq]%=mod; 
			ans+=f[i][qaq];
			ans%=mod;
		}
	} 
	/*long long ans=0;
	for(long long d=-20000;d<=20000;d++)
	{
		ans+=f[d];
		ans=ans%mod;
	}*/
	printf("%lld\n",(ans+n)%mod);
	return 0;
}
2020/12/3 16:43
加载中...