求助(全RE) 已经考虑a<b
查看原帖
求助(全RE) 已经考虑a<b
576135
Wangsliuliu楼主2024/11/18 22:02

rt 非常感谢

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
ll n, t, q;
const ll N = 1e6 + 10;
struct Node
{
	ll l, r;
	ll lz;
	ll c;
}tr[4 * N];
void pushup(ll u)
{
	tr[u].c = tr[u << 1].c | tr[u << 1 | 1].c;
}
void pushdown(ll u)
{
	if(tr[u].lz != 0)
	{
		tr[u << 1].c = tr[u].c;
		tr[u << 1].lz = 1;
		tr[u << 1 | 1].c = tr[u].c;
		tr[u << 1 | 1].lz = 1; 
		tr[u].lz = 0;
	}

}
void build(ll u, ll l, ll r)
{
	tr[u] = {l, r};
	if(l == r)
	{
		tr[u].c = 2;
		return ;
	}
	ll mid = l + r >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	pushup(u);
}
void modify(ll u, ll l, ll r, ll x)
{
	if(tr[u].l >= l && tr[u].r <= r)
	{
		tr[u].c = 1 << x;
		tr[u].lz = 1;
		return ;
	}else
	{
		pushdown(u);
		ll mid = tr[u].l + tr[u].r >> 1;
		if(l <= mid) modify(u << 1, l, r, x);
		if(r > mid) modify(u << 1 | 1, l, r, x);
		pushup(u);
	}
}
long long query(ll u, ll l, ll r)
{
	if(tr[u].l >= l && tr[u].r <= r) return tr[u].c;
	else
	{
		pushdown(u);
		ll mid = l + r >> 1;
		long long ans = 0;
		if(l <= mid) ans |= query(u << 1, l, r);
		if(r > mid) ans |= query(u << 1 | 1, l, r);
		return ans;
	}
}
int main()
{
	cin >> n >> t >> q;
	build(1, 1, n);
	char op;
	while(q -- )
	{
		cin >> op;
		if(op == 'C')
		{
			ll a, b, c;
			cin >> a >> b >> c;
			if(a > b) swap(a, b);
			modify(1, a, b, c);
		}else
		{
			ll a, b;
			cin >> a >> b;
			if(a > b) swap(a, b);
			long long s = query(1, a, b);
			ll cnt = 0;
			for(ll i = 1; i <= t; i ++ ) if(s & (1 << i)) cnt ++ ;
			cout << cnt << endl;
		}
	}
	return 0;
}
2024/11/18 22:02
加载中...