HDU 1698 线段树 区间更新求和
一开始这条链子全都是1
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
using namespace std;
///线段树 区间更新
#define MAX 100050
struct node
{
int left;
int right;
int mark;
int total;
};
node tree[MAX*4];
int build(int root,int left,int right)
{
tree[root].left=left;
tree[root].right=right;
tree[root].mark=1;
if(left==right)
{
return tree[root].total=0;
}
int mid=(left+right)>>1;
tree[root].total=(build(root<<1,left,mid)+build(root<<1|1,mid+1,right)); }
void update_mark(int root)
{
if(tree[root].mark!=0)
{
tree[root].total=(tree[root].right-tree[root].left+1)*tree[root].mark;
if(tree[root].left!=tree[root].right)
{
tree[root<<1].mark=tree[root<<1|1].mark=tree[root].mark;
}
tree[root].mark=0;
}
}
int update(int root,int l,int r,int va)
{
update_mark(root);
if(r<tree[root].left||l>tree[root].right)
return tree[root].total;
if(l<=tree[root].left&&r>=tree[root].right)
{
tree[root].mark=va;
return tree[root].total=(tree[root].right-tree[root].left+1)*va;
}
return tree[root].total=(update(root<<1,l,r,va)+update(root<<1|1,l,r,va));
}
int cal(int root,int l,int r)
{
update_mark(root);
if(r<tree[root].left||l>tree[root].right)
return 0;
if(l<=tree[root].left&&r>=tree[root].right)
{
return tree[root].total;
}
return (root<<1,l,r)+cal(root<<1|1,l,r);
}
int main(){
int t;
scanf("%d",&t);
int tt=0;
while(t--)
{
tt++;
int n;
scanf("%d",&n);
build(1,1,n);
int q;
scanf("%d",&q);
for(int i=0;i<q;i++)
{
int l,r;
int val;
scanf("%d%d%d",&l,&r,&val);
update(1,l,r,val);
}printf("Case %d: The total value of the hook is %d.\n",tt,cal(1,1,n ));
}
}
HDU 1698 线段树 区间更新求和的更多相关文章
- hdu 1698 线段树 区间更新 区间求和
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU(1698),线段树区间更新
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 区间更新重点在于懒惰标记. 当你更新的区间就是整个区间的时候,直接sum[rt] = c*(r- ...
- HDU 1698 (线段树 区间更新) Just a Hook
有m个操作,每个操作 X Y Z是将区间[X, Y]中的所有的数全部变为Z,最后询问整个区间所有数之和是多少. 区间更新有一个懒惰标记,set[o] = v,表示这个区间所有的数都是v,只有这个区间被 ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- E - Just a Hook HDU - 1698 线段树区间修改区间和模版题
题意 给出一段初始化全为1的区间 后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...
- FZU 2171 线段树 区间更新求和
很模板的题 在建树的时候输入 求和后更新 #include<stdio.h> #include<string.h> #include<algorithm> #inc ...
- [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- HDU - 1698 线段树区间修改,区间查询
这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...
- Hdu 1698(线段树 区间修改 区间查询)
In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroes. T ...
随机推荐
- Flesch Reading Ease (poj 3371)
题意: 给出一篇规范的文章,求其 句子数.单词数 和 音节数把这3个值代入题目给出的公式,输出其结果,保留2位小数. 标记单词分隔符: 逗号(,) 和 空格( ) 句子分隔符:句号(.) 问号(?) ...
- Linux下如何设置和查看环境变量
Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 按作用范 ...
- 更改Windows控制台默认缓冲区行数和宽度
Windows控制台窗口默认的显示行数很少, 以至于有时候要显示很多东西的时候, 总是导致前面的内容丢失. 很不爽. 于是GG了下, 在StackOverflow上找到了答案~~~ 设置方式: 1. ...
- 利用JS提交表单的几种方法和验证
第一种方式:表单提交,在form标签中增加onsubmit事件来判断表单提交是否成功 <script type="text/javascript"> function ...
- C++学习网站(转)
想要学习C++,这里有一些很好资源. http://www.open-std.org/JTC1/SC22/WG21/ 这是C++标准的官网,这里是最全最新的,没有再比这个网站里的东西更有权威. htt ...
- AngularJS 'Controller As'用法
AngularJS 1.2版本中提供了Controller As语法,简单说就是可以在Controller中使用this来替代$scope,使得Controller更像一个传统的JS类,相对于$sco ...
- 桌面窗体应用程序,FormClosing事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //主窗体关闭时,弹出对话框.判断对话框的返回值(即用户 ...
- WinForm窗体间传值
1.通过构造函数 特点:传值是单向的(不可以互相传值),实现简单 实现代码如下: 在窗体Form2中 int value1; string value2; public Form2 ( int val ...
- [转载]GMM的EM算法实现
在聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut一文中我们给出了GMM算法的基本模型与似然函数,在EM算法原理中对EM算法的实现与收敛性证明 ...
- 吃豆子(Packman)
ZLYD团队总结--吃豆子(Packman) 一.设计主要内容 玩家可以通过键盘或鼠标控制游戏区.游戏采取分数和血量制,当血量用尽时游戏结束,游戏以最终玩家获得的分数来判断玩家水平的高低.使用IEDA ...