线段树整理
时间:2019-09-28
本文章向大家介绍线段树整理,主要包括线段树整理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//每天整理一点,太多了
https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html#4175712(ORZ)
POJ 3468 板子题 注意下数据范围 (因为int会爆,以后一定好好看题,浪费我10min....)
http://poj.org/problem?id=3468
#include<iostream>//线段树题目集 #include<cstdio> #include<cstring> using namespace std; const int maxn = 4e5 + 15; typedef long long ll; typedef struct { ll l,r,sum,f;//sum为区间和,f为懒人标记 }node; node Tree[maxn];//线段树 ll n,q; ll _left,_right,value; void buildTree(int l,int r,int cur) { Tree[cur].l = l; Tree[cur].r = r;//左右区间范围 if(l==r) { scanf("%lld",&Tree[cur].sum); return; } int mid = (l + r) >> 1; buildTree(l,mid,cur*2); buildTree(mid+1,r,cur<<1|1); Tree[cur].sum = Tree[cur<<1].sum + Tree[cur<<1|1].sum; }//建树 void Down(int cur) { Tree[2*cur].f += Tree[cur].f; Tree[2*cur+1].f += Tree[cur].f; Tree[2*cur].sum += (Tree[2*cur].r - Tree[2*cur].l + 1)*Tree[cur].f; Tree[2*cur+1].sum += (Tree[2*cur+1].r - Tree[2*cur+1].l + 1)*Tree[cur].f; Tree[cur].f = 0;//因为已经传下去了,所以清零 }//懒标记下传 ll ans; void ask_interval(int cur) { if(_left<=Tree[cur].l&&Tree[cur].r<=_right) { ans += Tree[cur].sum; return; } if(Tree[cur].f) Down(cur);//下传懒人标记 ll mid = (Tree[cur].l + Tree[cur].r) >> 1;//mid 中间值 if(_left<=mid) ask_interval(cur<<1); if(_right>mid) ask_interval(cur<<1|1); } void change_interval(int cur) { if(_left<=Tree[cur].l&&Tree[cur].r<=_right)//if node 在区间范围内 { Tree[cur].sum += (Tree[cur].r - Tree[cur].l + 1)*value; Tree[cur].f += value; return; } if(Tree[cur].f) Down(cur); ll mid = (Tree[cur].l + Tree[cur].r) >> 1;//mid 中间值 if(_left<=mid) change_interval(cur<<1); if(_right>mid) change_interval(cur<<1|1); Tree[cur].sum = Tree[cur<<1].sum + Tree[cur<<1|1].sum;//(important) 更新完后一定要更新sum的总和值 }//线段树区间修改 int main() { while(scanf("%lld%lld",&n,&q)==2)//写返回值,不然可能会有些很SB的output 超出limit { memset(Tree,0,sizeof(Tree)); buildTree(1,n,1);//1 ~ n为范围,cur 为当前节点 char cmd; while(q--) { ans = 0; getchar(); scanf("%c",&cmd);//区间查询,区间修改 scanf("%lld%lld",&_left,&_right); if(cmd=='Q') { ask_interval(1); cout<<ans<<endl; }else{ scanf("%lld",&value); change_interval(1); } } } }
原文地址:https://www.cnblogs.com/newstartCY/p/11605226.html
- spring cloud 学习(3) - feign入门
- Java集合源码分析(四)HashMap
- Java魔法堂:解读基于Type Erasure的泛型
- 显示mybatis的执行的sql
- spring cloud 学习(2) - eureka server注册中心高可用及安全认证
- mybatis在xml文件中处理大于号小于号的方法
- kafka集群部署
- Hadoop(九)Hadoop IO之Compression和Codecs
- 安卓第二夜 有趣的架构
- spring-boot 速成(12) - 如何注入多个redis StringRedisTemplate
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
- 简明 Git 命令速查表
- spring cloud 学习(8) - sleuth & zipkin 调用链跟踪
- 快速学习Bash
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入浅出神经网络的改进方法!
- 机器学习4个常用超参数调试方法!
- 总结:DCIC算法分析赛完整方案分享!
- 提高微服务安全性的11个方法
- nmap
- MSF基础与应用
- Windows系统组件漏洞
- 【风险通告】FastAdmin会员中心Getshell漏洞
- Azure Cosmos DB介绍及演示
- 从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta
- 《一起学sentinel》一、一起搭建sentinel服务
- InfluxDB和Grafana实现传感器数据的存储和可视化
- 样本相关性分析
- Android 序列化 Serializable与Parcelable
- 《一起学sentinel》二、初探sentinel的Slot