求助,只过了hack
查看原帖
求助,只过了hack
661913
liwenxi1145144444楼主2024/12/28 12:27
#include<bits/stdc++.h>
#define qmi int mid=(tree[k].l+tree[k].r)>>1
#define ls k>>1
#define rs k>>1|1
using namespace std;
int l,t,o;
struct node{
	int l,r,qz[35],lazy;
}tree[400005];
void build(int k,int l,int r){
	tree[k].l=l;
	tree[k].r=r;
	tree[k].qz[1]=r-l+1;
	if(l==r){
		return ;
	}
	qmi;
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void push_down(int k){
	if(tree[k].lazy){
		tree[ls].lazy=tree[rs].lazy=tree[k].lazy;
		memset(tree[ls].qz,0,sizeof(tree[ls].qz));
		tree[ls].qz[tree[k].lazy]=tree[ls].r-tree[ls].l+1;
		memset(tree[rs].qz,0,sizeof(tree[rs].qz));
		tree[rs].qz[tree[k].lazy]=tree[rs].r-tree[rs].l+1;
		tree[k].lazy=0;
	}
	return ;
}
void push_up(int k){
	for(int i=1;i<=30;i++){
		tree[k].qz[i]=tree[ls].qz[i]+tree[rs].qz[i];
	}
}
int init(int a[]){
	int sum=0;
	for(int i=1;i<=30;i++){
		sum+=(a[i]>0);
	}
	return sum;
}
void update(int k,int l,int r,int c){
	if(tree[k].l>=l&&tree[k].r<=r){
		memset(tree[k].qz,0,sizeof(tree[k].qz));
		tree[k].qz[c]=tree[k].r-tree[k].l+1;
		tree[k].lazy=c;
		return ;
	}
	push_down(k);
	qmi;
	if(l<=mid){
		update(ls,l,mid,c);
	}
	if(r>mid){
		update(rs,mid+1,r,c);
	}
	push_up(k);
}
int query(int k,int l,int r){
	if(tree[k].l>=l&&tree[k].r<=r){
		return init(tree[k].qz);
	}
	push_down(k);
	qmi;
	int ans=0;
	if(l<=mid){
		ans+=query(ls,l,mid);
	}
	if(r>mid){
		ans+=query(rs,mid+1,r);
	}
	return ans;
}
int main(){
//	freopen("b.in","r",stdin);
//	freopen("b.out","w",stdout);
	cin>>l>>t>>o;
	build(1,1,l);
	while(o--){
		char ch;
		cin>>ch;
		if(ch=='C'){
			int x,y,z;
			cin>>x>>y>>z;
			if(x>y){
				swap(x,y);
			} 
			update(1,x,y,z);
		}else{
			int x,y;
			cin>>x>>y;
			if(x>y){
				swap(x,y);
			}
			cout<<query(1,x,y)<<"\n";
		}
	}
	return 0;
}
2024/12/28 12:27
加载中...