炸裂了
查看原帖
炸裂了
141599
sinsop90楼主2021/11/15 17:16
#include <bits/stdc++.h>
#define int __int128
#define maxn 40000005
#define maxm 100005
using namespace std;
const int mod = (1 << 30);
int n, type, f[maxn], pre[maxn], l, r;
long long b[maxn], x, y, z, m, p[maxm], ll[maxm], rr[maxm], a[maxn], q[maxn], g[maxn];
int read()
{
    int x=0,flag=1;char c;
    while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
    while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^'0'),c=getchar();
    return x*flag;
}
void write(int x)
{
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
signed main() {
	n = read(), type = read();
	if(type) {
		x = read(), y = read(), z = read(), b[1] = read(), b[2] = read(), m = read();
//		scanf("%lld%lld%lld%lld%lld%lld", &x, &y, &z, &b[1], &b[2], &m);
    	for(int i = 1;i <= m;i ++) p[i] = read(), ll[i] = read(), rr[i] = read();
    	for(int i = 3;i <= n;i ++) b[i] = (0ll + 1ll * b[i - 1] * x + 1ll * b[i - 2] * y + z) % mod;
    	for(int i = 1;i <= m;i ++) for(int j = p[i - 1] + 1;j <= p[i]; j ++) a[j] = (b[j] % (rr[i] - ll[i] + 1)) + ll[i];
	}
	else for(int i = 1;i <= n;i++) a[i] = read();
	for(int i = 1;i <= n;i++) pre[i] = pre[i - 1] + a[i];
	l = 1, r = 0;
	for(int i = 1;i <= n;i++) {
		while(l <= r && pre[i] - pre[q[l]] >= g[q[l]]) l ++;
		f[i] = f[q[l - 1]] + (pre[i] - pre[q[l - 1]]) * (pre[i] - pre[q[l - 1]]);
		g[i] = pre[i] - pre[q[l - 1]];
		while(l <= r && g[q[r]] + pre[q[r]] > g[i] + pre[i]) r --;
		q[++r] = i;
	}
	write(f[n]);
}

空间炸裂, 1GB都不够用, 出题人怎么想到把 n 弄到4e7的?

2021/11/15 17:16
加载中...