社区讨论

萌新求助,O(nv)的算法T了后4个点

P4933大师参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@locv66wr
此快照首次捕获于
2023/10/30 20:16
2 年前
此快照最后确认于
2023/11/05 06:48
2 年前
查看原帖
RT,洛谷的机子 1s 大概跑多少啊,或者我这份代码有没有可以显著优化的地方。(除了改为 n2n^2 的三亚部分
CPP
#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;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...