求调,代码短
查看原帖
求调,代码短
326254
LonginusMonkey楼主2023/10/29 21:55

样例没过

#include<bits/stdc++.h>
using namespace std;
struct node{
	int lson, rson;
	int Left, Right;
	int tag, sum;
}tree[600010];
int tot = 0;
void freetag(int index) {
	int lson = tree[index].lson;
	int rson = tree[index].rson;
	int Right = tree[index].Right;
	int Left = tree[index].Left;
	if(tree[index].tag == 1) {
		tree[lson].tag = 1;
		tree[rson].tag = 1;
		tree[index].tag = 0;
		tree[index].sum = Right-Left+1;
	} else if(tree[index].tag == 2){
		tree[lson].tag = 2;
		tree[rson].tag = 2;
		tree[index].tag = 0;
		tree[index].sum = 0;
	}
}
void add(int &index, int l, int r, int left, int right, int k) {
//	cout<<l<<" " <<r<<" "<<left<<" " <<right<<"debug"<<endl;
	if(!index) {
		index = ++tot;
		tree[index].Left = l;
		tree[index].Right = r;
	}
	freetag(index);
	if(l >= left && r <= right) {
		if(k==1) tree[index].tag = 2;
		else tree[index].tag = 1;
		return;
	}
	if(l > right || r < left) {
		return;
	}
	int mid = l + r >> 1;
	add(tree[index].lson, l, mid, left, right, k);
	add(tree[index].rson, mid+1, r, left, right, k);
	freetag(tree[index].lson);
	freetag(tree[index].rson);
	tree[index].sum = tree[tree[index].lson].sum + tree[tree[index].rson].sum;
}
int main() {
	int n, q; cin >> n >> q;
	int root = 0;
	add(root, 1, n, 1, n, 2);
//	if(tree[root].tag) freetag(root);
//	cout << tree[root].sum << endl;
	for(int i=1; i<=q; ++i) {
		int l, r, k; cin >> l >> r >> k;
		add(root, 1, n, l, r, k);
		if(tree[root].tag) freetag(root);
		cout << tree[root].sum << endl;
	}
	return 0;
}
2023/10/29 21:55
加载中...