线段树.急问,再问:为什么modify()里面必须加a[k].sum==0这句
查看原帖
线段树.急问,再问:为什么modify()里面必须加a[k].sum==0这句
285961
魏老师楼主2021/4/8 05:52
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010*4;
struct STree{
	int l,r,sum;
}a[maxn];//线段树结点
int n,m;//n个数,m次修改  
void build(int k,int p,int q)//建立线段树 
{
	a[k].l=p;a[k].r=q;
	if(p==q)//建树时到叶结点返回 
	{
		a[k].sum=1;//开始只有1棵树 
		return;	
	}
	int mid=p+q>>1;
	build(k<<1,p,mid);
	build(k<<1|1,mid+1,q);
	a[k].sum=a[k<<1].sum+a[k<<1|1].sum;
}

void modify(int k,int x,int y)//区间[x,y]的树拔光 
{
	if(a[k].l>y || a[k].r<x || a[k].sum == 0) return;//范围外直接返回
	if(a[k].l>=x && a[k].r<=y)//完全包含 
	{
		a[k].sum=0;//将此区间的树全部拔光 
		return;	
	} 
	if(x<=a[k<<1].r) modify(k<<1,x,y);
	if(y>=a[k<<1|1].l) modify(k<<1|1,x,y);
	a[k].sum=a[k<<1].sum+a[k<<1|1].sum;//返回更新所有上部结点 
}

int main()
{
	cin>>n>>m; 
	build(1,0,n);
	for(int i=1;i<=m;i++)
	{
		int x,y;//区间[x,y]上的树砍掉 
		cin>>x>>y;
		modify(1,x,y);
	}
	cout<<a[1].sum<<" ";
	return 0; 
}
2021/4/8 05:52
加载中...