首页 > 编程语言 >区间操作优化算法

区间操作优化算法

时间:2024-02-22 11:37:40浏览次数:30  
标签:rt head val int max tr 算法 区间 优化

1.树状数组

一般为求区间的和并统计某个特定值的数量,同时可以进行快速的在线更新。不算特别重要,简略带过。
看例题

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=300000;
int n,c[N],s[N];
struct lmy
{
	int x,y;
}site[N];
int lowbit(int x)
{
	return x&-x;
}
void add(int x,int val)
{
	//因为y有序,只需维护比较x的大小,只要后面的x大它就大 
	while(x<=32001)//用来维护比x小的星数有多少个 
	{
		c[x]+=val;
		x+=lowbit(x);
	}
}
int getsum(int x)
{
	int ans=0;
	while(x)
	{
		ans+=c[x];
		x-=lowbit(x);
	}
	return ans;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&site[i].x,&site[i].y);
	}
	for(int i=1;i<=n;i++)
	{
		int a=site[i].x+1;
		int b=getsum(a);//求它前面有几颗星,即它为几级星 
		s[b]++;//它对应的星级数量+1 
		add(a,1); 
	}
	for(int i=0;i<n;i++)
	{
		printf("%d\n",s[i]);
	}
}


2.线段树

目前所用线段树为求区间的和,最值和维护对区间特定的操作,同样可以在线更新,对区间可以进行更多的操作,比树状数组适用范围大。给定范围求值

这道题用线段树进行操作维护的主要是区间左子树和右子树剩余空间的最大值,
举个例子:

点击查看代码
#include<algorithm> 
#include<cstring> 
#include<cstdio> 
#include<cmath> 
using namespace std;
const int N=500000;
int h,w,n;
#define lson (rt<<1)
#define rson (rt<<1|1)
struct lmy
{
	int l,r;
	int max;
}tr[N<<2];

void build(int rt,int l,int r)
{
	tr[rt].l=l;
	tr[rt].r=r;
	if(l==r)
	{
		tr[rt].max=w;
		return ;
	}
	int mid=(l+r)>>1;
	build(lson,l,mid);
	build(rson,mid+1,r);
	tr[rt].max=max(tr[lson].max,tr[rson].max);
}
int answer(int rt,int val)
{
	if(tr[rt].l==tr[rt].r)
	{
		tr[rt].max-=val;//确定位置,减去占用空间
		return tr[rt].l;
	}
	int ans=0;
	if(tr[lson].max>=val)//要求结果相同i取最小,所以先遍历左子树
	{
		ans=answer(lson,val);
	}
	else
	{
		ans=answer(rson,val);
	}
	tr[rt].max=max(tr[lson].max,tr[rson].max);
	return ans;
}
int main()
{
	while(scanf("%d%d%d",&h,&w,&n)!=EOF)
	{
		h=min(h,n);
		memset(tr,0,sizeof(tr));
		build(1,1,h);
		int val;
		for(int i=1;i<=n;i++)
		{
			int ans=-1;
			scanf("%d",&val);
			if(val<=tr[1].max)
			{
				ans=answer(1,val);
			}
			printf("%d\n",ans);
		}
	}
}

3.单调栈和单调队列

其实可以只用单调队列,单调队列可以当做单调栈来用。
同样单调队列也可以维护一段区间的最值,并求出在特定要求下跟最值有关的范围,主要是求范围给出范围求最值

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int N=1000050;
int a[N],q[N];

int main()
{
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	int head=0,tail=-1;
	for(int i=0;i<n;i++)
	{
		if(head<=tail&&i-k+1>q[head])//超出范围的数减掉
		{
			head++;
		}
		while(head<=tail&&a[q[tail]]>=a[i])
		{
			tail--;
		}
		q[++tail]=i;//队列用来存储下标
		if(i>=k-1)
		{
			printf("%d ",a[q[head]]);
		}
	}
	printf("\n");
	head=0;
	tail=-1;
	for(int i=0;i<n;i++)
	{
		if(head<=tail&&i-k+1>q[head])
		{
			head++;
		}
		while(head<=tail&&a[q[tail]]<=a[i])
		{
			tail--;
		}
		q[++tail]=i;
		if(i>=k-1)
		{
			printf("%d ",a[q[head]]);
		}
	}
}

标签:rt,head,val,int,max,tr,算法,区间,优化
From: https://www.cnblogs.com/zhengchenxi/p/18026882

相关文章

  • vivo 短视频体验与成本优化实践
    作者:来自vivo互联网短视频研发团队本文根据蔡创业、马运杰老师在“2023vivo开发者大会"现场演讲内容整理而成。在线点播场景,播放体验提升与成本优化是同等重要的两件事,并在部分场景体验优化与成本优化存在一定的互斥关系。vivo短视频深入分析播放链路的每个环节、并结合大......
  • 神经网络优化篇:详解TensorFlow
    TensorFlow先提一个启发性的问题,假设有一个损失函数\(J\)需要最小化,在本例中,将使用这个高度简化的损失函数,\(Jw=w^{2}-10w+25\),这就是损失函数,也许已经注意到该函数其实就是\({(w-5)}^{2}\),如果把这个二次方式子展开就得到了上面的表达式,所以使它最小的\(w\)值是5,但假设不知道......
  • 代码随想录算法训练营day 1 | 704 二分查找 27 删除元素
    704二分查找数组基础数组空间地址连续、随机访问时间复杂度O(1)、删除和移动时间复杂度O(n)vector和array区别:vector底层实现为array;array是栈上开辟空间、vector是堆上开辟空间;array不支持迭代器访问,支持指针和索引、vector还支持迭代器访问二分查找适用场景有序数组、数组......
  • 算法复习
    省选前最后一周了,对照大纲过一遍,每个算法稍微写一点自己的理解与板子记忆技巧。感觉很多东西还是之前听别人讲的时候学的似懂非懂......导致现在看起来好像啥都会一点实际上好像啥也不会,每次越临近考试就会感觉整个人很虚无啊......反正不是很好受。数论exgcd【7】用于解决......
  • m基于码率兼容打孔LDPC码nms最小和译码算法的LDPC编译码matlab误码率仿真
    1.算法仿真效果matlab2022a仿真结果如下: 2.算法涉及理论知识概要       码率兼容打孔LDPC码BP译码算法是一种改进的LDPC译码算法,能够在不同码率下实现更好的译码性能。该算法通过在LDPC码中引入打孔操作,使得码率可以灵活地调整,同时利用BP(BeliefPropagation)译码算法......
  • day38 动态规划part1 代码随想录算法训练营 746. 使用最小花费爬楼梯
    题目:746.使用最小花费爬楼梯我的感悟:哈哈,我居然自己独立写出来了,确实,只要定义定清楚了,哪怕定的含义只有自己能看懂,只要定义一致就可以求出解决来!!!我真是个大天才!!理解难点:听课笔记:代码示例:classSolution:defminCostClimbingStairs(self,cost:List[int])->int:......
  • # 代码随想录算法训练营day01 | leetcode 704. 二分查找、35.搜索插入位置、34.在排序
    题目链接:704.二分查找-简单题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示......
  • KMP 算法和 TIRE 树
    1.KMP算法KMP算法,是判断一个字符串是否在一个字符串中出现过,能够快速匹配字符串在文本串中的有无,位置,次数,我们在匹配字符串中可以找到失配点,就可以不用从\(1\)重新查找,从某个特定点进行查找,大大减小了时间复杂度。考虑一组样例:字符串:abcdf文本串:abcdabcdef我们来将他匹......
  • 2024牛客寒假算法基础集训营5
    A.总数-1的个数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn;cin>>n;intans=0;for(inti=1,x;i<=n;i++){cin>>x;if(x==1)c......
  • 2024牛客寒假算法基础集训营5
    2024牛客寒假算法基础集训营5比赛链接赛时出了五题,被自己不严谨的思维害惨了,之后的题晚几天再补,要开学了A.mutsumi的质数合数思路既不是质数也不是合数恐怕非1莫属了吧Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()......