萌新求助 MLE 92pts
查看原帖
萌新求助 MLE 92pts
350270
CatFromMars楼主2024/10/4 15:37

最后两个点死活 MLE,感觉自己该省掉的空间都省掉了,实在不理解哪里还可以省空间了,求助 qwq

#include <bits/stdc++.h>
#define i128 __int128
#define ll long long
using namespace std;
const int N = 4e7;
const ll Mod = (1ll << 30);
int n, tp;
int que[N + 10], fr = 1, tl = 0;
ll qz[N + 10];
int l[N + 10];
i128 calc(int n) {
	if(!l[n]) return (i128)qz[n] * qz[n];
	else return (i128)(calc(l[n]) + (i128)(qz[n] - qz[l[n]]) * (qz[n] - qz[l[n]]));
}
void write(i128 x) {
	if(!x) return ;
	write(x / 10);
	cout << (int)(x % 10);
}
signed main() {
//	freopen("read.in", "r", stdin);
//	freopen("write.out", "w", stdout);
	cin >> n >> tp;
	if(!tp) {
		for(int i = 1; i <= n; i++) {
			cin >> qz[i];
			qz[i] = qz[i - 1] + qz[i];
		}
	}
	else {
		ll x, y, z, m;
		
		int b[3];
		cin >> x >> y >> z >> b[1] >> b[2] >> m;
		int lastp = 1; 
		for(int i = 1; i <= m; i++) {
			ll p, L, R;
			cin >> p >> L >> R;
			for(int j = lastp; j <= p; j++) {
				if(j >= 3)
					b[j % 3] = (x * (ll)b[(j - 1) % 3] % Mod + y * (ll)b[(j - 2) % 3] % Mod + z) % Mod;
			
				qz[j] = ((1ll) * b[j % 3] % (R - L + 1)) + L;
			}
			lastp = p + 1;
		}
		for(int i = 1; i <= n; i++)
			qz[i] = qz[i - 1] +  qz[i];
	}

	que[++tl] = 0;
	
	for(int i = 1; i <= n; i++) {
		int j = fr;
		l[i] = 0;
		while(fr <= tl && 2 * qz[que[fr]] - qz[l[que[fr]]] <= qz[i]) fr++;
		fr--;
		
		l[i] = que[fr];
		while(fr <= tl && 2 * qz[que[tl]] - qz[l[que[tl]]] >= 2 * qz[i] - qz[l[i]]) tl--;
		que[++tl] = i;
	}
	write(calc(n));
}
2024/10/4 15:37
加载中...