10分求助,样例过了
查看原帖
10分求助,样例过了
220824
yyz1005楼主2022/1/29 15:59

RT,int,long long, __int128 都只有10分,感觉是取模的问题

a[i]:第 i 个小朋友手上的数字

u[i]:前 i 个数以 a[i] 结尾的最大子段和

v[i]:前 i 个数的最大子段和(特征值)

m[i]:第 i 个小朋友的分数

P:分数最高的小朋友的位置

MaxM:目前分数+特征值的最大值

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
__int128 n,p,a[1000010],u[1000010],v[1000010],m[1000010],MaxM,P = 1;
inline __int128 read(){
   int X=0,w=0; char ch=0;
   while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
   while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
   return w?-X:X;
}
inline void print(__int128 x){    
   if(x<0){putchar('-');x=-x;}
   if(x>9) print(x/10);
   putchar(x%10+'0');
}
int main(){
	n = read();
	p =  read();
	a[1] = read();
	u[1] = a[1],v[1] = a[1],m[1] = v[1];
	MaxM = m[1]+v[1];
	for(__int128 i = 2; i <= n; i++){
		a[i] = read();
		u[i] = max(a[i],u[i-1]+a[i]);
		v[i] = max(v[i-1],u[i]);
		m[i] = MaxM;
		if(m[i]>m[P]) P = i;
       
		if(m[i]>=0) m[i]%=p;//取模
		else m[i] = 0-((0-m[i])%p);
		 
		MaxM = max(MaxM,m[i]+v[i]);
	}
	print(m[P]);
	return 0;
}
2022/1/29 15:59
加载中...