树状数组的建树 单点修改 单点查询 区间修改 区间查询

单点修改  单点查询   用普通数组就能写出来  

单点修改  区间查询   用线段树  树状数组;

区间修改  区间查询   用线段树  树状数组;

区间修改  单点查询   用线段树  树状数组;

 

建树  

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
struct node
{int l,r,w;
}tree[4*maxn+1];
void build(int l,int r,int k)
{tree[k].l=l; tree[k].r=r;if(l==r)  { cin>>tree[k].w; return ; }int mid=(l+r)/2;build(l,mid,2*k);build(mid+1,r,2*k+1);tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
int main()
{build(1,8,1);
}
建树

单点查询

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
struct node
{int l,r,w;
}tree[4*maxn+1];
void build(int l,int r,int k)
{tree[k].l=l; tree[k].r=r;if(l==r)  { cin>>tree[k].w; cout<<l<<"--"<<tree[k].w<<endl; return ; }int mid=(l+r)/2;build(l,mid,2*k);build(mid+1,r,2*k+1);tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
int ask(int x,int k)// dian dian cha xun;
{if(tree[k].l==tree[k].r) {return tree[k].w; }int mid=(tree[k].l+tree[k].r)/2;if(x<=mid) return ask(x,2*k);else       return ask(x,2*k+1);}
int main()
{build(1,8,1);//for(int i=1;i<=8;i++) cout<<"=="<<ask(i)<<endl;cout<<ask(1,1)<<endl;cout<<ask(7,1)<<endl;
}
单点查询

 单点修改(改变一个节点的值,在一个节点上加值)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
struct node
{int l,r,w;
}tree[4*maxn+1];
void build(int l,int r,int k)
{tree[k].l=l; tree[k].r=r;if(l==r)  { cin>>tree[k].w; /*cout<<l<<"--"<<tree[k].w<<endl;*/ return ; }int mid=(l+r)/2;build(l,mid,2*k);build(mid+1,r,2*k+1);tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
int ask(int x,int k)// dian dian cha xun;
{if(tree[k].l==tree[k].r) {return tree[k].w; }int mid=(tree[k].l+tree[k].r)/2;if(x<=mid) return ask(x,2*k);else       return ask(x,2*k+1);}
void change(int x,int y,int k)// 将 节点 x  修改为y
{if(tree[k].l==tree[k].r){ tree[k].w=y; return;  }int mid=(tree[k].l+tree[k].r)/2;if(x<=mid) return change(x,y,2*k);else       return change(x,y,2*k+1);
}
void changeodd(int x,int y,int k)// 将 节点 x  修改为y
{if(tree[k].l==tree[k].r){ tree[k].w+=y; return;  }int mid=(tree[k].l+tree[k].r)/2;//cout<<"  "<<tree[k].l<<"  "<<tree[k].r<<endl; cout<<mid<<endl;if(x<=mid) return changeodd(x,y,2*k);else       return changeodd(x,y,2*k+1);
}
int main()
{build(1,8,1);change(1,10,1);changeodd(1,10,1);cout<<ask(1,1)<<endl;cout<<ask(7,1)<<endl;
}
单点查询

 

 

模板  没有区间修改下的区间查询 和单点查询 。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
struct node
{
int l,r,w;
}tree[4*maxn+1];
void build(int l,int r,int k)
{
tree[k].l=l; tree[k].r=r;
if(l==r) { cin>>tree[k].w; /*cout<<l<<"--"<<tree[k].w<<endl;*/ return ; }
int mid=(l+r)/2;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
int ask(int x,int k)// dian dian cha xun;
{
if(tree[k].l==tree[k].r) {return tree[k].w; }
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) return ask(x,2*k);
else return ask(x,2*k+1);

}
void change(int x,int y,int k)// 将节点x修改为y
{
if(tree[k].l==tree[k].r){ tree[k].w=y; return; }
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) change(x,y,2*k);
else change(x,y,2*k+1);
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
void changeodd(int x,int y,int k)// 将节点 x 上加y
{
if(tree[k].l==tree[k].r){ tree[k].w+=y; return; }
int mid=(tree[k].l+tree[k].r)/2;
//cout<<" "<<tree[k].l<<" "<<tree[k].r<<endl; cout<<mid<<endl;
if(x<=mid) changeodd(x,y,2*k);
else changeodd(x,y,2*k+1);
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
int query(int x,int y,int k) // 区间查询
{
int num=0;
if(tree[k].l==x && tree[k].r==y)
{
num+=tree[k].w; ; return num;
}
int mid=(tree[k].l+tree[k].r)/2;
if(x>=mid+1) num+=query(x,y,2*k+1);
else if(y<=mid) num+=query(x,y,2*k);
else num+=query(x,mid,2*k)+query(mid+1,y,2*k+1);

return num;
}int main()

{
build(1,8,1);
for(int i=1;i<=8;i++) {cout<<ask(1,1)<<" "; } cout<<endl;
cout<<query(1,7,1)<<endl;;
}

 区间修改(lazy标记)

 

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
struct NODE
{
int l,r,w,f; // f 为lazy标记
}tree[4*maxn+10];
void build(int p,int q,int k)
{
tree[k].l=p; tree[k].r=q;
if(tree[k].l==tree[k].r) { cin>>tree[k].w;/* cout<<"==="<<tree[k].w<<endl;*/ return ; }
int mid=( tree[k].l+tree[k].r )/2;
build(p,mid,2*k);
build(mid+1,q,2*k+1);
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
void down(int k) // (lazy 标记) (××××) (important)
{
tree[2*k].f+=tree[k].f;
tree[2*k+1].f+=tree[k].f;
tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);
tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);
tree[k].f=0;
}
void change_interval(int a,int b,int x,int k) // 区间修改 区间加值;
{
if(tree[k].l>=a && tree[k].r<=b )
{
tree[k].w+=(tree[k].r-tree[k].l+1)*x;
tree[k].f+=x;
return;
}
if(tree[k].f) down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(b<=mid) change_interval(a,b,x,2*k);
else if(a>=mid+1) change_interval(a,b,x,2*k+1);
else change_interval(a,mid,x,2*k),change_interval(mid+1,b,x,2*k+1);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
void change_point(int x,int k)
{
if(tree[k].l==tree[k].r) { tree[k].w+=x; return; }
if(tree[k].f) down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) change_point(x,2*k);
else change_point(x,2*k+1);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
int ask_interval(int a,int b,int k) // 区间查询
{
int num=0;

if(tree[k].l>=a&&tree[k].r<=b)
{
num+=tree[k].w;
return num;
}
if(tree[k].f) down(k);
int mid=( tree[k].l+tree[k].r)/2;
if(b<=mid) num+=ask_interval(a,b,2*k);
else if(a>=mid+1) num+=ask_interval(a,b,2*k+1);
else num+=ask_interval(a,mid,2*k)+ask_interval(mid+1,b,2*k+1);
return num;
}
int ask_point(int x,int k) // 点查询
{
int num=0;
if(tree[k].l==tree[k].r) {return tree[k].w; }
if(tree[k].f) down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) ask_point(x,2*k);
if(x>=mid+1) ask_point(x,2*k+1);
}
int32_t main()
{
}

 

转载于:https://www.cnblogs.com/Andromeda-Galaxy/p/9715315.html

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

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

相关文章

bert 中文 代码 谷歌_如何用最强模型BERT做NLP迁移学习?

作者 | 台湾大学网红教授李宏毅的三名爱徒来源 | 井森堡&#xff0c;不定期更新机器学习技术文并附上质量佳且可读性高的代码。编辑 | Jane谷歌此前发布的NLP模型BERT&#xff0c;在知乎、Reddit上都引起了轰动。其模型效果极好&#xff0c;BERT论文的作者在论文里做的几个实验…

安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP、无法连网问题)

目录ubuntu安装包获取ubuntu的安装安装网络配置命令ifconfig连接网络(解决ubuntu无法连网问题)如何修改IP地址安装VMtools解决VMware Tools选项灰色VMtools安装安装中文&#xff0c;汉化添加中文输入法调整分辨率安装新版的Vim安装gccubuntu安装包获取 xunlei中直接搜索下载 …

arm-2014.05 编译三星内核错误 “not support ARM mode ‘smc 0’ ”

&#xff08;1&#xff09;arch/arm/mach-exynos/include/mach/smc.h文件&#xff1a; 在第54行和第69下面添加&#xff1a; __asm__ volatile (".arch_extension sec\n""smc 0\n": "r"(reg0), "r"(reg1), "r"(reg2), &…

树莓派基于Linux内核驱动开发详解

目录一、驱动认知1.1 为什么要学习写驱动1.2 文件名与设备号1.3 open函数打通上层到底层硬件的详细过程二、基于框架编写驱动代码2.1 编写上层应用代码2.2 修改内核驱动框架代码2.3 部分代码解读2.3.1 static的作用2.3.2 结构体成员变量赋值方式2.3.3 结构体file_operations(最…

3.X内核下设备树–platform设备驱动

1。历史的车轮总是向前&#xff0c;技术更替。在linus 同学发出那句 WFK 后内核进入了设备树时代&#xff08;站在驱动工程师角度&#xff09;。 前几天我已经被mach-imx 中的文件折磨的夜不能眠。我终于在一个清晨&#xff0c;喝完一杯咖啡后决定放弃蹩脚的传统device描述方式…

六核cpu安装SQL Server 2005时报错,提示启动服务失败

2019独角兽企业重金招聘Python工程师标准>>> 新买的IBM3650M4的服务器上安装SQL server2005 安装到一半时&#xff0c;报"提示&#xff1a;SQL Server 服务无法启动。"错。 一开始以为是操作系统的问题&#xff0c;先重装了一遍&#xff0c;还是不行&…

网络编程知识预备(1) ——了解OSI网络模型

参考&#xff1a;简单了解OSI网络模型 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 20:07:09 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114968802?spm1001.2014.3001.5502 根据需求摘抄自下面这篇文章&#xff0c;内容非常详…

antd表格显示分页怎么取消_真相!Word里怎么也删不掉的文档空白页原来是这样...

大家好&#xff0c;我是你们的海宝老师在Word里&#xff0c;经常会遇到这种情况&#xff1a;文档莫名其妙地多出一个或多个空白页&#xff0c;没啥内容却怎么也删不掉。不着急&#xff0c;咱们来一一分析。1、标题前的空白页像这种标题前面有空白&#xff0c;基本就是【段落】设…

网络编程知识预备(2) ——三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL

参考&#xff1a;浅显易懂的三次握手与四次挥手 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-19 09:33:20 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114990198?spm1001.2014.3001.5502 参考&#xff1a;&#xff08;四十七&…

面向对象2

python之路——面向对象进阶 阅读目录 isinstance和issubclass反射setattr  delattr  getattr  hasattr__str__和__repr____del__item系列__getitem__  __setitem__  __delitem____new____call____len____hash____eq__回到顶部isinstance和issubclass isinstance(obj…

DM9000网卡原理与基地址设置

从上面可以看出DM9000的地址总线就一根&#xff0c;它不像CS8900那样地址总线和数据总线都齐全。而这里只有一根地址线(CMD)&#xff0c;16跟数据线&#xff0c;所以可以确定位宽为16位&#xff0c;而地址线为什么只有一根&#xff0c;这是DM9000决定的&#xff0c;看手册可以知…

网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系

参考&#xff1a;SOCKET,TCP,HTTP之间的区别与联系 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-19 11:54:01 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114992140?spm1001.2014.3001.5502 参考&#xff1a;TCP连接、Http连接与S…

debian 9 安装后的配置,debian 9 开发环境。

注意&#xff1a;以下命令用sudo或者以root用户进行 一.Xterm&#xff08;在安装KDE桌面情况下&#xff09;的配置&#xff08;可以黏贴&#xff0c;复制&#xff09;&#xff1a; 首先在根目录下编辑文件.Xresources(没有可以创建) rootdebian:~# vim ~/.Xresources rootdebi…

嵌入式RT3070 AP模式移植

环境&#xff1a;ubuntu1~14.04.3 编译器&#xff1a;arm-none-linux-gnueabi-gcc-4.8.3 无线网卡为RT3070&#xff0c;驱动分为STA驱动和SoftAP驱动两种&#xff0c;STA驱动支持无线网卡工作在STA模式下&#xff0c;而SoftAP的驱动支持无线网卡工作在软AP的模式下&#xff0…

Wireshark抓包介绍和TCP三次握手分析

wireshark介绍 wireshark的官方下载网站&#xff1a; http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件&#xff0c;功能十分强大。可以截取各种网络封包&#xff0c;显示网络封包的详细信息。 wireshark是开源软件&#xff0c;可以放心使用。 可以运行在Wind…

网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议

参考&#xff1a;简单了解HTTP协议与HTTPS协议 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-15 10:55:13 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114807328?spm1001.2014.3001.5502 编程实现人脸识别需要基于人工智能平台&…

Django之orm查询

ORM相关 MVC或者MVC框架中包括一个重要的部分&#xff0c;就是ORM&#xff0c;它实现了数据模型与数据库的解耦&#xff0c;即数据模型的设计不需要依赖于特定的数据库&#xff0c;通过简单的配置就可以轻松更换数据库&#xff0c;这极大的减轻了开发人员的工作量&#xff0c;不…

智能家居 (2) ——设计模式的引入

目录设计模式的概念引入工厂模式的实现animal.hmainPro.ccat.cdog.cperson.c工厂模式的功能验证往期文章设计模式的概念引入 工厂模式的实现 所有代码最好在Source Insight下编写&#xff0c;并将所有代码进行关联&#xff0c;方便读写。 animal.h #include <stdio.h>s…

卷积核和全连接层的区别_「动手学计算机视觉」第十六讲:卷积神经网络之AlexNet...

前言前文详细介绍了卷积神经网络的开山之作LeNet&#xff0c;虽然近几年卷积神经网络非常热门&#xff0c;但是在LeNet出现后的十几年里&#xff0c;在目标识别领域卷积神经网络一直被传统目标识别算法(特征提取分类器)所压制&#xff0c;直到2012年AlexNet(ImageNet Classific…

vnc配置备忘录

因为我开发板上要用到Qt&#xff0c;所以我在服务器上安装了Qt的开发环境&#xff0c;为了能远程连接到服务器我安装了VNC&#xff0c; 中间也是遇到了很多问题&#xff0c;比如连接上去后&#xff0c;只显示一个控制台的窗口&#xff0c;只能使用命令行。后来几经周折才搞定先…