[Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

本文介绍了一种解决区间覆盖问题的方法,使用二分答案+线段树策略,并通过离散化减少内存消耗,最终实现AC。

额...

首先,看到这道题,第一想法就是二分答案+线段树...

兴高采烈的认为我一定能AC,之后发现n是500000...

nlog^2=80%,亲测可过...

由于答案是求满足题意的最大长度-最小长度最小,那么我们可以考虑将区间按长度排序

之后,因为我们是需要最大最小,所以,我们必定选择在排完序的区间上取连续的一段是最优情况(起码不会比别的差)

因此,考虑双指针扫一下就可以了...

是不是很水?

由于懒得写离散化,一开始写的动态开点线段树,我*****什么鬼?mle?!256mb开不下!

loj+洛谷上95%,附上代码...

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
#define N 500005
#define lson l,m,tr[rt].ls
#define rson m+1,r,tr[rt].rs
#define PushUp(rt) tr[rt].maxx=max(tr[tr[rt].ls].maxx,tr[tr[rt].rs].maxx)
struct no
{
	int ls,rs,maxx,add;
}tr[N*40];
int n,m,ans,cnt;
struct node
{
	int l,r,len;
}a[N];
bool cmp(const node &a,const node &b)
{
	return a.len<b.len;
}
void PushDown(int rt)
{
	if(tr[rt].add)
	{
		if(!tr[rt].ls)tr[rt].ls=++cnt;
		if(!tr[rt].rs)tr[rt].rs=++cnt;
		tr[tr[rt].ls].maxx+=tr[rt].add;
		tr[tr[rt].rs].maxx+=tr[rt].add;
		tr[tr[rt].ls].add+=tr[rt].add;
		tr[tr[rt].rs].add+=tr[rt].add;
		tr[rt].add=0;
	}
}
void Update(int L,int R,bool c,int l,int r,int &rt)
{
	if(!rt)rt=++cnt;
	if(L<=l&&r<=R)
	{
		tr[rt].maxx+=c?1:-1;
		tr[rt].add+=c?1:-1;
		return ;
	}
	PushDown(rt);
	int m=(l+r)>>1;
	if(m>=L)Update(L,R,c,lson);
	if(m<R)Update(L,R,c,rson);
	PushUp(rt);
}
int main()
{
	ans=1<<30;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].l,&a[i].r);
		a[i].len=a[i].r-a[i].l;
	}
	sort(a+1,a+n+1,cmp);
	int l=1,r=0,rot=0;
	while(r<n)
	{
		while(tr[rot].maxx<m&&r<n){r++;Update(a[r].l,a[r].r,1,0,1<<30,rot);}
		if(tr[rot].maxx<m)break;
		while(tr[rot].maxx>=m&&l<n){Update(a[l].l,a[l].r,0,0,1<<30,rot);l++;}
		ans=min(a[r].len-a[l-1].len,ans);
	}
	printf("%d\n",ans==1<<30?-1:ans);
	return 0;
}

  这显然就不能AC,那么我们可以考虑用一下离散化...

离散化后,线段树的空间复杂度从(nlog(1<<30))变成(nlog(n*2))之后,空间就降下来了...

附上AC代码...

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
#define N 500005
#define lson l,m,tr[rt].ls
#define rson m+1,r,tr[rt].rs
#define PushUp(rt) tr[rt].maxx=max(tr[tr[rt].ls].maxx,tr[tr[rt].rs].maxx)
struct no
{
	int ls,rs,maxx,add;
}tr[N*10];
int p[N<<1];
int n,m,ans,cnt;
struct node
{
	int l,r,len;
}a[N];
bool cmp(const node &a,const node &b)
{
	return a.len<b.len;
}
void PushDown(int rt)
{
	if(tr[rt].add)
	{
		if(!tr[rt].ls)tr[rt].ls=++cnt;
		if(!tr[rt].rs)tr[rt].rs=++cnt;
		tr[tr[rt].ls].maxx+=tr[rt].add;
		tr[tr[rt].rs].maxx+=tr[rt].add;
		tr[tr[rt].ls].add+=tr[rt].add;
		tr[tr[rt].rs].add+=tr[rt].add;
		tr[rt].add=0;
	}
}
void Update(int L,int R,bool c,int l,int r,int &rt)
{
	if(!rt)rt=++cnt;
	if(L<=l&&r<=R)
	{
		tr[rt].maxx+=c?1:-1;
		tr[rt].add+=c?1:-1;
		return ;
	}
	PushDown(rt);
	int m=(l+r)>>1;
	if(m>=L)Update(L,R,c,lson);
	if(m<R)Update(L,R,c,rson);
	PushUp(rt);
}
int main()
{
	ans=1<<30;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].l,&a[i].r);
		a[i].len=a[i].r-a[i].l;
		p[(i<<1)-1]=a[i].l;
		p[i<<1]=a[i].r;
	}
	sort(p+1,p+n*2+1);
	for(int i=1;i<=n;i++)
	{
		int x=lower_bound(p+1,p+n*2+1,a[i].l)-p;
		a[i].l=x;
		x=lower_bound(p+1,p+n*2+1,a[i].r)-p;
		a[i].r=x;
	}
	sort(a+1,a+n+1,cmp);
	int l=1,r=0,rot=0;
	while(r<n)
	{
		while(tr[rot].maxx<m&&r<n){r++;Update(a[r].l,a[r].r,1,1,n*2,rot);}
		if(tr[rot].maxx<m)break;
		while(tr[rot].maxx>=m&&l<n){Update(a[l].l,a[l].r,0,1,n*2,rot);l++;}
		ans=min(a[r].len-a[l-1].len,ans);
	}
	printf("%d\n",ans==1<<30?-1:ans);
	return 0;
}

  离散化什么的,用lower_bound就好了,懒得写二分查找了...反正不会tle...

 

转载于:https://www.cnblogs.com/Winniechen/p/8989294.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值