hdu 1698 线段数的区间更新 以及延迟更新
先说说区间更新和单点更新的区别 主要的区别是搜索的过程 前者需要确定一个区间 后者就是一个点就好了
贴上两者代码
void updata(int i)//单点更新
{
int l=stu[i].l;
int r=stu[i].r;
int mid=(l+r)/2;//二分咯
if(l==r&&r==x)//x为目标id 当左右节点相同的时候 就是找到这个数的时候
{
stu[i].maxx=y;
return;
}
if(l<=x&&x<=mid) updata(i*2);//向左找
else updata(i*2+1);//向右找
stu[i].maxx=max(stu[i*2].maxx,stu[i*2+1].maxx);//回溯的时候 更新max的数据
}
void update(int l,int r,int count)//x,y代表要更新的区间 //区间更新
{
if(l>=x&&r<=y)
{
mapp[count].sum=z*mapp[count].len;
mapp[count].flag=z;
return;
}
pushdown(count);
int mid=(l+r)/2;
if(x<=mid) update(l,mid,count*2);
if(y>=mid+1) update(mid+1,r,count*2+1);
mapp[count].sum=mapp[count*2].sum+mapp[count*2+1].sum;
}
在区间更新的时候 有的时候 我们不需要更新到底部 那么 这里引进一个延迟更新的概念 在搜索包含在我们需要的区间里面时 就可以返回了 那么在下次询问的时候 怎么保证底层的数据更新呢? 这里需要一个flag标记 如果当前的flag不为0的时候 向下更新 并更改当前的flag 比如在1-10标号的区间里面 我们要更新1-5的值
上代码
#include<iostream>
#define maxn 111111
using namespace std;
int n,q,x,y,z;
struct stu
{
int l,r,sum,flag,len;
};
stu mapp[maxn*4];
void build(int l,int r,int count)
{
mapp[count].l=l;
mapp[count].r=r;
mapp[count].flag=0;
mapp[count].len=r-l+1;
if(l==r)
{
mapp[count].sum=1;
mapp[count].flag=1;
return;
}
int mid=(l+r)/2;
build(l,mid,count*2);
build(mid+1,r,count*2+1);
mapp[count].sum=mapp[count*2].sum+mapp[count*2+1].sum;
}
void pushdown(int count)
{
if(mapp[count].flag)//如果有标记 向下更新
{
mapp[count*2].flag=mapp[count].flag;
mapp[count*2+1].flag=mapp[count].flag;
mapp[count*2].sum=mapp[count].flag*mapp[count*2].len;
mapp[count*2+1].sum=mapp[count].flag*mapp[count*2+1].len;
mapp[count].flag=0;//更新过一次 标记得消除
}
}//向下更新的过程
void update(int l,int r,int count)//x,y代表要更新的区间
{
if(l>=x&&r<=y)
if(l==r)
{
mapp[count].sum=z*mapp[count].len;
mapp[count].flag=z;
return;
}
pushdown(count);
int mid=(l+r)/2;
if(x<=mid) update(l,mid,count*2);
if(y>=mid+1) update(mid+1,r,count*2+1);
mapp[count].sum=mapp[count*2].sum+mapp[count*2+1].sum;
}
int main()
{
cin.sync_with_stdio(false);
int t;
cin>>t;
int casee=1;
while(t--)
{
cin>>n;
build(1,n,1);
cin>>q;
while(q--)
{
cin>>x>>y>>z;
update(1,n,1);
}
cout<<"Case "<<casee++<<": The total value of the hook is ";
cout<<mapp[1].sum<<"."<<endl;
}
return 0;
}
hdu 1698 线段数的区间更新 以及延迟更新的更多相关文章
- HDU 1698 <线段树,区间set>
题目连接 题意: 一条长为N的铜链子,每个结点的价值为1.有两种修改,l,r,z; z=2:表示把[l,r]区间内链子改为银质,价值为2. z=3:表示把[l,r]区间内链子改为金质,价值为3. 思路 ...
- HDU(1698),线段树区间更新
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 区间更新重点在于懒惰标记. 当你更新的区间就是整个区间的时候,直接sum[rt] = c*(r- ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
- HDU 1698 (线段树 区间更新) Just a Hook
有m个操作,每个操作 X Y Z是将区间[X, Y]中的所有的数全部变为Z,最后询问整个区间所有数之和是多少. 区间更新有一个懒惰标记,set[o] = v,表示这个区间所有的数都是v,只有这个区间被 ...
- hdu 1698 线段树 区间更新 区间求和
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2795 Billboard 线段树,区间最大值,单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU - 1698 线段树区间修改,区间查询
这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...
- hdu 1698 线段树成段更新
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 #include <cstdio> #include <cmath> # ...
- E - Just a Hook HDU - 1698 线段树区间修改区间和模版题
题意 给出一段初始化全为1的区间 后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...
随机推荐
- 小福bbs——项目需求分析
# 一.简单了解 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 第一个版本,根据项目预期情况形成 作业的正文 小福bbs--项目需求分析 其 ...
- Win+数字快速启动/切换指定程序
Windows键+数字,可以快速启动任务栏上的程序 按下按下Win+4桌面将切换到排序第4的程序:页也就是谷歌浏览器. 今天刚发现这个小功能. 文章来源:外星人来地球 欢迎关注,有问题一起学习欢迎 ...
- 初识kaggle,以及记录 kaggle的使用
1.简介:Kaggle是一个数据建模和数据分析竞赛的平台.企业和研究者可在其上发布数据,统计学者和数据挖掘专家可在其上进行竞赛,通过“众包”的形式以产生最好的模型.Kaggle可以分为Competit ...
- 使用ConstraintLayout(约束布局)构建响应式UI
使用ConstraintLayout(约束布局)构建响应式UI 转 https://www.300168.com/yidong/show-2740.html 核心提示:ConstraintLa ...
- osg fbx 模型结构操作
osg::Node* TeslaManage::findOsgNodeByName(QString &nodeNme) { osg::Node* findNode = NULL; std::v ...
- linux禁止特定ip访问某个端口
linux禁止特定ip访问某个端口 解决方法: 禁止特定ip访问8501端口的命令0:iptables -I INPUT -s 192.168.0.232 -ptcp --dport 8501 - ...
- 将Python的Django框架与认证系统整合的方法
将Python的Django框架与认证系统整合的方法 这篇文章主要介绍了将Python的Django框架与认证系统整合的方法,包括指定认证后台和编写认证后台等内容,需要的朋友可以参考下 将Django ...
- MySQL创建及删除临时表
示例SQL: drop temporary table if exists testdb.tmp_test_table; create temporary table testdb.tmp_test_ ...
- C#RSA加密解密(对接PHP)
上篇文章中写的RSA加密是针对C#的,现在外部调用的是PHP,我们平常见到的RSA无论公钥和私钥都是一长串数字,很显然C#生成的XML不是通用的加密.如果外部调用需要处理一下. 一.首先可以去网上找一 ...
- 【数据库开发】windows下hiredis的编译(主要是包括一些异步编程的错误)
果然,高端的程序员真心是鸟都不鸟windows的,Redis的客户端找了一圈愣是没有C++的windows版本 我要做个windows上的C++的服务器都没办法和redis交互 github上所有能试 ...