90分求助
查看原帖
90分求助
579699
Self_Killer楼主2023/1/25 18:58
#include<bits/stdc++.h>
using namespace std;
int n;long long x,p,m1,c,m2,m2_1,m3,m3_1;
int main(){
	cin >> n >> p >> x;
	c = m1 = m3_1 = x,m2_1 = x * 2;
	for(int i = 2;i <= n;i++){
		cin >> x;
		c = max(0LL,c) + x;
		m1 = max(m1,c);
		if(m2 > m3 || (m2 == m3 && m2_1 > m3_1)) m3 = m2,m3_1 = m2_1;
		if(m1){
			m2_1 += m1;
			if((m2_1?m2_1:-m2_1) >= 1e18){
				m2 += m2_1 / 1e18;
				m2_1 %= (long long)1e18;
			}
		}
	}
	cout << (((m3 % p) * ((long long)1e18 % p)) % p + m3_1 % p) % p;
	return 0;
}

会越界的用了两个来存储,c为当前最大子段和;m1是全局的,即当前小朋友特征值;m2/m2_1为下一个小朋友的分数;m3/m3_1为答案

2023/1/25 18:58
加载中...