ODT求条
查看原帖
ODT求条
602372
Brilliant11001楼主2024/1/25 16:39

不知道哪里写假了……但样例能过

```cpp
#include <iostream>
#include <set>
#include <cstring>
#include <vector>
#include <cstdio>

using namespace std;

struct node{
	mutable int l, r;
	mutable bool val;
	node(int l_, int r_, bool val_): l(l_), r(r_), val(val_) {}
	node(int L): l(L) {}
	bool operator <(const node &o) const {
		return l < o.l;
	}
};

set<node> s;
typedef set<node>::iterator IT;
int n, m;

IT split(int pos) {
	IT it = s.lower_bound(node(pos));
	if(it != s.end() && it->l == pos) return it;
	--it;
	if(it->r < pos) return s.end();
	int l = it->l, r = it->r;
	bool v = it->val;
	s.erase(it);
	s.insert(node(l, pos - 1, v));
	return s.insert(node(pos, r, v)).first;
}

IT assign(int l, int r, bool k) {
	IT itr = split(r + 1), itl = split(l);
	s.erase(itl, itr);
	return s.insert(node(l, r, k)).first;
}

void change1(int l, int r) {
	IT itr = split(r), itl = split(l);
	for(register IT it = itl; it != itr; ++it) {
		if(it->val) it->l--, it->l = max(1, it->l);
		else it->r--;
	}
}

void change2(int l, int r) {
	IT itr = split(r + 1), itl = split(l + 1);
	for(register IT it = itl; it != itr; ++it) {
		if(it->val) it->r++;
		else it->l++;
	}
}

void change3(int l, int r) {
	IT itr = split(r), itl = split(l);
	for(register IT it = itl; it != itr; ++it) {
		if(it->val) it->r--;
		else it->l--, it->l = max(1, it->l);
	}
}

void change4(int l, int r) {
	IT itr = split(r + 1), itl = split(l + 1);
	for(register IT it = ++itl; it != itr; ++it) {
		if(it->val) it->l++;
		else it->r++;
	}
}

void update() {
	IT it2 = s.begin();
	++it2;
	for(register IT it1 = s.begin(); it2 != s.end(); ) {
		
		if(it1->l > it1 -> r || it1->r == 0) it2 = it1 = s.erase(it1), it2++;
		else {
			if(it1->val == it2->val) {
				it2 = it1 = assign(it1->l, it2->r, it1->val);
				++it2;
				continue;
			}
			++it1, ++it2;
		}
	}
}

int get_sum(int l, int r) {
	IT itr = split(r + 1), itl = split(l);
	int res = 0;
	for(register IT it = itl; it != itr; ++it) {
		res += it->val * (it->r - it->l + 1); 
	}
	return res;
}

int main() {
	int ans = 0;
	scanf("%d%d", &n, &m);
	int las, a, laspos = 1;
	scanf("%d", &las);
	a = las;
	for(int i = 2; i <= n; i++) {
		scanf("%d", &a);
		if(a != las) {
			s.insert(node(laspos, i - 1, las));
			las = a, laspos = i;
		}
	}
	s.insert(node(laspos, n, a));
//	puts("---------");
//	for(auto i : s) printf("%d %d %d\n", i.l, i.r, i.val);
//	puts("---------");
	int op, l, r;
	while(m--) {
		scanf("%d%d%d", &op, &l, &r);
		l = l ^ ans;
		r = r ^ ans;
		if(l > r) swap(l, r);
		if(op == 1) {
			assign(l, r, 0);
		}
		else if(op == 2) {
			assign(l, r, 1);
		}
		else if(op == 3) {
			change1(l, r);
		}
		else if(op == 4) {
			change2(l, r);
		}
		else if(op == 5) {
			change3(l, r); 
		}
		else if(op == 6) {
			change4(l, r);
		}
		else {
			ans = get_sum(l, r);
			printf("%d\n", ans);
		}
		update();
		update();
//		puts("---------");
//		for(auto i : s) printf("%d %d %d\n", i.l, i.r, i.val);
//		puts("---------");
	}
	return 0;
}
/*
5 7
1 0 0 0 1
3 3 4
6 2 4
2 1 2
1 3 5
1 1 5
7 5 1
2 5 2
*/
2024/1/25 16:39
加载中...