首页 > 其他分享 >洛谷二刷P4715 【深基16.例1】淘汰赛(c嘎嘎)

洛谷二刷P4715 【深基16.例1】淘汰赛(c嘎嘎)

时间:2024-12-05 15:57:12浏览次数:9  
标签:node end 16 int 洛谷二刷 tree 淘汰赛 start 节点

题目链接P4715 【深基16.例1】淘汰赛 - 洛谷 | 计算机科学教育新生态

题目难度普及

  刷题心得:本题是我二刷,之前第一次刷是在洛谷线性表那个题单,当时印象深刻第  一篇题解是用的树来做,当时我不屑一顾(觉得花里胡哨),现在我开始刷树的题目着字分析,第一次学习到线性树的用法现在把他总结下

 

线段树

线段树是一种二叉树,也就是对于一个线段,我们会用一个二叉树来表示。比如说一个长度为4的线段,我们可以表示成这样:

这是什么意思呢? 如果你要表示线段的和,那么最上面的根节点的权值表示的是这个线段 1 ∼ 6 的和。根的两个儿子分别表示这个线段中 1 ∼ 3 和4 ~6的和,以此类推。

然后我们还可以的到一个性质:节点 i的权值 == 它的左儿子权值 +它的右儿子权值。

我们知道,一颗从 1 11 开始编号的二叉树,结点 i的左儿子和右儿子编号分别是i x 2 和 i x 2 + 1

建树代码

void build(int node,int start,int end){   //建树函数,参数是根节点和左右区间 
	if(start==end){		//如果两边相等 
		tree[node]=arr[start]; //填的就是数组里的初始值 
		return;  //递归边界 
	}
	int leftnode=node*2;  //算出左右节点(完全二叉树的性质) 
	int rightnode=node*2+1;  
	int mid=(start+end)/2;    //把数组从中间劈成两半
	build(leftnode,start,mid);  //左边右边分开建树 
	build(rightnode,mid+1,end);
	tree[node]=tree[leftnode]+tree[rightnode]; //根节点的值=左根+右根 
}

查询和求区间和:

void update(int node,int start,int end,int id,int val){      //修改操作,参数分别是建树函数的那三个和修改节点的编号和修改的值
	if(start==end){ //递归边界,如果是叶节点
		tree[node]+=val; //修改node节点的值
		return;
	}
	int leftnode=node*2;  //算出左右子树和中点
	int rightnode=node*2+1;  
	int mid=(start+end)/2;   
	if(id>=start&&id<=mid) //如果要改的地方在中点左边
	update(leftnode,start,mid,id,val);//那就递归修改左子树
	else update(rightnode,mid+1,end,id,val);//要么就递归修改右子树	
	tree[node]=tree[leftnode]+tree[rightnode]; //根节点更新 
} 
int query(int node,int start ,int end,int l,int r){ //查询函数,l和r是求和的左右区间
	if(l<=start&&r>=end)  //如果求和的区间已经当前的部分包含了
//(比如当前在[1,3]区间,让你求[1,5],那你就要求[1,3]+[4,5],直接把建树的时候算好的[1,3]的和加上去就行了)
	return tree[node]; //直接返回根节点
	int leftnode=node*2;  //又双叒叕是左右子树和中点
	int rightnode=node*2+1;  
	int mid=(start+end)/2;
	int sum=0; //就是要返回的和啊   
	if(l<=mid) //如果要求和的区间包含中点左边的部分
	sum+=query(leftnode,start,mid,l,r); //那就加上左边那块
	if(r>mid) //同理,如果右边还有那就加上右边那块
	sum+=query(rightnode,mid+1,end,l,r);
	return sum; //返回sum,不解释
}

线段树好处:所以介绍了这么多线段树,线段树到底有什么用前缀和不是也可以求和吗,可是如果修改一个值再求和前缀和,每一个前缀和都要修改时间复杂度就是o(n)了,线段树它可以把时间复杂度降低降低再降低,把修改和查询的时间复杂度都降到O(log⁡n)。

最后奉上本题代码:

#include<bits/stdc++.h>  // 万能头文件
using namespace std;
typedef long long ll;
//const int N = 100010;      
int n;

struct node{
	int power;//能力值 
	int id;//国家序号 
}a[150],tree[600]; //a用来存储数据,tree是存线段树的数组 

node maxn(node a,node b){  //返回两个结构体里能力值更大的那个
	return a.power>b.power?a:b;
}
node minn(node a,node b)
{
	return a.power < b.power ? a : b;//返回两个结构体里能力值更小的那个
}
void build(int node,int start,int end)//建树函数,参数是根节点和左右节点 
{
	if(start == end)//两边相等 
	{
		tree[node] = a[start];//填的就是数组的初始值 ,即叶子节点不需要划分 
		return;//边界 
	}
	int leftNode = node * 2;//算出左右节点(完全二叉树的性质) 
	int rightNode = node * 2 + 1;
	int mid = (start + end) / 2;//把数组从中间分开 
	build(leftNode,start,mid);
	build(rightNode,mid + 1,end);
	tree[node]=  maxn(tree[leftNode],tree[rightNode]);  //父节点是左右子节点里更大的;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    cin >> n;
    for(int i=1; i<= (1<<n); i++)
    {
    	cin >> a[i].power;
    	a[i].id = i;
	}
	build(1,1,(1<<n));
	cout<<minn(tree[2],tree[3]).id;
  
    return 0;  
}
 

标签:node,end,16,int,洛谷二刷,tree,淘汰赛,start,节点
From: https://blog.csdn.net/2302_79431881/article/details/144223886

相关文章

  • 如何运用Python爬虫快速获得1688商品详情数据
    在数字化时代,数据的价值日益凸显,尤其是在电商领域。对于企业来说,获取竞争对手的商品信息是分析市场趋势、制定营销策略的重要手段。1688作为中国领先的B2B电商平台,拥有海量的商品数据。本文将介绍如何使用Python编写爬虫程序,以合法合规的方式快速获取1688商品详情,为电商企业提......
  • XCVU13P板卡设计原理图:509-基于XCVU13P的4路QSFP28光纤PCIeX16收发卡
     一、板卡概述     基于XCVU13P的4路QSFP28光纤PCIeX16收发卡。该板卡要求符合PCIe3.0标准,包含一片XCVU13P-2FLGA2014I、4组64-bit/8GBDDR4;4路QSFP284X光纤,每路光纤支持4X25Gbps,双向;支持32路IO。板卡工作温度范围0到60℃,板卡设计加工包含散热装置,支持服务器风冷散热......
  • FMC293-基于FMC 16路LVDS输入或者输出子卡
     一、板卡概述 板卡基于FMC LPC接口设计16路 LVDS输入或者输出接口,用于图像传输,数据传输等应用。  板卡通过选焊接SN65LVDS386或者SN65LVDS387,只能单独输入,或者单独输出工作。 二、性能指标 三、软件内容   提供ISE或者Vivado版本的 FMC接口 AD输入或者DA......
  • Linux红帽ISO镜像以及VMware Workstation Pro 16.1.2的下载与安装
    目录一,VMwareWorkstationPro1.VMware(16Pro)下载:2,软件安装二,Linux红帽ISO镜像下载1,用迅雷下载2,安装步骤一,VMwareWorkstationPro我本人在官网已经找了好久,发现寻找及其麻烦,在csdn中找到了大佬的分享附上原文链接https://blog.csdn.net/Qi_1337/article/details/......
  • AT_joisc2016_g ダンジョン2
    不妨先建出一棵dfs树,然后给每个点标号。那么现在就是要确定所有非树边的端点。考虑三进制拆分,第\(i\)轮每个点颜色为其第\(i\)位的值。于是可以求出每条非树边终点的第\(i\)位。这样只要跑\(\log_3n\le5\)次。不妨把每条非树边挂到较低点求值,实现可以考虑定义颜色\(......
  • 代码随想录算法训练营第二十二天|77.组合、216.组合总和iii、17.电话号码的字母组合
    题号来自leetcode77.组合回溯算法三部曲,回溯算法的理论基础:代码随想录1.递归函数的传参和返回值:用两个全局变量List<List<Interger>>result和List<Integer>path来分别存放最终结果和每次符合条件的结果。符合题目要求的n和k肯定是要传入的,还要再定义一个startIndex,这个参......
  • 25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60,电压阈值为100,如果超于阈值,则蜂鸣器报警。二、硬件资源基于KEIL5编......
  • 25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60,电压阈值为100,如果超于阈值,则蜂鸣器报警。二、硬件资源基于KEIL5编......
  • springboot天文科普网站-计算机设计毕业源码31654
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 系统用例分析2.5本章小结3......
  • HCIP-16 BGP路由属性和选路
    目录BGP路由属性简介路径属性路径属性分类BGP选路原则BGP选路原则拓扑说明0.丢弃下一跳不可达的路由1.优选Preferred-Value属性值最大的路由。Preferred-Value介绍修改Preferred-Value2.优选Local_Preference属性值最大的路由。Local_Preference介绍修改Local_Preference3.本......