萌新刚学线段树10^-1145141919810秒,WA求助
查看原帖
萌新刚学线段树10^-1145141919810秒,WA求助
241542
_OJF_楼主2021/7/9 23:05

码风极差请谅解

#include<bits/stdc++.h>
using namespace std;
long long n, q, h[50005], x, y;
struct node{
	int l, r, lsum, rsum, sum, ans;
}f[200005], s;
void get(int l, int r, int id){
	f[id].l = l, f[id].r = r;
	if(l == r){
		f[id].lsum = h[l], f[id].rsum = h[l], f[id].sum = h[l], f[id].ans = h[l];
		return;
	}
	int mid = l + (r - l) / 2;
	get(l, mid, id * 2);
	get(mid + 1, r, id * 2 + 1);
	f[id].lsum = max(f[id * 2].sum + f[id * 2 + 1].lsum, f[id * 2].lsum);
	f[id].rsum = max(f[id * 2 + 1].sum + f[id * 2].rsum, f[id * 2 + 1].rsum);
	f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
	f[id].ans = max(max(f[id * 2].ans, f[id * 2 + 1].ans), f[id * 2].rsum + f[id * 2 + 1].lsum);
}
void query(int l, int r, int id){
	if(l == f[id].l && r == f[id].r){
		s.ans = max(max(s.ans, f[id].ans), s.rsum + f[id].lsum);
		s.lsum = max(s.sum + f[id].lsum, s.lsum);
		s.rsum = max(f[id].sum + s.rsum, f[id].rsum);
		s.sum = s.sum + f[id].sum;
		return;	
	}
	if(r <= f[id * 2].r){
		query(l, r, id * 2);
	}
	else
		if(l >= f[id * 2 + 1].l)
			query(l, r, id * 2 + 1);
		else
			query(l, f[2 * id].r, id * 2), query(f[2 * id + 1].l, r, id * 2 + 1);
}
int main(){
	cin>>n;
	for(int i = 1;i <= n;i++)
		cin>>h[i];
	cin>>q;
	get(1, n, 1);
	for(int i = 1;i <= q;i++){
		cin>>x>>y;
		s.lsum = 0, s.rsum = 0, s.sum = 0, s.ans = 0;
		query(x, y, 1);
		cout<<s.ans;
		if(i < q)
			cout<<endl; 
	}
	return 0;
}
2021/7/9 23:05
加载中...