4.4学习总结

news2025/1/10 21:08:28

一.线段树概念

一.定义:

   线段树是一种二叉搜索树,而二叉搜索树,首先满足二叉树,即每个结点最多有两颗子树,并且是一颗搜索树,我们要知道,线段树的每个结点都存储了一个区间,也可以理解成一个线段,而搜索,就是在这些线段上进行搜索操作得到你想要的答案

(线段树的适用范围很广,可以在线维护修改以及查询区间上的最值求和。对于线段树来说,每次更新以及查询的时间复杂度为O(logN))

二.线段树操作思路

   线段树主要是把一段大区间 平均地划分 成两段小区间进行维护,再用小区间的值来更新大区间。这样既能保证正确性,又能使时间保持在 log ⁡ 级别(因为这棵线段树是平衡的)。也就是说一个[L,R]区间会被划分为两个区间分别是[L,(L+R)/2]和[(L+R)/2+1,R]这两个小区间。然后再递归下去分直达L=R。

二.线段树具体操作

一.建树

建树时每次递归就要先判断l是否等于r,等于就说明是叶子节点,也就是区间是[l,l],直接赋值a[l]/a[r],再返回。否则就递归构造左儿子结点和递归构造右儿子结点,最后更新父节点

void build(ll p,ll l,ll r)
{
	ll tl = p * 2, tr = p * 2 + 1;
	tree[p] = { l,r,ans[l],0 };
	if (l == r)
		return;
	ll mid = (l + r) / 2;
	build(tl, l, mid);
	build(tr, mid + 1, r);
	pushup(p);
}

二.区间修改

1.如果当前区间完全被覆盖在目标区间里将这个区间sum数组的的位置加上(r-l+1)*C

2.如果没有完全覆盖则先下传懒标记

3.如果这个区间的左孩子和目标区间有交集,那么就递归给左孩子分配任务

4.如果这个区间的右孩子和目标区间有交集,则递归分配任务给右孩子。

懒标记:(即在需要使用的时候在取值,否则存在父亲处)

//向上更新总和
void pushup(ll p)
{
	ll tl = p * 2, tr = p * 2 + 1;
	tree[p].sum = tree[tl].sum + tree[tr].sum;
}
//向下更新懒标记
void pushdown(ll p)
{
	ll tl = p * 2, tr = p * 2 + 1;
	if (tree[p].add)
	{
		tree[tl].sum += (tree[tl].r - tree[tl].l + 1) * tree[p].add;
		tree[tr].sum += (tree[tr].r - tree[tr].l + 1) * tree[p].add;
		tree[tl].add += tree[p].add;
		tree[tr].add += tree[p].add;
		tree[p].add = 0;
	}
}
//区间修改
void update(ll p,ll x,ll y,ll k)
{
	ll tl = p * 2, tr = p * 2 + 1;
	if (x <= tree[p].l && tree[p].r <= y) {
		tree[p].sum += (tree[p].r - tree[p].l + 1) * k;
		tree[p].add += k;
		return;
	}
	ll mid = (tree[p].l + tree[p].r) / 2;
	pushdown(p);
	if (x <= mid)
		update(tl, x, y, k);
	if (y > mid)
		update(tr, x, y, k);
	pushup(p);
}

三.区间查询

1.如果当前区间完全被覆盖在目标区间里将对于sum位置的数据返回

2.如果没有完全覆盖则先下传懒标记

3.如果这个区间的左孩子和目标区间有交集,那么就递归给左孩子分配任务

4.如果这个区间的右孩子和目标区间有交集,则递归分配任务给右孩子。

ll query(ll p, ll x, ll y)
{
	ll tl = p * 2, tr = p * 2 + 1;
	if (x <= tree[p].l && tree[p].r <= y)
		return tree[p].sum;
	ll mid = (tree[p].l+tree[p].r) / 2;
	pushdown(p);
	ll sum = 0;
	if (x <= mid)
		sum += query(tl, x, y);
	if (y > mid)
		sum += query(tr, x, y);
	return sum;
}

 

三.例题分析

线段树的模版题,熟练掌握区间修改和区间查询即可,注意数据范围,要开long long

#include<iostream>
#include <stdio.h>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<vector>
using namespace std;
#define N 1000005
typedef long long ll;
int n, m, cnt;
int ans[N];
struct node {
	ll l, r, sum, add;
}tree[N*4];

void pushup(ll p)
{
	ll tl = p * 2, tr = p * 2 + 1;
	tree[p].sum = tree[tl].sum + tree[tr].sum;
}

void pushdown(ll p)
{
	ll tl = p * 2, tr = p * 2 + 1;
	if (tree[p].add)
	{
		tree[tl].sum += (tree[tl].r - tree[tl].l + 1) * tree[p].add;
		tree[tr].sum += (tree[tr].r - tree[tr].l + 1) * tree[p].add;
		tree[tl].add += tree[p].add;
		tree[tr].add += tree[p].add;
		tree[p].add = 0;
	}
}

void build(ll p,ll l,ll r)
{
	ll tl = p * 2, tr = p * 2 + 1;
	tree[p] = { l,r,ans[l],0 };
	if (l == r)
		return;
	ll mid = (l + r) / 2;
	build(tl, l, mid);
	build(tr, mid + 1, r);
	pushup(p);
}

ll query(ll p, ll x, ll y)
{
	ll tl = p * 2, tr = p * 2 + 1;
	if (x <= tree[p].l && tree[p].r <= y)
		return tree[p].sum;
	ll mid = (tree[p].l+tree[p].r) / 2;
	pushdown(p);
	ll sum = 0;
	if (x <= mid)
		sum += query(tl, x, y);
	if (y > mid)
		sum += query(tr, x, y);
	return sum;
}

void update(ll p,ll x,ll y,ll k)
{
	ll tl = p * 2, tr = p * 2 + 1;
	if (x <= tree[p].l && tree[p].r <= y) {
		tree[p].sum += (tree[p].r - tree[p].l + 1) * k;
		tree[p].add += k;
		return;
	}
	ll mid = (tree[p].l + tree[p].r) / 2;
	pushdown(p);
	if (x <= mid)
		update(tl, x, y, k);
	if (y > mid)
		update(tr, x, y, k);
	pushup(p);
}
int main()
{
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%lld", &ans[i]);
	build(1, 1, n);
	while (m--)
	{
		char s;
		ll choice, x, y, z;
		cin >> s;
		if (s == 'C') {
			scanf("%lld%lld%lld", &x, &y, &z);
			update(1,x,y,z);
		}
		if (s == 'Q') {
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", query(1, x, y));
		}
	}
	return 0;
}

二.JDBC学习

刚开始接触mysql和JDBC的知识,初步学习其相关特点

实例演示

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class jdbc {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取连接
        String upl="jdbc:mysql://localhost:3306/chat";
        String username="root";
        String password="wei1810335767";
        Connection conn= DriverManager.getConnection(upl,username,password);

        //3.定义sql
        String sql="update user set sex='k' where id=1";

        //4.获取执行sql对象Statement
        Statement stat = conn.createStatement();

        //5.执行sql
        int i = stat.executeUpdate(sql);

        //6.处理结果
        System.out.println(i);

        //7.释放资源
        stat.close();
        conn.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用git 和 github协作开发

文章目录 github浏览器汉化插件github新建仓库git安装以及ssh配置团队创建及基本命令的使用创建团队基本命令 分支管理快速切换远程仓库地址 如何使用git && github进行协作开发&#xff0c;包括git常见基础命令 github浏览器汉化插件 在刚开始使用github的时候&#…

微信小程序上传到gitee

共三步 1、新建gitee仓库 点号&#xff0c;新建仓库&#xff0c;填入仓库信息新建即可 2、修改版本管理参数 微信开发者工具中点开版本管理&#xff0c;未初始化&#xff0c;需要先点初始化 接下来将设置中的通用、网络认证、远程3个部分的参数填写好 通用&#xff1a;核对…

【从浅学到熟知Linux】冯诺依曼体系结构及进程概念详谈!

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程及数据库等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 冯诺依曼体系结构操作系统如何理解管理操作系统概念设计操作系统目的系统调用和库函数概念 进程基…

DashOJ-8.奇偶统计

题目链接&#xff1a; 题目详情 - 奇偶统计 - DashOJ 思路&#xff1a; &#xff08;while循环加if分支语句&#xff09; 巧用死循环 while(1) 然后在里面第一句就判断输入的数字是否等于0 if(x0) &#xff0c;如果 等于0就直接break跳出循环 或者用 while(cin>>x) 代…

红黑树内部结点数量分析

红黑树内部结点数量分析 一、红黑树的性质二、黑高与内部结点数量2.1最大内部结点数量2.2最小内部结点数量 三、伪代码实现四、C语言代码实现五、结论 红黑树是一种自平衡的二叉搜索树&#xff0c;它通过一系列复杂的性质和操作来维持平衡&#xff0c;从而确保各种动态集合操作…

Docker 容器编排技术解析与实践

探索了容器编排技术的核心概念、工具和高级应用&#xff0c;包括 Docker Compose、Kubernetes 等主要平台及其高级功能如网络和存储管理、监控、安全等。此外&#xff0c;文章还探讨了这些技术在实际应用中的案例&#xff0c;提供了对未来趋势的洞见。 一、容器编排介绍 容器编…

用 Wireshark 解码 H.264

H264&#xff0c;你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容&#xff1a; -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…

日期专题:做题笔记 (时间显示/星期计算/星系炸弹/第几天/纪念日)

目录 时间显示 代码 星期计算 代码 星系炸弹 代码 第几天 纪念日 代码 时间显示 时间显示 这道题主要是单位换算。 ①单位换算 ②输出格式&#xff1a; a. 不足两位补前导零。利用printf输出 b. 注意 long long 输出格式应该是 %lld 长整型 代码 #include <…

解码零跑汽车2023年报:营收增速大幅滑坡,净亏42亿,如何讲故事

在2023年的新势力车企中&#xff0c;有这么一家低调崛起的品牌&#xff0c;并没有像蔚小理那样高调&#xff0c;但去年全年销量却反超小鹏汽车&#xff0c;晋升成为新势力车企中的销量第三名&#xff0c;它就是第四家登陆港交所上市的新势力品牌—零跑汽车。 不过&#xff0c;…

阿里云短信服务业务

一、了解阿里云用户权限操作 1.注册账号、实名认证&#xff1b; 2.使用AccessKey 步骤一 点击头像&#xff0c;权限安全的AccessKey 步骤二 设置子用户AccessKey 步骤三 添加用户组和用户 步骤四 添加用户组记得绑定短信服务权限 步骤五 添加用户记得勾选openApi访问 添加…

Coursera自然语言处理专项课程04:Natural Language Processing with Attention Models笔记 Week01

Natural Language Processing with Attention Models Course Certificate 本文是学习这门课 Natural Language Processing with Attention Models的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Natural Language Processing with Attention ModelsWeek 01…

LeetCode每日一题之专题一:双指针 ——快乐数

快乐数OJ链接&#xff1a;202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题目分析: 为了房便叙述&#xff0c;将「对于⼀个正整数&#xff0c;每⼀次将该数替换为它每个位置上的数字的平方和」这⼀个 操作记为 x 操作&#xff1b; 题目告诉我们&#…

没用的cpp知识又增加了之--cpp11利用宏、模板以及lambda表达式实现python like的装饰器语义

等有时间了我再bb吧&#xff0c;先直接上码 msvc 2015 编译执行效果 用法 style1 int CCar::oilfeed(int degress) DECORATED(logging<int>, ARGS(__FUNCTION__), DECORATED(checkRotateSpeed<int>, ARGS(this, __FUNCTION__), {m_n_rotat_speed degress;retur…

华为云1核2G免费使用一年

个人用户专享云服务器、云数据库产品每天上午9:30开抢&#xff0c;其他产品每天0点开放领取&#xff0c;企业用户所有产品每天0点开放领取&#xff1b; 云产品体验名额有限&#xff0c;领完即止。详情&#xff1a;https://www.vpspick.com/vps/591.html 通用入门型 T6 云服务…

数码管与译码器

目录 数码管 显示的基本原理 LED数码管的显示方式 静态显示方式 动态显示方式 具体案例 数码管静态显示 电路图 keil文件 数码管动态显示 电路图 keil文件 74LS138译码器 简介 译码表 译码器案例 电路图 keil文件 74HC595译码器 前言 举例解释 简单案例 …

手写防抖节流、手写深拷贝、事件总线

一、防抖 手写防抖--基本实现&#xff08;面试&#xff09; 手写防抖并且绑定this和event 添加取消功能 添加立即执行状态&#xff0c;默认不立即执行 underscore库介绍&#xff0c;lodash更轻量级 二、节流 用underscore库&#xff0c;调用throttle函数 手写基础版节流-&#…

《价值》-张磊-高瓴资本-4(上)-价值投资需要研究驱动,而非拍脑袋

第四章 价值投资方法与哲学&#xff08;上&#xff09; 在我的书架上&#xff0c;有一套书最为醒目&#xff0c;我总会在不经意间打开翻看&#xff0c;那就是由本杰明 格雷厄姆&#xff08;Benjamin Graham &#xff09;与戴维 多德&#xff08;David Dodd &#xff09;在 19…

【HTML】制作一个简单的三角形动态图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的文件名…

实用技巧:如何取消app的截屏禁用

因为我想要在小鹅通App做笔记,但是被小鹅通App禁用截屏了,这真是一个很糟糕的使用体验,虽然可能是为了保护商家权益…… 方法1 可以让商家设置课程可以截屏 方法2 手机root,安装Xposed框架,利用Xposed框架上面的插件我们可以对手机进行高度定制化,而安装Xposed框架的…

微信小程序 电影院售票选座票务系统5w7l6

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…