萌新求助线段树
查看原帖
萌新求助线段树
195209
Cripple_Abyss楼主2021/8/12 21:44
#include <cstdio>
#include <iostream>
using namespace std;
inline void in(int &x) {
	x=0;
	int f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	x*=f;
}
inline void out(int x) {
	if (x<0) putchar('-'),x=-x;
	if (x>9) out(x/10);
	putchar(x%10+'0');
}
const int N=1e5+5;
struct Tree {
	int x,la;
}a[N<<2];
int n,l,m;
int ls(int u) {return u<<1;}
int rs(int u) {return u<<1|1;}
void Pushup(int u) {a[u].x=a[ls(u)].x|a[rs(u)].x;}
void Build(int u,int l,int r) {
	a[u].x=1,a[u].la=0;
	if (l>=r) return;
	int mid=l+r>>1;
	Build(ls(u),l,mid);
	Build(rs(u),mid+1,r);	
}
void Pushdown(int u) {
	if (!a[u].la) return;
	a[ls(u)].la=a[u].la;
	a[rs(u)].la=a[u].la;
	a[ls(u)].x=(1<<a[u].la);
	a[rs(u)].x=(1<<a[u].la);
	a[u].la=0;
}
void Updata(int u,int l,int r,int L,int R,int x) {
	if (L<=l&&r<=R) {
		a[u].x=(1<<x);
		a[u].la=x;
		return; 
	}
	Pushdown(u);
	int mid=l+r>>1;
	if (mid>=L) Updata(ls(u),l,mid,L,R,x);
	if (mid<R) Updata(rs(u),mid+1,r,L,R,x);
	Pushup(u);
}
int cal(int t) {
	int s=0;
	while (t) {
		s+=(t&1);
		t>>=1;
	} 
	return s;
}
int Query(int u,int l,int r,int L,int R) {
	if (L<=l&&r<=R) return a[u].x;
	Pushdown(u);
	int mid=l+r>>1,ans=0;
	if (mid>=L) ans|=Query(ls(u),l,mid,L,R);
	if (mid<R) ans|=Query(rs(u),mid+1,r,L,R);
	return ans;
}
int main() {
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	in(n),in(l),in(m);
	Build(1,1,n);
	while (m--) {
		char op=getchar();
		int x,y;
		while (op<'A'||op>'Z') op=getchar();
		in(x),in(y);
		if (x>y) swap(x,y);
		if (op=='P') out(cal(Query(1,1,n,x,y))),putchar('\n');
		if (op=='C') {
			int z;
			in(z);
			Updata(1,1,n,x,y,z);
		}
	}
	return 0;
}

全 WA 求助

2021/8/12 21:44
加载中...