线段树求调,AC on #5 #6
查看原帖
线段树求调,AC on #5 #6
633944
X____楼主2023/11/8 17:54

rt

#include<bits/stdc++.h>
#define F(i, l, r) for(int (i) = (l); (i) <= (r); (i) ++)
#define sum(p) tree[p].sum
#define max1(p) tree[p].maxst
#define max2(p) tree[p].maxnd
#define maxhis(p) tree[p].maxhis
#define cnt(p) tree[p].maxnum
#define l(p) tree[p].l
#define r(p) tree[p].r
#define lzy1(p) tree[p].lazy1
#define lzy2(p) tree[p].lazy2
#define lzy3(p) tree[p].lazy3
#define lzy4(p) tree[p].lazy4
#define int long long
using namespace std;
const int N = 5e5+3;
int a[N];
struct STree{
	int sum, maxst, maxnd, maxhis, maxnum, l, r;
	int lazy1, lazy2, lazy3, lazy4;
	void Clear() {
		lazy1 = lazy2 = lazy3 = lazy4 = 0;
	}
}tree[N*4];

void pushup(int p) {
	
	max1(p) = max(max1(p<<1), max1(p<<1|1));
	maxhis(p) = max(maxhis(p<<1), maxhis(p<<1|1));
	sum(p) = sum(p<<1) + sum(p<<1|1);
	
	if(max1(p<<1) == max1(p<<1|1)) {
		
		max2(p) = max(max2(p<<1), max2(p<<1|1) );
		cnt(p) = cnt(p<<1) + cnt(p<<1|1);
		
	}else if(max1(p<<1) > max1(p<<1|1) ) {
		
		max2(p) = max(max1(p<<1|1), max2(p<<1));
		cnt(p) = cnt(p<<1);
			
	}else if(max1(p<<1) < max1(p<<1|1)) {
		
		max2(p) = max(max1(p<<1), max2(p<<1|1));
		cnt(p) = cnt(p<<1|1);
	}
}
void build(int p, int l, int r) {
	l(p) = l; r(p) = r;
	if(l == r) {
		sum(p) = max1(p) = maxhis(p) = a[l];
		max2(p) = -1e18; cnt(p) = 1;
		return;
	}
	int mid = (l+r)>>1;
	build(p<<1, l, mid);
	build(p<<1|1, mid+1, r);
	pushup(p);
}
void updata(int p, int l1, int l2, int l3, int l4)
{
	sum(p) += (l1 * cnt(p) + l3 * (r(p) - l(p) + 1 - cnt(p)));
	maxhis(p) = max(maxhis(p), max1(p) + l2);
	max1(p) += l1;
	if(max2(p) != -1e18) max2(p) += l3;
	lzy2(p) = max(lzy2(p), lzy1(p) + l2), lzy1(p) += l1;
	lzy4(p) = max(lzy4(p), lzy3(p) + l4), lzy3(p) += l3;
}
void pushdown(int p) {
	int maxn = max(max1(p<<1), max1(p<<1|1));
	if(maxn == max1(p<<1) ) {
		updata(p<<1, lzy1(p), lzy2(p), lzy3(p), lzy4(p) );
	}else {
		updata(p<<1, lzy3(p), lzy4(p), lzy3(p), lzy4(p) );
	}if(maxn == max1(p<<1|1) ) {
		updata(p<<1|1, lzy1(p), lzy2(p), lzy3(p), lzy4(p) );
	}else {
		updata(p<<1|1, lzy3(p), lzy4(p), lzy3(p), lzy4(p) );
	}
	tree[p].Clear();
}
int x, y, k;

void modify1(int p) {
	if(l(p) > y || r(p) < x) return;
	if(l(p) >= x && r(p) <= y) {
		updata(p, k, k, k, k);
		return;
	} 
	pushdown(p);
	modify1(p<<1);
	modify1(p<<1|1);
	pushup(p);
}
void modify2(int p) {
	if(l(p) > y || r(p) < x) return;
	if(max1(p) <= k) return;
	if(l(p) >= x && r(p) <= y && max2(p) < k) {
		updata(p, k-max1(p), k-max1(p), 0, 0);
		return;
	}
	pushdown(p);
	modify2(p<<1);
	modify2(p<<1|1);
	pushup(p);
}
int query1(int p) {
	if(l(p) > y || r(p) < x) return 0;
	if(l(p) >= x && r(p) <= y) {
		return sum(p);
	}
	pushdown(p);
	return query1(p<<1)+query1(p<<1|1);
//	if(l(p) >= x && r(p) <= y) {
//		return sum(p);
//	}
//	pushdown(p);
//	int ans = 0;
//	int mid = (l(p) + r(p)) >> 1;
//	if(x <= mid) ans += query1(p<<1);
//	if(y > mid) ans += query1(p<<1|1);
//	return ans;
}
int query2(int p) {
	if(l(p) > y || r(p) < x) return -1e18;
	if(l(p) >= x && r(p) <= y) {
		return max1(p);
	}
	pushdown(p);
	return max(query2(p<<1), query2(p<<1|1));
//	if(l(p) >= x && r(p) <= y) {
//		return max1(p);
//	}
//	pushdown(p);
//	int ans = -1e18;
//	int mid = (l(p) + r(p)) >> 1;
//	if(x <= mid) ans = max(ans, query2(p<<1) );
//	if(y > mid) ans= max(ans, query2(p<<1|1) );
//	return ans;
}
int query3(int p) {
	if(l(p) > y || r(p) < x) return -1e18;
	if(l(p) >= x && r(p) <= y) {
		return maxhis(p);
	}
	pushdown(p);
	return max(query3(p<<1), query3(p<<1|1));
//	int ans = -N;
//	int mid = (l(p) + r(p)) >> 1;
//	if(x <= mid) ans =max(ans, query3(p<<1) );
//	if(y > mid) ans=max(ans, query3(p<<1|1) );
//	return ans;
}
signed main() {
	int n, m;
	cin>>n>>m;
	F(i, 1, n) {
		scanf("%lld", &a[i]);
	}
//	F(i,1, n) cout<<a[i]<<" ";
	build(1, 1, n);
//	F(i, 1, 20) cout<<i<<":"<<sum(i)<<"\n";
	
	F(i, 1, m) {
		int op; scanf("%lld", &op);
		if(op == 1) {
			scanf("%lld%lld%lld", &x, &y, &k);
			modify1(1);
		}else if(op == 2) {
			scanf("%lld%lld%lld", &x, &y, &k);
			modify2(2);
		}else if(op == 3) {
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", query1(1));
		}else if(op == 4) {
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", query2(1));
		}else {
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", query3(1));
		}
	}
	return 0;
}
2023/11/8 17:54
加载中...