hdu1698Just a Hook 线段树 成段更新水题
来源:互联网 发布:app下载数据统计 编辑:程序博客网 时间:2024/05/17 16:15
//简单的线段树,注意成段更新,以免超时
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
const int maxn = 100010 ;
struct node
{
int value ;
int r , l;
int flag ;//记录到当前区间的状态
}tree[maxn<<2] ;
void build(int l , int r ,int v)
{
tree[v].l = l;
tree[v].r = r;
tree[v].flag = 0;
if(l == r)
{
tree[v].value = 1;
return ;
}
int mid = (l+r)>>1 ;
build(l , mid , v<<1) ;
build(mid+1 , r , v<<1|1) ;
tree[v].value = tree[v<<1].value + tree[v<<1|1].value ;
}
void pushdown(int v)//向下传递
{
if(tree[v].flag)
{
tree[v<<1].flag = tree[v<<1|1].flag = tree[v].flag ;
tree[v<<1].value = (tree[v<<1].r - tree[v<<1].l + 1)*tree[v].flag ;
tree[v<<1|1].value = (tree[v<<1|1].r - tree[v<<1|1].l + 1)*tree[v].flag ;
tree[v].flag = 0;
}
}
void update(int x , int y ,int z ,int v)
{
if(x <= tree[v].l && y >= tree[v].r)
{
tree[v].flag = z ;
tree[v].value = (tree[v].r - tree[v].l +1)*z ;
return ;
}
pushdown(v) ;
int mid = (tree[v].l + tree[v].r) >> 1;
if(x > mid) update(x , y , z ,v<<1|1) ;
else if(y <= mid)update(x , y , z , v<<1) ;
else
{
update(x , mid , z , v<<1) ;
update(mid+1 , y , z , v<<1|1) ;
}
tree[v].value = tree[v<<1].value + tree[v<<1|1].value ;
}
int main()
{
//freopen("in.txt","r" ,stdin) ;
int T ;
int cas = 0;
scanf("%d" , &T) ;
while(T--)
{
int N , Q ;
scanf("%d%d" ,&N ,&Q) ;
build(1 , N , 1) ;
while(Q--)
{
int x , y , z ;
scanf("%d%d%d" , &x ,&y ,&z) ;
update(x , y , z ,1) ;
}
printf("Case %d: The total value of the hook is %d.\n" , ++cas , tree[1].value) ;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
const int maxn = 100010 ;
struct node
{
int value ;
int r , l;
int flag ;//记录到当前区间的状态
}tree[maxn<<2] ;
void build(int l , int r ,int v)
{
tree[v].l = l;
tree[v].r = r;
tree[v].flag = 0;
if(l == r)
{
tree[v].value = 1;
return ;
}
int mid = (l+r)>>1 ;
build(l , mid , v<<1) ;
build(mid+1 , r , v<<1|1) ;
tree[v].value = tree[v<<1].value + tree[v<<1|1].value ;
}
void pushdown(int v)//向下传递
{
if(tree[v].flag)
{
tree[v<<1].flag = tree[v<<1|1].flag = tree[v].flag ;
tree[v<<1].value = (tree[v<<1].r - tree[v<<1].l + 1)*tree[v].flag ;
tree[v<<1|1].value = (tree[v<<1|1].r - tree[v<<1|1].l + 1)*tree[v].flag ;
tree[v].flag = 0;
}
}
void update(int x , int y ,int z ,int v)
{
if(x <= tree[v].l && y >= tree[v].r)
{
tree[v].flag = z ;
tree[v].value = (tree[v].r - tree[v].l +1)*z ;
return ;
}
pushdown(v) ;
int mid = (tree[v].l + tree[v].r) >> 1;
if(x > mid) update(x , y , z ,v<<1|1) ;
else if(y <= mid)update(x , y , z , v<<1) ;
else
{
update(x , mid , z , v<<1) ;
update(mid+1 , y , z , v<<1|1) ;
}
tree[v].value = tree[v<<1].value + tree[v<<1|1].value ;
}
int main()
{
//freopen("in.txt","r" ,stdin) ;
int T ;
int cas = 0;
scanf("%d" , &T) ;
while(T--)
{
int N , Q ;
scanf("%d%d" ,&N ,&Q) ;
build(1 , N , 1) ;
while(Q--)
{
int x , y , z ;
scanf("%d%d%d" , &x ,&y ,&z) ;
update(x , y , z ,1) ;
}
printf("Case %d: The total value of the hook is %d.\n" , ++cas , tree[1].value) ;
}
return 0;
}
0 0
- hdu1698Just a Hook 线段树 成段更新水题
- hdu1698Just a Hook(线段树---成段更新)
- hdu1698Just a Hook (线段树 成段更新,这题目真是坑,按题目意思开的数组还小)
- hdu1698just a hook 线段树
- hdu1698Just a Hook(线段树区间更新)
- HDU 1698 Just a Hook [线段树-成段更新]
- hdu 1698 Just a Hook(线段树 成段更新)
- 线段树 [成段更新] HDU 1698 Just a Hook
- hdu 1698 Just a Hook 线段树 成段更新
- hdu1698 Just a Hook 线段树,成段更新
- 线段树---成段更新hdu1698 Just a Hook
- HDU1698_Just a Hook(线段树/成段更新)
- HDU 1698 Just a Hook (线段树 成段更新)
- Just a Hook 线段树--成段更新
- HDU 1698 Just a Hook 线段树,成段更新
- hdu1698Just a Hook(线段树+懒惰标记)
- hdu1698Just a Hook
- hdu1698Just a Hook segment_tree
- 缓冲区溢出及gdp调试全过程
- windows核心编程学习笔记-上下文练习
- 使用EditPlus开发Java程序的配置
- C#的前世与今生
- php中try catch捕获异常实例详解
- hdu1698Just a Hook 线段树 成段更新水题
- 关于对快速幂超时问题的优化
- POJ 3691 DNA repair (AC自动机+dp)
- 如何向小白介绍何谓机器学习和数据挖掘?
- 动态数组求n个数的和还有平均数 --- 蓝桥杯
- 关于ROS下的Dynamic Reconfig的学习探索
- C#参数传递之值参数
- SqlServer Bug:扩展存储过程一直运行出现等待类型PREEMPTIVE_OS_GETPROCADDRESS
- win32练习-判断系统类型