大佬萌,为什么这道题使用自然溢出不行呢?
查看原帖
大佬萌,为什么这道题使用自然溢出不行呢?
26525
poplpr楼主2020/5/22 20:10

我看评论区说是求和公式需要“求和公式换成暴力循环才正确”,为什么呢……?

下面是我73分的代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
#define IL inline
#define ri register int

const int N = 5e5 + 3;
const int INF = 1e9;

int n,m;
int a[N];

struct Node {
	LL sum1,sum2,maxv,minv;
	Node(LL sum1=0,LL sum2=0,LL maxv=0,LL minv=INF):sum1(sum1),sum2(sum2),maxv(maxv),minv(minv) {}
};

struct SegmentTree {
	LL sum1[N<<2],sum2[N<<2],maxv[N<<2],minv[N<<2];
	
	IL void pushup(int o,int L,int R) {
		sum1[o] = sum1[o<<1] + sum1[o<<1|1];
		sum2[o] = sum2[o<<1] + sum2[o<<1|1];
		maxv[o] = max(maxv[o<<1],maxv[o<<1|1]);
		minv[o] = min(minv[o<<1],minv[o<<1|1]);
	}
	
	void build(int o,int L,int R) {
		sum1[o] = sum2[o] = 0;
		maxv[o] = -INF, minv[o] = INF;
		if(L == R) { sum1[o] = maxv[o] = minv[o] = a[L]; sum2[o] = 1LL*a[L]*a[L]; return;}
		int M = L + (R-L) / 2;
		build(o<<1,L,M); build(o<<1|1,M+1,R);
		pushup(o,L,R);
	}
	
	int pos,v;
	void upd(int o,int L,int R) {
		if(L == R) { sum1[o] = maxv[o] = minv[o] = v; sum2[o] = 1LL*v*v; return;}
		int M = L + (R-L) / 2;
		if(pos <= M) upd(o<<1,L,M);
		else upd(o<<1|1,M+1,R);
		pushup(o,L,R);
	}
	
	int qL,qR;
	Node query(int o,int L,int R) {
		if(qL <= L && R <= qR) { return Node(sum1[o],sum2[o],maxv[o],minv[o]);}
		int M = L + (R-L) / 2;
		Node a,b;
		if(qL <= M) a = query(o<<1,L,M);
		if(M < qR) b = query(o<<1|1,M+1,R);
		return Node(a.sum1+b.sum1,a.sum2+b.sum2,max(a.maxv,b.maxv),min(a.minv,b.minv));
	}
};

SegmentTree lpr;

LL SUM1LR(int L,int R) { return 1LL * (R-L+1) * (R+L) / 2;}
LL SUM2(int x) { return 1LL*x*(x+1)*(2*x+1) / 6;}
LL SUM2LR(int L,int R) { return SUM2(R)-SUM2(L-1);}

int main() {
	scanf("%d%d",&n,&m);
	for(ri i=1;i<=n;i++) scanf("%d",&a[i]);
	lpr.build(1,1,n);
	while(m--) {
		int op,x,y; scanf("%d%d%d",&op,&x,&y);
		if(op == 1) {
			lpr.pos = x; lpr.v = y;
			lpr.upd(1,1,n);
		}
		else {
			lpr.qL = x, lpr.qR = y;
			Node ans = lpr.query(1,1,n);
			if(SUM1LR(ans.minv,ans.maxv) == ans.sum1 && SUM2LR(ans.minv,ans.maxv) == ans.sum2) {
				printf("damushen\n");
			}
			else printf("yuanxing\n");
		}
	}
	return 0;
}
2020/5/22 20:10
加载中...