线段树,样例过不去,求助!!!
查看原帖
线段树,样例过不去,求助!!!
718685
lym2022楼主2024/10/3 09:19
#include<bits/stdc++.h>
using namespace std;

const int N = 1 << 18;

int n,t,o,f[N],sum[N],tag[N];

void pushup(int u) {
	sum[u] = sum[u*2] | sum[u*2 + 1];
}

void pushdown(int u,int l,int r) {
	if(tag[u]) {
		sum[u*2] = sum[u*2 | 1] = 1 << (tag[u] - 1);
		tag[u*2] = tag[u*2 | 1] = tag[u];
		tag[u] = 0; 
	}
}

void build(int u,int l,int r) {
	tag[u] = 0;
	if(l == r) {
		sum[u] = 1;
		return;
	}
	int mid = (l + r) >> 1;
	build(u*2,l,mid);
	build(u*2 + 1,mid + 1,r);
	pushup(u);
}

void update(int x,int y,int k,int u,int l,int r) {
	if(x <= l && r <= y) {
		tag[u] = k;
		sum[u] = (1 << (k - 1));
		return;
	}
	pushdown(u,l,r);
	int mid = (l + r) >> 1;
	if(y <= mid) {
		update(x,y,k,u*2,l,mid);
	}else{
		if(x > mid) {
			update(x,y,k,u*2 + 1,mid+1,r);
		}else {
			update(x,y,k,u*2,l,mid);
			update(x,y,k,u*2 + 1,mid+1,r);
		}
	}
	pushup(u);
}

int query(int x,int y,int u,int l,int r) {
	if(x <= l && r <= y) return sum[u];
	pushdown(u,l,r);
	int mid = (l + r) >> 1;
	if(y <= mid) return query(x,y,u*2,l,mid);
	if(x > mid) return query(x,y,u*2 + 1,mid+1,r);
	return query(x,y,u*2,l,mid) + query(x,y,u*2 + 1,mid+1,r);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> t >> o;
	for(int i = 1;i<=n;i++) {
		f[i] = 1;
	}
	build(1,1,n);
	while(o--) {
		char op;
		int a,b;
		cin >> op >> a >> b;
		if(a > b) {
			swap(a,b);
		}
		if(op == 'C') {
			int c;
			cin >> c;
			update(a,b,c,1,1,n); 
		}else {
			cout << query(a,b,1,1,n) << '\n';
		}
	}
	return 0;
}
2024/10/3 09:19
加载中...