区间

题目描述

给出n个区间,一些区间被另一些区间包含,求出最大的层数。

 

输入:

    第一行为整数n,接下来n行,每行两个整数x,y(0<=x<=y<=1000000),表示一个区间的左右端点。

 

输出:

输出一行只有一个整数,即最大层数。

 

样例输入:

6

2 10

6 9

1 2

7 8

1 8

8 10

 

样例输出:

3


平衡树的题目,就是这样的,没什么好说的,对于此题,不难想到将左端点排序,右端点依次加入到平衡树中(右端点在树中有序),然后统计其右儿子中可以达到的最大值就可以了。

但是我们考虑到有左端点或右端点相同的情况,所以排序时将左端点作为第一关键字(从小到大),把右端点作为第二关键字(从大到小)

然后维护一些域乱搞就行了……


#include <cstdio>
#include <iostream>
#include <algorithm>
#define MaxN 100010
using namespace std;
int n,ans;
struct line
{
	int x,y;
	inline void read()
	{
		scanf("%d%d",&x,&y);
	}
}a[MaxN];
bool cmp(line a,line b)
{
	if(a.x==b.x)
		return a.y>b.y;
	else return a.x<b.x;
}
struct SplayTree
{
	#define setc(x,s,d) (c[p[s]=x][d]=s,update(x))
	#define ch(x) (c[p[x]][1]==x)
	int a[MaxN],c[MaxN][2],p[MaxN];
	int f[MaxN],m[MaxN];
	int rt,tot;
	inline void update(int x)
	{
		m[x]=f[x];
		for(int i=0;i<2;i++)
			m[x]=max(m[x],m[c[x][i]]);
	}
	inline void SetRoot(int x)
	{
		a[rt=tot=1]=x;
		c[1][0]=c[1][1]=0;
		f[1]=m[1]=1;
	}
	inline void rotate(int x)
	{
		int f=p[x];
		bool d=ch(x);
		setc(f,c[x][!d],d);
		if(p[f])
			setc(p[f],x,ch(f));
		else p[x]=p[f];
		setc(x,f,!d);
	}
	inline void splay(int x)
	{
		while(p[x])
			if(!p[p[x]])
				rotate(x);
			else if(ch(x)==ch(p[x]))
				rotate(p[x]),rotate(x);
			else rotate(x),rotate(x);
		rt=x;
	}
	inline int find(int x)
	{
		int t=rt;
		bool d;
		for(;;)
		{
			if(x==a[t]) break;
			if(c[t][d=(x>a[t])])
				t=c[t][d];
			else break;
		}
		return t;
	}
	inline int insert(int x)
	{
		int pos=find(x);
		if(x==a[pos])
			splay(pos),
			f[pos]=max(f[pos]+1,m[c[pos][1]]+1),
			update(pos);
		else
		{
			a[++tot]=x;
			setc(pos,tot,x>a[pos]);
			splay(tot);
			f[tot]=m[c[tot][1]]+1;
			update(tot);
		}
		return m[rt];
	}
}SP;
inline void init()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		a[i].read();
}
inline void work()
{
	sort(a,a+n,cmp);
	SP.SetRoot(a[0].y);
	for(int i=1;i<n;i++)
		ans=max(ans,SP.insert(a[i].y));
	cout<<ans<<endl;
}
int main()
{
	init();
	work();
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bootstrap区间是指通过Bootstrap重采样方法,通过对原始样本进行有放回抽样,生成多个新的样本集,然后通过统计分析这些新样本集的结果,得到参数的分布情况,并进一步计算置信区间。Bootstrap方法可以用来估计参数的置信区间,即参数的估计值的不确定性范围。 通过Bootstrap方法,可以通过以下步骤计算置信区间: 1. 从原始样本中有放回地抽取一个样本,形成一个新的样本集。 2. 根据新的样本集计算所需的统计量,比如均值或中位数。 3. 重复进行步骤1和步骤2,生成多个新的样本集,并计算相应的统计量。 4. 根据生成的统计量的分布情况,计算置信区间,一般常用百分位法来计算置信区间的下限和上限。 通过Bootstrap重采样方法,可以更好地估计样本的参数,同时考虑了样本的不确定性,进而提供了参数的置信区间估计。 Bootstrap方法在统计学和机器学习领域有广泛的应用,可以用于估计各种统计量的置信区间,进一步进行参数估计和假设检验。 在实际应用中,Bootstrap方法可以帮助我们更好地理解样本数据的分布情况,从而更准确地进行数据分析和决策。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Bootstrap重采样进行参数估计 - 置信区间](https://blog.csdn.net/qq_33934427/article/details/124030782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值