蒟蒻线段树写挂了,求调
查看原帖
蒟蒻线段树写挂了,求调
767297
r1sing楼主2024/8/15 20:32

不知道哪里错了,样例没过

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
const ll inf = 2147483647;
struct stree
{
	ll left, right;
	ll maxv, minv;
	ll uval, umax = inf, umin = -inf;
}tree[2000002];
ll n, k;
void change(ll k, ll uval, ll umax, ll umin)
{
	if(uval != 0)
	{
		tree[k].uval = uval;
		tree[k].umax = inf;
		tree[k].umin = -inf;
		tree[k].maxv = tree[k].minv = uval;
	}
	else if(tree[k].uval != 0)
	{
		if(tree[k].uval < umin && umin != 0)
		{
			tree[k].uval = umin;
		}
		else if(tree[k].uval > umax && umax != 0)
		{
			tree[k].uval = umax;
		}
	}
	else
	{
		if(umax < tree[k].umin)
		{
			tree[k].umax = inf;
			tree[k].umin = -inf;
			tree[k].uval = umax;
		}
		else if(umin > tree[k].umax)
		{
			tree[k].umax = inf;
			tree[k].umin = -inf;
			tree[k].uval = umin;
		}
		else
		{
			tree[k].umax = min(tree[k].umax, umax);
			tree[k].umin = max(tree[k].umin, umin);
		}
		tree[k].umax = min(tree[k].umax, umax);
		tree[k].umin = max(tree[k].umin, umin);
	}
}
void pushdown(ll k)
{
	change(2 * k, tree[k].uval, tree[k].umax, tree[k].umin);
	change(2 * k + 1, tree[k].uval, tree[k].umax, tree[k].umin);
	tree[k].uval = 0;
	tree[k].umax = inf;
	tree[k].umin = -inf;
}
void build(ll l, ll r, ll k)
{
	tree[k].left = l;
	tree[k].right = r;
	if(l == r)
		return ;
	ll mid = l + r >> 1;
	build(l, mid, 2 * k);
	build(mid + 1, r, 2 * k + 1);
	return ;
}
void updatemax(ll l, ll r, ll k, ll v)
{
	if(tree[k].left >= l && tree[k].right <= r)
	{
		tree[k].umax = min(tree[k].umax, v);
		if(tree[k].umax <= tree[k].umin)
		{
			tree[k].uval = tree[k].umax;
			tree[k].umax = inf;
			tree[k].umin = -inf;
		}
		return ;
	}
	pushdown(k);
	ll mid = tree[k].left + tree[k].right >> 1;
	if(l <= mid)
		updatemax(l, r, 2 * k, v);
	if(r > mid)
		updatemax(l, r, 2 * k + 1, v);
	return ;
}
void updatemin(ll l, ll r, ll k, ll v)
{
	if(tree[k].left >= l && tree[k].right <= r)
	{
		tree[k].umin = max(tree[k].umin, v);
		if(tree[k].umin >= tree[k].umax)
		{
			tree[k].uval = tree[k].umin;
			tree[k].umax = inf;
			tree[k].umin = -inf;
		}
		return ;
	}
	pushdown(k);
	ll mid = tree[k].left + tree[k].right >> 1;
	if(l <= mid)
		updatemin(l, r, 2 * k, v);
	if(r > mid)
		updatemin(l, r, 2 * k + 1, v);
	return ;
}
void query()
{
	ll cnt = 0;
	for(int i = 1; cnt <= n && i <= 4 * n; i++)
	{
		if(tree[i].left == tree[i].right)
			cout << tree[i].maxv << "\n", cnt++;
		else
			pushdown(i);
	}
	return ;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);     cout.tie(0);
	cin >> n >> k;
	build(1, n, 1);
	while(k--)
	{
		ll op, l, r, h;
		cin >> op >> l >> r >> h;
		l++;
		r++;
		if(op == 1)
			updatemin(l, r, 1, h);
		if(op == 2)
			updatemax(l, r, 1, h);
	}
	query();
	return 0;
}
2024/8/15 20:32
加载中...