0pts,看不出是哪里有问题,求调教55555555
查看原帖
0pts,看不出是哪里有问题,求调教55555555
1232566
Wh1t3zZlo楼主2024/10/9 17:45
#include<iostream>
#include<set>
using namespace std;

#define ls(x) x<<1
#define rs(x) x<<1|1

const int N = 100005;

int a[N];

struct Tree
{
	set<int>s;
	int tag;
}tree[N << 2];

void pu(int u)
{
	tree[u].s.clear();

	for (int x : tree[ls(u)].s) tree[u].s.insert(x);
	for (int x : tree[rs(u)].s) tree[u].s.insert(x);
}

void build(int u, int l, int r)
{
	if (l == r)
	{
		tree[u].s.insert(1);
		tree[u].tag = 0;
		return;
	}
	int mid = (l + r) >> 1;
	build(ls(u), l, mid);
	build(rs(u), mid + 1, r);
	pu(u);
}

void pd(int u)
{
	if (!tree[u].tag) return;

	tree[ls(u)].tag = tree[rs(u)].tag = tree[u].tag;

	tree[ls(u)].s.clear(); tree[ls(u)].s.insert(tree[u].tag);
	tree[rs(u)].s.clear(); tree[rs(u)].s.insert(tree[u].tag);

	tree[u].tag = 0;
}

void update(int u, int l, int r, int x, int y, int k)
{
	if (r<x || l>y) return;
	if (l >= x && r <= y)
	{
		tree[u].s.clear();
		tree[u].s.insert(k);
		tree[u].tag = k;
		return;
	}
	pd(u);
	int mid = (l + r) >> 1;
	update(ls(u), l, mid, x, y, k);
	update(rs(u), mid + 1, r, x, y, k);
	pu(u);
}

set<int> query(int u, int l, int r, int x, int y)
{
	set<int>s;
	if (r<x || l>y) return s;
	if (l >= x && r <= y)
	{
		for (int x : tree[u].s) s.insert(x);
		return s;
	}
	int mid = (l + r) >> 1;
	for (int x : query(ls(u), l, mid, x, y)) s.insert(x);
	for (int x : query(rs(u), mid + 1, r, x, y)) s.insert(x);
	return s;
}

int main()
{
	int n, t, o;
	cin >> n >> t >> o;
	build(1, 1, n);
	while (o--)
	{
		char c;
		cin >> c;
		int l, r, k;
		if (c == 'C')
		{
			cin >> l >> r >> k;
			if (l > r) swap(l, r);
			update(1, 1, n, l, r, k);
		}
		else
		{
			cin >> l >> r;
			if (l > r) swap(l, r);
			cout << query(1, 1, n, l, r).size() << endl;
		}

	}
	return 0;
}

求调教,好人一生平安

2024/10/9 17:45
加载中...