4.4学习总结

一.线段树概念

一.定义:

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

(线段树的适用范围很广,可以在线维护修改以及查询区间上的最值求和。对于线段树来说,每次更新以及查询的时间复杂度为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.定义sqlString sql="update user set sex='k' where id=1";//4.获取执行sql对象StatementStatement stat = conn.createStatement();//5.执行sqlint i = stat.executeUpdate(sql);//6.处理结果System.out.println(i);//7.释放资源stat.close();conn.close();}
}

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

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

相关文章

算法(滑动窗口四)

1.串联所有单词的子串 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff…

【NLP练习】中文文本分类-Pytorch实现

中文文本分类-Pytorch实现 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1. 任务说明 本次使用Pytorch实现中文文本分类。主要代码与文本分类代码基本一致&#xff0c;不同的是本次任务使用…

FAS-Net

感想 图的下标弄不好&#xff0c;且作者未提供代码。AAAI的质量也就这样吧

Web Component 组件库有什么优势

前言 前端目前比较主流的框架有 react&#xff0c;vuejs&#xff0c;angular 等。 我们通常去搭建组件库的时候都是基于某一种框架去搭建&#xff0c;比如 ant-design 是基于 react 搭建的UI组件库&#xff0c;而 element-plus 则是基于 vuejs 搭建的组件库。 可能你有这种体…

Transformer的代码实现 day03(Positional Encoding)

Positional Encoding的理论部分 注意力机制是不含有位置信息&#xff0c;这也就表明&#xff1a;“我爱你”&#xff0c;“你爱我”这两者没有区别&#xff0c;而在现实世界中&#xff0c;这两者有区别。所以位置编码是在进行注意力计算之前&#xff0c;给输入加上一个位置信息…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 向量加载和存储

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

Redis -- 缓存穿透问题解决思路

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a; 额外…

【JavaSE】接口 详解(上)

前言 本篇会讲到Java中接口内容&#xff0c;概念和注意点可能比较多&#xff0c;需要耐心多看几遍&#xff0c;我尽可能的使用经典的例子帮助大家理解~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 接口 语法…

pta 1086 就不告诉你

1086 就不告诉你 分数 15 全屏浏览 切换布局 作者 CHEN, Yue 单位 浙江大学 做作业的时候&#xff0c;邻座的小盆友问你&#xff1a;“五乘以七等于多少&#xff1f;”你应该不失礼貌地围笑着告诉他&#xff1a;“五十三。”本题就要求你&#xff0c;对任何一对给定的正整数…

新手开抖店:选品过后如何有效对接达人?这些方法100%有效!

哈喽~我是电商月月 要说做抖音小店最主要的是什么&#xff1f;那当然是找品了 那出单最快的方法是什么&#xff1f;无疑是达人带货了&#xff01; 但新手店铺没销量&#xff0c;没体验分&#xff0c;没好评怎么能让达人同意帮我们带货呢&#xff1f; 方法其实很简单&#x…

“双碳”目标下资源环境中的可计算一般均衡(CGE)模型应用

我国政府承诺在2030年实现“碳达峰”&#xff0c;2060年实现“碳中和”&#xff0c;这就是“双碳”目标。为了实现这一目标就必须应用各种二氧化碳排放量很高技术的替代技术&#xff0c;不仅需要考虑技术上的可靠性&#xff0c;也需要考虑经济上的可行性。可计算一般均衡模型&a…

AI预测福彩3D第26弹【2024年4月4日预测--第4套算法重新开始计算第11次测试】

今天清明节假日&#xff0c;一会要外出&#xff0c;可能要晚点回来。咱们尽早先把预测数据跑完&#xff0c;把结果发出来供各位彩友参考。合并下算法&#xff0c;3D的预测以后将重点测试本套算法&#xff0c;因为本套算法的命中率较高。以后有时间的话会在第二篇文章中发布排列…

UTONMOS:AI+Web3+元宇宙数字化“三位一体”将触发经济新爆点

人工智能、元宇宙、Web3&#xff0c;被称为数字化的“三位一体”&#xff0c;如何看待这三大技术所扮演的角色&#xff1f; 3月24日&#xff0c;2024全球开发者先锋大会“数字化的三位一体——人工智能、元宇宙、Web3.0”论坛在上海漕河泾开发区举行&#xff0c;首次提出&…

深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望

码到三十五 &#xff1a; 个人主页 在数据库管理系统中&#xff0c;查询优化器是一个至关重要的组件&#xff0c;它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中&#xff0c;查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣&#xff0c;并选择…

网络安全 | 什么是负载均衡器?

关注WX&#xff1a; CodingTechWork 介绍 负载均衡是在多个服务器之间有效分配网络流量的过程。负载均衡的目的是优化应用程序的可用性&#xff0c;并确保良好的终端用户体验。负载均衡可协助高流量网站和云计算应用程序应对数百万个用户请求&#xff0c;从而保证客户请求不会…

2012年认证杯SPSSPRO杯数学建模C题(第二阶段)碎片化趋势下的奥运会商业模式全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 C题 碎片化趋势下的奥运会商业模式 原题再现&#xff1a; 从 1984 年的美国洛杉矶奥运会开始&#xff0c;奥运会就不在成为一个“非卖品”&#xff0c;它在向观众诠释更高更快更强的体育精神的同时&#xff0c;也在攫取着巨大的商业价值&#…

颜色空间/模型(RGB, YUV,CMY/CMYK, HSI, HSV等)

什么是颜色 颜色是通过眼、脑和我们的生活经验所产生的对光的视觉感受&#xff0c;我们肉眼所见到的光线&#xff0c;是由波长范围很窄的电磁波产生的&#xff0c;不同波长的电磁波表现为不同的颜色&#xff0c;对色彩的辨认是肉眼受到电磁波辐射能刺激后所引起的视觉神经感觉…

51单片机实验02- P0口流水灯实验

目录 一、实验的背景和意义 二、实验目的 三、实验步骤 四、实验仪器 五、实验任务及要求 1&#xff0c;从led4开始右移 1&#xff09;思路 ①起始灯 &#xff08;led4&#xff09; ②右移 2&#xff09;效果 3&#xff09;代码 2&#xff0c;从其他小灯并向右依次…

面向C++程序员的Rust教程(二)

先序文章请看&#xff1a; 面向C程序员的Rust教程&#xff08;一&#xff09; 所有权与移动语义 要说Rust语言跟其他语言最大的区别&#xff0c;那笔者觉得非数这个所有权和移动语义莫属。 深浅复制 对于绝大多数语言来说&#xff0c;变量/对象之间的赋值通常都是复制语义。…

微信开发工具——进行网页授权

微信开发工具——进行网页授权 微信公众平台设置 1.在首页创建好自己的订阅号 网站&#xff1a;https://mp.weixin.qq.com/ 点击立即注册,在选择订阅号&#xff08;个人创建使用&#xff09; 之后按流程填写后&#xff0c;点击设置与开发-------->基本配置&#xff0c;这…