#include "iostream"
using namespace std;struct Node
{int left;          //区间的起点int right;           //区间的终点int mid;         //用来进行插入操作的int value;           //值
};Node Tree[300000];void BuildTree(int level, int left, int right)//level应该是层的意思
{Tree[level].value = 1;Tree[level].left = left;Tree[level].right = right;Tree[level].mid = (left+right)/2;//也就是说,这个树一直发展下线,当他的下线为元节点的时候,返回上一层。//进行继续的调用,当所有的元节点都建好的时候,整个线段树也就建立好啦if(left==right)return;//如果不是元节点,建立子树else{BuildTree(2*level, left, Tree[level].mid);BuildTree(2*level+1, Tree[level].mid+1, right);}
}//插入操作
void Insert(int level, int left, int right, int value)
{//如果找到这个节点,并且返回if(left==Tree[level].left && right==Tree[level].right){Tree[level].value = value;return;}//我感觉是开始的时候,我们建立了一个整体的树,因为屠夫开始的时候都是铜筷子,//所以,所有的单元的值都是1//Tree[level].value=0;表示两颗子树的值不相同//作用很明确,首先把自己的值传递给两颗子树,因为自己大难到啦,让后把自己的//数值清零,表示两颗子树的值不一样,让后再进行改变if(Tree[level].value != 0){Tree[2*level].value = Tree[level].value;Tree[2*level+1].value = Tree[level].value;Tree[level].value = 0;}//插入左区间if(right <= Tree[level].mid)Insert(2*level, left, right, value);//插入右区间else if(left > Tree[level].mid)Insert(2*level+1, left, right, value);//这个其实也很容易理解,就是我把左部分插入到左区间,右部分插入到右区间(当然啦这是一种递归的插入)else{Insert(2*level, left, Tree[level].mid, value);Insert(2*level+1, Tree[level].mid+1, right, value);}
}int SumUp(int level, int left, int right)
{//这个部分是出口,就像阶乘一样,一定先写的是一个阶乘的出口函数。//这个部分的功能应该是计算这一层的值。//如果下一层的值是>0表示这个存贮单元到头了,需要计算一下返回。if(Tree[level].value > 0){return Tree[level].value*(Tree[level].right-Tree[level].left+1);//因为这个存贮单元的值都是相同的,所以只用×一下就可以啦}//算右树if(left > Tree[level].mid)return SumUp(2*level+1, left, right);//算左树else if(right <= Tree[level].mid)return SumUp(2*level, left, right);//其他请款下,算左树和右树的和。elsereturn SumUp(2*level, left, Tree[level].mid)+SumUp(2*level+1, Tree[level].mid, right);//累加的功能是在上面的这个return语句实现的,这个就是递归的妙处了。
}int main()
{//freopen("in.txt","r",stdin);int Case, lenofline, numofoper, left, right, value;while(cin>>Case){for(int i=1; i<=Case; i++){cin>>lenofline>>numofoper;BuildTree(1, 1, lenofline);while(numofoper--){cin>>left>>right>>value;Insert(1, left, right, value);//我的语言是正确的level不是表示要插入的层次,而是表示当前层的层次}cout<<"Case "<<i<<": The total value of the hook is "<<SumUp(1, 1, lenofline)<<"."<<endl;}}return 0;
}

hdoj 1698 线段树相关推荐

  1. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化

    第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...

  2. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  3. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  4. hdu 1698 线段树成段更新

    这么重要的数据结构还是得学啊.仿notonlysuccess的代码风格 #include <cstdio> #include <algorithm> #include < ...

  5. HDOJ 3911 线段树

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给出01串 1代表黑色 0代表白色 0 a b:询问[a,b]中1的连续最大长度 1 a, ...

  6. HDOJ 1698 Just a Hook(线段树成段更新)

    题意: 屠夫的钩子区间是1~n,每段可能由铜,银,金组成,价值分别为1,2,3,进行一系列的更新之后,求钩子的总价值. 思路: 线段树的成段更新:要设置一个临时的线段树,每次更新的时候把更新段的值放在 ...

  7. 线段树专辑——hdu 1698 Just a Hook

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 这是一个区间染色的问题,对于区间染色问题,通常的方法是在线段树中定义一个cover域,当cover的值为- ...

  8. hdu 1698 Just a Hook 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Let us number the consecutive metallic sticks of ...

  9. HDOJ 4302 Holedox Eating (multiset || 线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4302 思路:很多人说这题是个线段树题...不过当时没想出来怎么用线段树做~后面再补吧... 比赛时用的 ...

最新文章

  1. 92.芯片组 93.北桥 94.南桥
  2. 微型计算机中abcd是指,一级笔试模拟试题二(答案)
  3. oracle查找异常中断的sqlid方法,Oracle查找锁定对象以及强制解除锁定的方法
  4. Elasticsearch数据备份与恢复(基于HDFS)
  5. python语言有哪些类型的运算符_python(4)-变量 数据类型和运算符
  6. MTK 驱动开发(27)---TP 驱动分析
  7. 东财计算机应用基础在线作业一,东财《计算机应用基础》综合作业
  8. GPRS管理与创建APN拨号连接
  9. micropython支持stm32型号_轻松几步实现在STM32上运行FreeRTOS任务
  10. accept - 指示打印系统接受发往指定目标打印机的打印 任务
  11. Your GPU Compute Capability计算能力
  12. JS将sql的dateTime格式数据例如:Wed Sep 30 00:00:00 CST 2020 字符串转换成2020-09-30 00:00:00时间格式
  13. 用PS抠图做电子签名
  14. 用流量扫码总显示无法连接服务器,手机有流量但无法连接网络?手机数据网络不能访问互联网...
  15. python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式
  16. ifconfig 命令详解
  17. sct文件编写与使用
  18. 22春天津大学《工程地质学》在线作业二
  19. 场强和电阻_场强是标量还是矢量 如何判断
  20. limma | 配对样本的差异分析怎么搞!?(一)

热门文章

  1. rocky8执行python3脚本
  2. 服务器转移系统,服务器迁移系统
  3. Python从入门到摔门(7):【总结】浏览器 User-Agent 大全
  4. jakarta ee_Jakarta EE 8发布@ Eclipse Foundation
  5. 访问网站数据库的一个方法
  6. 界下科技:支付宝牵头成立无现金联盟 未来两年60亿推进无现金
  7. 【ESP32 S2 烧录AT固件 串口与USB两种方式】
  8. OOP(Object,Oriented Programming)
  9. 使用UglifyJS实现将js代码压缩混淆
  10. Rust语言的成长经历