你会不会

zjwz  •  3个月前


#include <iostream>
#define N 2000005
#define ls rt<<1 //左子树
#define rs rt<<1|1   //右子树
#define INF 0x3f3f3f3f
using namespace std;
int n, m;

int Max[N << 2], Min[N << 2];	//懒标记
void solve1(int rt, int h) {	//Max标记传递 ,rt节点编号,h传递值
	if (Min[rt] < h)
		Min[rt] = h;	//Min比h小,更新Min
	if (Max[rt] < h)
		Max[rt] = h;	//连Max都比h小,更新Max
}

void solve2(int rt, int h) {
	if (Max[rt] > h)
		Max[rt] = h;
	if (Min[rt] > h)
		Min[rt] = h;
}

void push_down(int rt) {
	solve1(ls, Max[rt]);
	solve1(rs, Max[rt]);
	solve2(ls, Min[rt]);
	solve2(rs, Min[rt]);
	Max[rt] = 0;
	Min[rt] = INF;
}

void update(int l, int r, int rt, int L, int R, int k, bool tag) {
	if (L <= l && r <= R) {
		if (tag == 0)
			solve1(rt, k);
		else
			solve2(rt, k);
		return ;
	}
	int mid = (l + r) >> 1;
	push_down(rt);
	if (L <= mid)
		update(l, mid, ls, L, R, k, tag);
	if (R > mid)
		update(mid + 1, r, rs, L, R, k, tag);
}

void Query(int l, int r, int rt) {
	if (l == r) {//依次输出 叶节点的Max和Min是一样的
		printf("%d\n", Max[rt]);
		return;
	}
	int mid = (l + r) >> 1;
	push_down(rt);//释放懒标记,更新值
	Query(l, mid, ls);
	Query(mid + 1, r, rs);
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n << 2; ++i)
		Min[i] = INF;
	for (int i = 1; i <= m; ++i) {
		int L, R, h, t;	//修改区间[L,R],修改值h,和操作t
		scanf("%d%d%d%d", &t, &L, &R, &h);
		update(1, n, 1, L + 1, R + 1, h, t - 1);
	}
	Query(1, n, 1);
	return 0;
}

include

define N 2000005

define ls rt<<1 //左子树

define rs rt<<1|1 //右子树

define INF 0x3f3f3f3f

using namespace std; int n, m;

int Max[N << 2], Min[N << 2]; //懒标记 void solve1(int rt, int h) { //Max标记传递 ,rt节点编号,h传递值

if (Min[rt] < h)
	Min[rt] = h;	//Min比h小,更新Min
if (Max[rt] < h)
	Max[rt] = h;	//连Max都比h小,更新Max

}

void solve2(int rt, int h) {

if (Max[rt] > h)
	Max[rt] = h;
if (Min[rt] > h)
	Min[rt] = h;

}

void push_down(int rt) {

solve1(ls, Max[rt]);
solve1(rs, Max[rt]);
solve2(ls, Min[rt]);
solve2(rs, Min[rt]);
Max[rt] = 0;
Min[rt] = INF;

}

void update(int l, int r, int rt, int L, int R, int k, bool tag) {

if (L <= l && r <= R) {
	if (tag == 0)
		solve1(rt, k);
	else
		solve2(rt, k);
	return ;
}
int mid = (l + r) >> 1;
push_down(rt);
if (L <= mid)
	update(l, mid, ls, L, R, k, tag);
if (R > mid)
	update(mid + 1, r, rs, L, R, k, tag);

}

void Query(int l, int r, int rt) {

if (l == r) {//依次输出 叶节点的Max和Min是一样的
	printf("%d\n", Max[rt]);
	return;
}
int mid = (l + r) >> 1;
push_down(rt);//释放懒标记,更新值
Query(l, mid, ls);
Query(mid + 1, r, rs);

}

int main() {

scanf("%d%d", &n, &m);
for (int i = 1; i <= n << 2; ++i)
	Min[i] = INF;
for (int i = 1; i <= m; ++i) {
	int L, R, h, t;	//修改区间[L,R],修改值h,和操作t
	scanf("%d%d%d%d", &t, &L, &R, &h);
	update(1, n, 1, L + 1, R + 1, h, t - 1);
}
Query(1, n, 1);
return 0;

}



评论:

请先登录,才能进行评论