线段树(结构体)模板

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<map>
#include<cmath>
#include<string>
using namespace std;
typedef long long ll;
int ans;
struct node
{int l, r, w;int f;
};
struct node tree[50000 * 4 + 1];
void BuildSegmentTree(int k, int l, int r)     // 建线段树
{tree[k].l = l;tree[k].r = r;if(l == r){scanf("%lld", &tree[k].w);return ;}int m = (tree[k].l + tree[k].r) >> 1;BuildSegmentTree(k << 1, l, m);BuildSegmentTree(k << 1 | 1, m + 1, r);tree[k].w = tree[k << 1].w + tree[k << 1 | 1].w;
}
void down(int k)                      // 懒标记
{tree[k << 1].f += tree[k].f;tree[k << 1 | 1].f += tree[k].f;tree[k << 1]. w += tree[k].f * (tree[k << 1].r - tree[k <<1].l + 1);tree[k << 1 |1].w += tree[k].f * (tree[k << 1| 1].r - tree[k << 1| 1].l + 1);tree[k].f = 0;
}
void Single_Point_Modification(int k, int x, int y)   // 单点修改
{if(tree[k].l == tree[k].r){tree[k].w += y;return ;}int m = (tree[k].l + tree[k].r) >> 1;if(x <= m) Single_Point_Modification(k << 1,x, y);else Single_Point_Modification(k << 1 | 1, x, y);tree[k].w = tree[k << 1].w + tree[k << 1 | 1]. w;
}
void Single_Point_Query(int k, int x)     // 单点查询
{if(tree[k].l == tree[k].r){ans = tree[k].w;return ;}if(tree[k].f) down(k);int m = (tree[k].l + tree[k].r) >> 1;if(x <= m) Single_Point_Query(k << 1, x);else Single_Point_Query(k << 1 | 1, x);
}
void Interval_modification(int k, int x, int y,int z)  //区间修改
{if(tree[k].l >= x && tree[k].r <= y){tree[k].w += (tree[k].r - tree[k].l + 1) * z;tree[k].f += z;return;}if(tree[k].f) down(k);int m = (tree[k].l + tree[k].r) >> 1;if(x <= m) Interval_modification(k << 1, x, y, z);if(y > m) Interval_modification(k << 1 | 1, x, y, z);tree[k].w = tree[k << 1].w + tree[k << 1 | 1].w;
}
void Interval_Query(int k, int x, int y)  //区间查询
{if(tree[k].l >= x && tree[k].r <= y){ans += tree[k].w;return ;}if(tree[k].f) down(k);int m = (tree[k].l + tree[k].r) / 2;if(x <= m) Interval_Query(k << 1, x, y);if(y > m) Interval_Query(k << 1 | 1, x, y);
}char s[10];
int main()
{int T, n;while(~scanf("%d",&T)){int cas = 0;while(T--){scanf("%d", &n);BuildSegmentTree(1,1,n);printf("Case %d:\n",++ cas);while(1){int x, y, z;getchar();scanf("%s",s);if(s[0] == 'E')break;else if(s[0]== 'A')  // 区间修改{scanf("%d %d %d", &x, &y, &z);Interval_modification(1,x,y,z);}else if(s[0] =='B')   // 区间查询{ans = 0;scanf("%d %d", &x, &y);Interval_Query(1, x, y);printf("%d\n",ans);}else if(s[0]=='C')  // 单点修改{scanf("%d %d", &x, &y);Single_Point_Modification(1,x,y);}else if(s[0]=='D')  // 单点查询{ans = 0;scanf("%d", &x);Single_Point_Query(1,x);printf("%d\n",ans);}}}}return 0;
}

转载于:https://www.cnblogs.com/lcchy/p/10139640.html

线段树(结构体建法_QAQ)相关推荐

  1. CF786B Legacy(线段树优化建边模板 + 最短路)

    整理的算法模板合集: ACM模板 目录 线段树优化建边 题目传送门 由于本题的数据达到了1e5,所以如果直接全部暴力连边的话会达到O(n2)O(n^2)O(n2),时间包括内存都受不了.因此我们需要使 ...

  2. Luogu P1607 庙会班车【线段树】By cellur925

    题目传送门 据说可以用贪心做?算了算了...我都不会贪.... 开始想的是用线段树,先建出一颗空树,然后输进区间操作后就维护最大值,显然开始我忽视了班车的容量以及可以有多组奶牛坐在一起的信息. 我们肯 ...

  3. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)

    链接:https://nanti.jisuanke.com/t/A1607 题面: Consider an array AA with n elements . Each of its element ...

  4. 【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)

    problem 给定一个长为n的序列,m次询问 每次询问有3种操作 1.一段区间全部乘一个值 2.一段区间全部加一个值 3.询问一段区间和%P solution 不就一颗线段树么,看朕10分钟A掉.. ...

  5. [支配树][lca][倍增][线段树][拓扑] Jzoj P4240 游行

    Description 恶梦是学校里面的学生会主席.他今天非常的兴奋,因为学校一年一度的学生节开始啦!! 在这次节日上总共有N个节目,并且总共也有N个舞台供大家表演.其中第i个节目的表演时间为第i个单 ...

  6. C语言结构体和共同体

    文章目录 结构体 用typedef说明一个新类型 结构体类型数据的定义和成员的引用 概述 结构体的定义和使用 结构体数组 结构体排序 结构体赋值 结构体嵌套结构体 共用体(联合体) 结构体 用type ...

  7. 线段树辅助——扫描线法计算矩形面积并

    线段树辅助--扫描线法计算矩形面积并 本篇文章转自:传送门 分析: 1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度 ...

  8. Vijos1448题解---线段树+括号法

    描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的-- 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l. ...

  9. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的-- 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

最新文章

  1. 【Mybatis 之应用篇】1_Mybatis简介、第一个Mybatis程序和增删改查在Mybatis中的使用方式
  2. SQL 每行随机产生数字
  3. PostgreSQL学习笔记3之表的继承和分区
  4. 【北斗】北斗卫星导航系统(BDS)介绍
  5. 简短—揭开数学学科对于计算机应用的神秘面纱
  6. java 秒杀 源码 下载_java高并发秒杀系统3-4节秒杀功能实现.mp4
  7. 一文搞懂Java泛型到底是什么东东
  8. 条件数、奇异值与海森矩阵
  9. VS Code插件安装位置
  10. windows11 任务栏 wifi、音量、电源还有通知无法左击弹出内容框
  11. Java8新特性 方法引用(三)
  12. shell脚本:备份数据库、代码上线
  13. css view a if属性,uni-app学习笔记(2)view属性控制css样式
  14. 亚马逊、速卖通、东南亚等跨境电商平台2022年最新测评自养号系统
  15. eclipse中文语言包安装(别看网上那些乱七八糟的,我这个最简单)
  16. 面试入职工作感悟:在阿里的那些风花雪月的日子
  17. d3dcompiler_47.dll缺失怎么修复?D3DCompiler_47.dll修复工具下载
  18. python画图小猪佩奇动画片全集_用Python画小猪佩奇
  19. 陕甘回变——关陕残月(一)
  20. java编写满天星程序_java满天星效果的实现方法

热门文章

  1. SAP Revenue Cloud业务综述
  2. SAP Cloud for Customer创建Account也会生成对应的Business partner实例
  3. SAP CRM configuration product在UI上的显示逻辑
  4. 宽高自适应_css样式写出三角形,宽高自适应的正方形,扇形!
  5. 双向dcdc变换器simulink仿真_台达_OBC双向充电_HighEfficiency HighDensity GaNBased 6.6kW
  6. 如何使用graphpad做柱形图_系列文章 如何使用PaddleDetection做一个完整项目(三)...
  7. 怎么把程序内部坐标转为屏幕坐标_全网最详细CNC加工中心程序代码大全!
  8. linux更改甜器名称,Linux添加swap分区
  9. 计算机网络电信号误差,用0V~5V方式传输远方温度信号的弊端
  10. 基于matlab实现的人脸检测