90pts,求 hack(悬 2 关)
查看原帖
90pts,求 hack(悬 2 关)
809729
SJZ2010楼主2023/11/5 15:38

WA on #7

不知道哪里错了……

Code:

#include <iostream>
#include <utility>
#include <string>

#define lson(now) (now << 1)
#define rson(now) ((now << 1) | 1)

typedef long long ll;

const int N = 65536;

bool res[N << 1];

struct Segment_Tree
{
	int cov[N << 3], rev[N << 3];

	Segment_Tree()
	{
		for (int &i : cov)
			i = -1;
	}

	void pushdown(int now)
	{
		if (~cov[now])
		{
			cov[lson(now)] = cov[rson(now)] = cov[now];
			rev[lson(now)] = rev[rson(now)] = 0;
			cov[now] = -1;
		}
		if (rev[now])
		{
			rev[lson(now)] ^= 1;
			rev[rson(now)] ^= 1;
			rev[now] = 0;
		}
	}

	void update_rev(int now, int l, int r, int s, int t)
	{
		if (s > r || t < l || l > r)
			return;
		if (l <= s && t <= r)
		{
			rev[now] ^= 1;
			return;
		}
		pushdown(now);
		int mid = (s + t) >> 1;
		if (l <= mid)
			update_rev(lson(now), l, r, s, mid);
		if (mid < r)
			update_rev(rson(now), l, r, mid + 1, t);
	}
	void update_cov(int now, int l, int r, int s, int t, bool delta)
	{
		if (s > r || t < l || l > r)
			return;
		if (l <= s && t <= r)
		{
			cov[now] = delta;
			rev[now] = 0;
			return;
		}
		pushdown(now);
		int mid = (s + t) >> 1;
		if (l <= mid)
			update_cov(lson(now), l, r, s, mid, delta);
		if (mid < r)
			update_cov(rson(now), l, r, mid + 1, t, delta);
	}

	void build(int now, int s, int t)
	{
		if (s == t)
		{
			if (~cov[now])
				res[s] = cov[now];
			if (rev[now])
				res[s] ^= rev[now];
			return;
		}
		int mid = (s + t) >> 1;
		pushdown(now);
		build(lson(now), s, mid);
		build(rson(now), mid + 1, t);
	}
} T;

char opt;
std::string range;
std::pair < int, int > Range;

std::pair < int, int > Get_Range(std::string str) // 处理字符串,变成区间左右端点
{
	int i, l(0), r(0);
	for (i = 1; str[i] >= '0' && str[i] <= '9'; i++)
		l = (l << 1) + (l << 3) + (str[i] ^ '0');
	while (str[i] < '0' || str[i] > '9')
		i++;
	for (; str[i] >= '0' && str[i] <= '9'; i++)
		r = (r << 3) + (r << 1) + (str[i] ^ '0');
	if (str[0] == '(')
		l = (l << 1) + 1;
	else
		l <<= 1;
	if (str[str.size() - 1] == ')')
		r = (r << 1) - 1;
	else
		r =  (r << 1);
	return std::make_pair(l, r);
}
void Get_Ans()
{
	int i;
	bool empty = 1;
	for (i = 1; i <= (N - 1) << 1; i++)
    {
		if (res[i] && !res[i - 1])
		{
			empty = 0;
			if (i & 1)
				std::cout << '(' << ((i - 1) >> 1) << ',';
			else
				std::cout << '[' << (i >> 1) << ',';
		}
		if (res[i] && !res[i + 1])
		{
			if (i & 1)
				std::cout << ((i + 1) >> 1) << ')' << ' ';
			else
				std::cout << (i >> 1) << ']' << ' ';
    	}
    }
    if (empty)
    	std::cout << "empty set";
}

int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	std::cout.tie(0);
	while (std::cin >> opt >> range)
	{
		Range = Get_Range(range);
		if (opt == 'U')
			T.update_cov(1, Range.first, Range.second, 1, (N << 1) - 2, 1);
		else if (opt == 'I')
		{
			T.update_cov(1, 1, Range.first - 1, 1, (N - 1) << 1, 0);
			T.update_cov(1, Range.second + 1, (N - 1) << 1, 1, (N - 1) << 1, 0);
		}
		else if (opt == 'D')
			T.update_cov(1, Range.first, Range.second, 1, (N << 1) - 2, 0);
		else if (opt == 'C')
		{
			T.update_cov(1, 1, Range.first - 1, 1, (N - 1) << 1, 0);
			T.update_cov(1, Range.second + 1, (N - 1) << 1, 1, (N - 1) << 1, 0);
			T.update_rev(1, Range.first, Range.second, 1, (N - 1) << 1);
		}
		else if (opt == 'S')
			T.update_rev(1, Range.first, Range.second, 1, (N - 1) << 1);
	}
	T.build(1, 1, (N - 1) << 1);
	Get_Ans();
	return 0;
}
2023/11/5 15:38
加载中...