线段树40pts玄关求条
查看原帖
线段树40pts玄关求条
934048
ni_ju_ge楼主2024/8/28 16:39
#include<iostream>
using namespace std;
int a[100001],n,l,r,x,k,s1,s2;
//void tree_print(int left,int right,int pos)
//{
//	cout<<"["<<left<<" "<<right<<"]="<<a[pos]<<endl;
//	if(left==right)return;
//	int mid=(left+right)/2;
//	tree_print(left,mid,pos*2+1);
//	tree_print(mid+1,right,pos*2+2);
//}
void tree_sum(int left,int right,int pos)
{
	if(left==right)
	{
		if(a[pos]==2)s1++;
		return;
	}
	int mid=(left+right)/2;
	tree_sum(left,mid,pos*2+1);
	tree_sum(mid+1,right,pos*2+2);
}
void tree_plus(int left,int right,int num,int pos)
{
	if(a[pos]==0)a[pos]=2;
	if(left==right)return;
	int mid=(left+right)/2;
	if(num<=mid)tree_plus(left,mid,num,pos*2+1);
	if(num>mid)tree_plus(mid+1,right,num,pos*2+2);
}
void tree_delete(int left,int right,int num,int pos)
{
	if(a[pos]==2)
	{
		if(left==right)s2++;
		a[pos]=0;
	}
	if(a[pos]==1)a[pos]=0;
	if(left==right)return;
	int mid=(left+right)/2;
	if(num<=mid)tree_delete(left,mid,num,pos*2+1);
	if(num>mid)tree_delete(mid+1,right,num,pos*2+2);
}
int main()
{
	cin>>k>>n;
//	tree_print(0,k,0);
	for(int j=0;j<=2*k+10;j++)a[j]=1;
	for(int i=1;i<=n;i++)
	{
		cin>>x>>l>>r;
		if(x==1)
		{
			for(int j=l;j<=r;j++)tree_plus(0,k,j,0);
//			tree_print(0,k,0);
		}
		if(x==0)
		{
			for(int j=l;j<=r;j++)tree_delete(0,k,j,0);
//			tree_print(0,k,0);
		}
	}
	tree_sum(0,k,0);
	cout<<s1<<endl<<s2;
}
2024/8/28 16:39
加载中...