代码求调
查看原帖
代码求调
372415
乐乐乐还在乐楼主2023/5/15 10:10

写的是第5,6个点(没有取min操作的)。

目前是 RE。

using namespace std;
typedef long long ll;
#define int long long

const int MAXN = 1e6 + 5;
int n, m;

namespace Seg_Tr{
	struct Tag{
		ll add, add_h;
	};
	struct node{
		ll sum, mx, mx_h;
		Tag tag;
	} a[MAXN * 4];
	
	const int INF = 0x3f3f3f3f;
#define mid ((l + r) >> 1)
#define p a[x]
#define ls (x << 1)
#define rs ((x << 1) | 1)
#define pls a[ls]
#define prs a[rs]
	
	bool in(int l, int r, int ql, int qr) {return ql <= l && r <= qr;}
	bool out(int l, int r, int ql, int qr) {return r < ql || qr < l;}
	
	void push_up(int x){
		p.sum = pls.sum + prs.sum;
		p.mx = max(pls.mx, prs.mx);
		p.mx_h = max(pls.mx_h, prs.mx_h);
	}
	
	void push_down(int x, int l, int r){
		if(l == r) return;
		pls.sum += 1ll * p.tag.add * (mid - l + 1);
		prs.sum += 1ll * p.tag.add * (r - mid);
		pls.mx_h = max(pls.mx_h, pls.mx + p.tag.add_h);
		prs.mx_h = max(prs.mx_h, prs.mx + p.tag.add_h);
		pls.mx += p.tag.add;
		prs.mx += p.tag.add;
		
		pls.tag.add_h = max(pls.tag.add_h, pls.tag.add + p.tag.add_h);
		prs.tag.add_h = max(prs.tag.add_h, prs.tag.add + p.tag.add_h);
		pls.tag.add += p.tag.add;
		prs.tag.add += p.tag.add;
		
		p.tag.add = p.tag.add_h = 0;
	}
	
	void build(int x, int l, int r){
		if(l == r){
			scanf("%lld", &p.sum);
			p.mx = p.mx_h = p.sum;
			return;
		}
		build(ls, l, mid);
		build(rs, mid + 1, r);
		push_up(x);
	}
	
	void mod_add(int x, int l, int r, int ql, int qr, ll v){
		push_down(x, l, r);
		if(in(l, r, ql, qr)){
			p.sum += v * (r - l + 1);
			p.mx += v;
			p.mx_h = max(p.mx_h, p.mx);
			p.tag.add += v;
			p.tag.add_h = max(p.tag.add_h, p.tag.add);
			return;
		}
		if(out(l, r, ql, qr)) return;
		mod_add(ls, l, mid, ql, qr, v);
		mod_add(qr, mid + 1, r, ql, qr, v);
		push_up(x);
	}
	
	ll qry_sum(int x, int l, int r, int ql, int qr){
		push_down(x, l, r);
		if(in(l, r, ql, qr)) return p.sum;
		if(out(l, r, ql, qr)) return 0;
		return qry_sum(ls, l, mid, ql, qr) + qry_sum(rs, mid + 1, r, ql, qr);
	}
	
	ll qry_max(int x, int l, int r, int ql, int qr){
		push_down(x, l, r);
		if(in(l, r, ql, qr)) return p.mx;
		if(out(l, r, ql, qr)) return -INF;
		return max(qry_max(ls, l, mid, ql, qr), qry_max(rs, mid + 1, r, ql, qr));
	}
	
	ll qry_max_h(int x, int l, int r, int ql, int qr){
//		printf("%d %d %d %d %d mx = %d, mx_h = %d\n", x, l, r, ql, qr, p.mx, p.mx_h);
		push_down(x, l, r);
		if(in(l, r, ql, qr)) return p.mx_h;
		if(out(l, r, ql, qr)) return -INF;
		return max(qry_max_h(ls, l, mid, ql, qr), qry_max_h(rs, mid + 1, r, ql, qr));
	}
	
#undef mid
#undef p
#undef ls
#undef rs
#undef pls
#undef prs
} // Seg_Tr

signed main(){
	scanf("%lld%lld", &n, &m);
	Seg_Tr::build(1, 1, n);
	while(m--){
		int op; scanf("%lld", &op);
		if(op == 1){
			int l, r; ll v; scanf("%lld%lld%lld", &l, &r, &v);
			Seg_Tr::mod_add(1, 1, n, l, r, v);
		}
		if(op == 2){
			assert(0);
		}
		if(op == 3){
			int l, r; scanf("%lld%lld", &l, &r);
			printf("%lld\n", Seg_Tr::qry_sum(1, 1, n, l, r));
		}
		if(op == 4){
			int l, r; scanf("%lld%lld", &l, &r);
			printf("%lld\n", Seg_Tr::qry_max(1, 1, n, l, r));
		}
		if(op == 5){
			int l, r; scanf("%lld%lld", &l, &r);
			printf("%lld\n", Seg_Tr::qry_max_h(1, 1, n, l, r));
		}
	}
	return 0;
}
2023/5/15 10:10
加载中...