求助,线段树,全部MLE是为什么
查看原帖
求助,线段树,全部MLE是为什么
383992
bub4楼主2024/8/4 01:36
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<tuple>
int n, m, q;
std::string letter;
const int MAXSIZE = 1e5 + 10;
int sum[4*MAXSIZE], tag[4*MAXSIZE];
bool same[4*MAXSIZE];
//	处理字符串
std::pair<int, int> toint(std::string& s) {
	int res = 0;
	int tag = 0;
	for (int i = 0; i < n; ++i) {
		if (s[i] == '1') {
			res = (res << 1) + 1;
		}
		else if (s[i] == '0') {
			res = (res << 1);
		}
		else {
			//	'?' 先记作1
			res = (res << 1) + 1;
			tag |= 1 << (n - 1 - i);
		}
	}
	return { res, tag };
}
void up(int i) {
	same[i] = same[i << 1] && same[(i << 1) | 1];
	if (!same[i])
		return;
	if (((sum[i << 1] ^ sum[(i << 1) | 1]) & ~(tag[i << 1] | tag[(i << 1) | 1])) != 0) {
		same[i] = false;
		return;
	}
	sum[i] = sum[i << 1] & sum[(i << 1) | 1];
	//	两个都是问号 才能向上合并 '?'
	tag[i] = tag[i << 1] & tag[(i << 1) | 1];
}
void build(int i, int l, int r) {
	if (l == r) {
		std::cin >> letter;
		std::tie(sum[i], tag[i]) = toint(letter);
		same[i] = true;
		return;
	}
	int m = l + ((r - l) >> 1);
	build(i << 1, l, m);
	build((i << 1) | 1, m + 1, r);
	up(i);
}
void update(int i, int l, int r, int ql, int qr, std::string& s) {
	if (ql <= l && r <= qr) {
		std::tie(sum[i], tag[i]) = toint(s);
		same[i] = 1;
		return;
	}
	int m = l + ((r - l) >> 1);
	if (m >= ql) update(i << 1, l, m, ql, qr, s);
	if (m < qr) update((i << 1) | 1, m + 1, r, ql, qr, s);
	up(i);
}
std::tuple<bool, int, int> query(int i, int l, int r, int ql, int qr) {
	if (ql <= l && r <= qr) {
		return { same[i], sum[i], tag[i] };
	}
	int m = l + ((r - l) >> 1);
	std::tuple<bool, int, int> a, b;
	if (m >= ql) a = query(i << 1, l, m, ql, qr);
	if (m < qr) b = query((i << 1) | 1, m + 1, r, ql, qr);
	if (m < ql) return b;
	if (m >= qr) return a;
	if (std::get<0>(a) && std::get<0>(b)) {
		if (((std::get<1>(a) ^ std::get<1>(b)) & ~(std::get<2>(a) | std::get<2>(b))) != 0) {
			return { false, 0 , 0 };
		}
		return { true, std::get<1>(a) & std::get<1>(b), std::get<2>(a) & std::get<2>(b) };
	}
	return { false, 0, 0 };
}
int cnt(int x) {
	int res = 1;
	while (x) {
		res <<= 1;
		x &= x - 1;
	}
	return res;
}
int main() {
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	std::cin >> n >> m >> q;
	build(1, 1, m);
	int res = 0;
	for (int i = 0, c, a, b; i < q; ++i) {
		std::cin >> c >> a;
		if (c == 0) {
			std::cin >> b;
			auto t = query(1, 1, n, a, b);
			if (std::get<0>(t)) {
				res ^= cnt(std::get<2>(t));
			}
		}
		else {
			std::cin >> letter;
			update(1, 1, n, a, a, letter);
		}
	}
	std::cout << res << std::endl;
	return 0;
}
2024/8/4 01:36
加载中...