分块玄关,求调!
查看原帖
分块玄关,求调!
700122
hnxxwpf楼主2024/8/30 11:06
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 1;
int l, t, o;
struct Block
{
	int size, a[maxn], s[maxn], b[maxn], belong[maxn]; //b数组类似于lazy tag 
	void init()
	{
		size = pow(l, 0.5);
		for(int i = 1; i <= l; ++i)
		{
			a[i] = s[i] = 1;
			b[i] = 0;
			belong[i] = (i - 1)/ size + 1;
		}
	}
	void add(int x, int y, int k)
	{
		int st = belong[x], ed = belong[y];
		if(st == ed)
		{
			for(int i = x; i <= y; ++i)
			{
				b[i] = 0;
				a[i] = k;
			}
			s[st] = 0;
			for(int i = (st - 1) * size + 1; i <= min(ed * size,l); ++i)
			{
				s[ed] |= b[i] ? b[i] : a[i];
			}
			return;
		}
		for(int i = x; belong[i] == st; ++i)
		{
			b[i] = 0;
			a[i] = k;
		}
		s[st] = 0;
		for(int i = (st - 1) * size + 1; i <= min(st * size,l); ++i)
		{
			s[st] |= b[i] ? b[i] : a[i];
		}
		for(int i = st + 1; i < ed; ++i)
		{
			s[i] = b[i] = k;
		}
		for(int i = y; belong[i] == ed; --i)
		{
			b[i] = 0;
			a[i] = k;
		}
		s[ed] = 0;
		for(int i = (ed - 1) * size + 1; i <= min(ed * size,l); ++i)
		{
			s[ed] |= b[i] ? b[i] : a[i];
		}
	}
	int query(int x, int y)
	{
		int st = belong[x], ed = belong[y], res = 0;
		if(st == ed)
		{
			for(int i = x; i <= y; ++i)
			{
				res |= b[i] ? b[i] : a[i];
			}
			return res;
		}
		for(int i = x; belong[i] == st; ++i)
		{
			res |= b[i] ? b[i] : a[i];
		}
		for(int i = st + 1; i < ed; ++i)
		{
			res |= s[i];
		}
		for(int i = y; belong[i] == ed; --i)
		{
			res |= b[i] ? b[i] : a[i];
		}
		return res;
	}
	int count(int a, int b)
	{
		int x = query(a, b), res = 0;
		while(x)
		{
			res += (x & 1);
			x >>= 1;
		}
		return res;
	}
}; 
Block block;
int main()
{
	scanf("%d %d %d", &l, &t, &o);
	block.init();
	for(int i = 0; i < o; ++i)
	{
		char opt;
		int a, b;
		scanf(" %c %d %d", &opt, &a, &b);
		if(a > b)
		{
			swap(a, b);
		}
		if(opt == 'C')
		{
			int c;
			scanf("%d", &c);
			block.add(a, b, 1 << c - 1);
		}
		else
		{
			printf("%d\n", block.count(a, b));
		}
	}
	return 0;
}

2024/8/30 11:06
加载中...