求助
查看原帖
求助
233972
秋水1024楼主2021/7/17 11:43
#include<iostream>
using namespace std;
const int N=100086;
int f[4*N],add[4*N],n,m,t,u,v,w;
char c;
void build(int k,int l,int r){
	if(l==r){
		f[k]=1<<1;return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	f[k]=f[k*2]|f[k*2+1];
} 

void push(int k,int l,int r){
	f[k*2]=add[k];
	add[k*2]=add[k];
	f[k*2+1]=add[k];
	add[k*2+1]=add[k]; 
	add[k]=0;
}
void tadd(int k,int l,int r,int x,int y,int v){
	//if(y<l||x>r)return;
	if(y>=r&&x<=l){
		f[k]=v;cout<<l<<" "<<f[k]<<endl;
		add[k]=v;
		return;
	}
	push(k,l,r); 
	int mid=(l+r)/2;
	if(x<=mid)tadd(k*2,l,mid,x,y,v);
	if(y>mid)tadd(k*2+1,mid+1,r,x,y,v);
	f[k]=f[k*2]|f[k*2+1];
}
int tout(int k,int l,int r,int x,int y){
	//if(y<l||x>r)return 0;
	if(y>=r&&x<=l)return f[k];
	push(k,l,r); 
	int mid=(l+r)/2,sum=0;
	if(x<=mid)sum|=tout(k*2,l,mid,x,y);
	if(y>mid)sum|=tout(k*2+1,mid+1,r,x,y);
	return sum;
}
int main()
{
	cin>>n>>t>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>c;
		if(c=='C'){
			cin>>u>>v>>w;
			if(u>v)swap(u,v);
			tadd(1,1,n,u,v,1<<w);
			cout<<tout(1,1,n,2,2);
		}
		if(c=='P'){
			cin>>u>>v;
			if(u>v)swap(u,v);
			int num=tout(1,1,n,u,v),ans=0;
			for(int i=0;i<=t;i++){if(num&(1<<i))ans++;}
			cout<<num<<" "<<ans<<endl;
		}
	}
	return 0;
} 

实在调不出来了555

2021/7/17 11:43
加载中...