测试题目:P3372 【模板】线段树 1 https://www.luogu.org/problemnew/show/P3372

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define lson l,m,rt << 1
#define rson m+1,r,rt << 1|1
using namespace std;
inline void fast(){ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);}
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+10;
const int mod = 1000;
int n,m,T;
ll sum[maxn << 2];//记录区间和
ll add[maxn << 2];//记录区间标记
struct Node{int l,r;int mid(){return (l + r) >> 1;}
}tree[maxn << 2];  //每个数组都要开4倍空间void PushUp(int rt){sum[rt] = sum[rt << 1] + sum[rt << 1|1];//父节点等于两个子节点的和
}void PushDown(int rt,int len){if(add[rt]){ //如果存在标记add[rt << 1] += add[rt]; //把标记向下传递add[rt << 1|1] += add[rt];sum[rt << 1] += (ll)add[rt]*(len - (len >> 1)); //此处要开ll 不然可能回炸int,乘上区间长度sum[rt << 1|1] += (ll)add[rt]*(len >> 1);add[rt] = 0; //标记归零}
}void BuildTree(int l,int r,int rt){tree[rt].l = l; tree[rt].r = r; //对区间进行初始化if(l == r){ //如果左右区间相等,到达了最终节点,此时这个节点的和就是它本身,直接输入cin >> sum[rt];return ;}int m = tree[rt].mid();BuildTree(lson); //分别向左右建树BuildTree(rson);PushUp(rt);//向上传递他们的和
}void UpdataTree(int c,int l,int r,int rt){if(tree[rt].l == l && tree[rt].r == r){  //如果找到了我们需要修改的区间add[rt] += c; //打上标记sum[rt] += (ll)c*(r - l + 1); //增加区间长度 ,还是要开llreturn ;}PushDown(rt,tree[rt].r - tree[rt].l + 1); //每次更改都向下把这个延迟标记传递下去int m = tree[rt].mid();if(r <= m) //如果我要查询的右区间比我的标准中值要小,我需要向左查询UpdataTree(c,l,r,rt << 1);else if(l > m) //反之,如果我的左区间比标准区间大,我向右查询UpdataTree(c,l,r,rt << 1|1);else {UpdataTree(c,lson); //如果再中间,要向两边查询UpdataTree(c,rson);}PushUp(rt);
}ll Query(int l,int r,int rt){if(tree[rt].l == l && tree[rt].r == r)return sum[rt];int m = tree[rt].mid();PushDown(rt,tree[rt].r - tree[rt].l + 1);ll res = 0;if(r <= m)res += Query(l,r,rt << 1);else if(l > m)res += Query(l,r,rt << 1|1);else {res += Query(lson) + Query(rson);}return res;
}int main()
{fast();while(cin >> n >> m){memset(sum,0,sizeof(sum));memset(add,0,sizeof(add));BuildTree(1,n,1);while(m--){int op,x,y,k;cin >> op;if(op == 1){cin >> x >> y >> k;UpdataTree(k,x,y,1);} else {cin >> x >> y;printf("%lld\n",Query(x,y,1));}}}return 0;
}

线段树板子(区间修改)相关推荐

  1. 线段树(区间修改,区间查询)

    线段树的区间修改 本题如果用单点修改的思想会T,所以需要引入一个数组lazylazylazy , 优秀程序员必备 lazylazylazy定义 此为偷懒 该数组意在储存 treetreetree 数组 ...

  2. 【线段树】区间修改(区间覆盖、区间权值加)标记下放操作的逻辑顺序

    洛谷传送门:月下"毛景树" 由于没有合适的题目,就从这道题入手,解此题时用到的算法/数据结构包括: 树链剖分 线段树(区间覆盖.区间加.区间查询.单点修改) 这道题被我调试了四个小 ...

  3. 线段树(区间修改)模板题 Luogu 2357 守墓人

    众所周知,线段树可以在O( log n)的时间内进行很多修改和查询的操作,应用很广. 线段树,顾名思义,是一个二叉树,但是每个节点,存的不是不是"数",而是一个"区间&q ...

  4. hihocoder #1078 : 线段树的区间修改

    解题思路:基础的线段树区间修改 我按照书上敲的代码不知道为什么WA... #include<iostream> #include<cstdio> #include<cst ...

  5. A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)

    题意: 有一个数组,有两种操作.1: Q a b 求[a,b]的和 2:C a b c 给[a,b] 的所有元素都加上c. 题目: You have N integers, A1, A2, ... , ...

  6. FJUT 借教室 (线段树区间查询+区间修改)

    解题思路:看到题目,经典的区间查询+区间修改,我们用线段树维护一段区间的最小值,每当有新的订单,我们就先查询订单时间范围内的最小教室数量,然后与Dj作比较,如果比dj小,那么我们可以标记为false, ...

  7. 线段树(区间修改 + 根节点查询):Just a Hook

    注意: 懒标记中当分裂的时候会进行pushdown,而pushdown中必定会将当前要被分裂的节点的懒标记值清为0,不留保留下来.因为保留下来的话,当下次进行分裂的时候,又会对此节点进行pushdow ...

  8. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  9. 几个线段树板子(区间加/区间加与乘)

    一直仰慕dl能够把线段树玩出花来,所以就想手写并整理一下几个常见的线段树板子(主要是结构化得好看一些) Part Ⅰ区间加法+区间求和 洛谷P3372 基础中的基础 //luogu P3372 199 ...

  10. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

最新文章

  1. 大话设计模式(八 用“策略模式”是一种好策略)
  2. shanghai road map
  3. python统计httpd 进程的内存占用百分比
  4. cocos2d-x android 环境搭配,cocos2d-x Android环境配置问题和解决方法
  5. PHP监測memcache服务端的执行状况
  6. Linux Linux常用命令二
  7. python中else和if的结合语句_python中else和if的结合语句_python中的if-else语句和字典...
  8. 2021人工智能竞赛白皮书:1000场竞赛的深度分析
  9. 从入门到入土:python爬虫|SCU每日打卡自动填写|测试训练|
  10. QT串口QSerialPort解决接收数据不完整问题
  11. 【Python之旅】第四篇(四):基于面向对象的模拟人生游戏类
  12. rhcsa第二天笔记
  13. Apache Flink 的迁移之路,2 年处理效果提升 5 倍
  14. python使用lxml解析html获取页面内所有叶子节点的xpath路径
  15. java 序列号 1l_private static final long serialVersionUID=1L 是什么意思
  16. 【IMX6UL开发板试用体验】上手试用与资源使用
  17. 二阶矩阵转置怎么求_这个二阶矩阵的二范数怎么求
  18. Django短信验证码
  19. 网络营销和电子商务傻傻分不清?
  20. mysql分析问卷_问卷调查相关表

热门文章

  1. 如何选择一个适合自己并且有前景的职业?
  2. 华为怎么清除Android,华为手机内存不足怎么清理?华为手机内存不足解决方法...
  3. Java 异步调用实践
  4. NLP之一文搞懂word2vec、Elmo、Bert演变
  5. 环境影响评估评价项目管理系统简介
  6. 机械制造作业考研题目答案分享——金属切削规律1
  7. access查找出生日期年份_在 Access 查询中使用日期作为条件的示例
  8. 【KD】Correlation Congruence for Knowledge Distillation
  9. 小笔记-简单但够用系列_PPT内嵌html格式动态图表运行时错误
  10. 弘辽科技:淘宝品牌混淆会被扣分吗?