线段树求调玄关
  • 板块学术版
  • 楼主Hyvial
  • 当前回复24
  • 已保存回复24
  • 发布时间2024/8/20 14:08
  • 上次更新2024/8/20 16:15:12
查看原帖
线段树求调玄关
1137394
Hyvial楼主2024/8/20 14:08

P1253线段树 写挂 ,只拿50分,但经过我的对照发现第六个点答案好像我答案一样 QWQ

#include <bits/stdc++.h>
#define PII pair <int, int>
#define int long long
#define DB double

namespace FastIO
{
	inline void read(int MOD, int &ret){
		char ch = getchar();int ngtv = 1;
		if(MOD == 0) {while(ch < '0' || ch > '9'){if(ch == '-') ngtv = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ret = ret * 10 + (ch - '0');ch = getchar();}}
		else {while(ch < '0' || ch > '9'){if(ch == '-') ngtv = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ret = (ret * 10 % MOD + (ch - '0') % MOD) % MOD;ch = getchar();} }
		ret *= ngtv;}
	inline void cread(char &ch){while(ch == ' ' || ch == '\n' || ch == '\r' || ch == 0) ch = getchar();ch = getchar();}
}
using namespace FastIO;
using namespace std;

const int N = 1e6 + 10, M = 4e6 + 10;
int n, m, A[N];
int op, x, y, k;

int max(int x, int y)
{
	return x > y ? x : y;
}

struct Node
{
	int left, right;
	int Mx, tag1, tag2;
}Tree[M];

void init_tree(int x, int l, int r)
{
	Tree[x].left = l;
	Tree[x].right = r;
	Tree[x].tag1 = -1145141919810;
	
	if(l == r)
	{
		Tree[x].Mx = A[l];
		return ;
	}
	
	int mid = (l + r) >> 1;
	init_tree(x * 2, l, mid);
	init_tree(x * 2 + 1, mid + 1, r);
	
	Tree[x].Mx = max(Tree[x * 2].Mx, Tree[x * 2 + 1].Mx);
}

void pushdown(int x)
{
	if(Tree[x].tag1 != -1145141919810)
	{
		Tree[x * 2].Mx = Tree[x].tag1;
		Tree[x * 2 + 1].Mx = Tree[x].tag1;
		Tree[x * 2].tag1 = Tree[x * 2 + 1].tag1 = Tree[x].tag1;
		Tree[x].tag1 = -1145141919810;
		Tree[x].tag2 = 0;
	}
	else
	{
		Tree[x * 2].Mx += Tree[x].tag2;
		Tree[x * 2].tag2 += Tree[x].tag2;
		Tree[x * 2 + 1].Mx += Tree[x].tag2;
		Tree[x * 2 + 1].tag2 += Tree[x].tag2;
		Tree[x].tag2 = 0;
	}
}

void change(int x, int l, int r, int k)
{
	if(r < Tree[x].left || Tree[x].right < l)
		return ;
	
	if(l <= Tree[x].left && Tree[x].right <= r)
	{
		Tree[x].tag1 = k;
		Tree[x].tag2 = 0;
		Tree[x].Mx = k;
		return ;
	}
	
	pushdown(x);
	
	change(x * 2, l, r, k);
	change(x * 2 + 1, l ,r, k);
	
	Tree[x].Mx = max(Tree[x * 2].Mx, Tree[x * 2 + 1].Mx);
}

void add(int x, int l, int r, int k)
{
	if(r < Tree[x].left || Tree[x].right < l)
		return ;
	
	if(l <= Tree[x].left && Tree[x].right <= r)
	{
		Tree[x].Mx += k;
		if(Tree[x].tag1 != -1145141919810)
			Tree[x].tag1 += k;
		else
			Tree[x].tag2 += k;
		return ;
	}
	
	pushdown(x);
	
	add(x * 2, l, r, k);
	add(x * 2 + 1, l, r, k);
	
	Tree[x].Mx = max(Tree[x * 2].Mx, Tree[x * 2 + 1].Mx);
}

int mx(int x, int l, int r)
{
	if(r < Tree[x].left || Tree[x].right < l)
		return 0;
	
	if(l <= Tree[x].left && Tree[x].right <= r)
		return Tree[x].Mx;
	
	pushdown(x);
	
	return max(mx(x * 2, l, r), mx(x * 2 + 1, l, r));
}

signed main()
{
//	freopen("P1253_6.in", "r", stdin);
//	freopen("蒟蒻.out", "w", stdout);
	
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; i ++ )
		scanf("%lld", &A[i]);
	
	init_tree(1, 1, n);
		
//	puts("");
//	for(int i = 1; i <= n * 2 + 1; i ++ )
//		printf("%d %d %d %d %d %d\n", i, Tree[i].Mx, Tree[i].tag1, Tree[i].tag2, Tree[i].left, Tree[i].right);
//	puts("");

	while(m -- )
	{
		scanf("%lld%lld%lld", &op, &x, &y);
		
		if(op == 1)
		{
			scanf("%lld", &k);
			change(1, x, y, k);
		}
		else if(op == 2)
		{
			scanf("%lld", &k);
			add(1, x, y, k);
		}
		else
			printf("%lld\n", mx(1, x, y));
		
//		puts("");
//		for(int i = 1; i <= n * 2 + 1; i ++ )
//			printf("%d %d %d %d %d %d\n", i, Tree[i].Mx, Tree[i].tag1, Tree[i].tag2, Tree[i].left, Tree[i].right);
//		puts("");
	}
	
    return 0;
}
2024/8/20 14:08
加载中...