60分求助!!!
查看原帖
60分求助!!!
383162
fwhzqr楼主2022/10/25 00:07

RT

#include <bits/stdc++.h>
using namespace std;
#define int long long
int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void out(int x) {
	if (x) {
		out(x/10);
		putchar('0'+x%10);
	}
}
int ans[5000005];
int a[5000005];
int mod=998244353;
int pre[5000005];
signed main () {
	//freopen("p8590.in","r",stdin);
	//freopen("p8590.out","w",stdout);
	int n,k;
	n=read();
	k=read();
	int ok=0;
	int id=1e9;
	a[0]=-1e18;
	a[n+1]=1e18;
	for(int i=1; i<=n; i++) {
		a[i]=read();
		if(a[i]>0) {
			id=min(id,i);
		}
		if(a[i]<0)ok=1;
	}
	if(id==1e9)id=n+1;
	for(register int i=1; i<=n; i++) {
		ans[i]=(ans[i-1]+a[i]*a[i])%mod;
		pre[i]=(pre[i-1]+a[i]+mod)%mod;
	}
	int s=0;
	s=(s+ans[n])%mod;
	s=(s+pre[n]*2ll+mod)%mod;
	s=(s+n)%mod;
	int h=0;
	for(int i=2;i<=k;i++){
		int p=((-i-1ll)/2)-1ll;
		while(h<id&&a[h]<p){
			if(h+1==id||a[h+1]>=p)break;
			else ++h;
		}
		int s1=0;
		s1=(s1+ans[n])%mod;
		s1=(s1+pre[h]*2ll+h+mod)%mod;
		int q=pre[n]-pre[h];
		s1=(s1+q*i*2ll+mod)%mod;
		int qq=i*i%mod;
		int pp=qq*(n-h)%mod;
		s1=(s1+pp)%mod;
		s=(s1+s+mod)%mod;
	}
	printf("%lld",(s+mod)%mod);
	return 0;
}
2022/10/25 00:07
加载中...