HDU 1698 & UESTC 1228 Just a hook
算是线段树中的一道水题了,必须用到懒操作,否则会超时。或者也可以刚开始不计算和,只更新节点,最后算整个线段的颜色和。
1.懒操作法
/* 908ms 3448KB in HDU OJ*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 100011 struct node
{
int sum;
int mark;
}tree[*N]; int n,q; void build(int l,int r,int rt)
{
if(l == r)
{
tree[rt].sum = ;
tree[rt].mark = ;
return;
}
int mid = (l+r)/;
build(l,mid,*rt);
build(mid+,r,*rt+);
tree[rt].sum = tree[*rt].sum + tree[*rt+].sum;
} void update(int len,int rt)
{
if(!tree[rt].mark)
return;
tree[*rt].mark = tree[*rt+].mark = tree[rt].mark;
tree[*rt].sum = tree[*rt].mark*(len - len/);
tree[*rt+].sum = tree[*rt+].mark*(len/);
tree[rt].mark = ;
} void change(int l,int r,int aa,int bb,int flag,int rt)
{
if(aa<=l&&bb>=r) //不用更新到底部,只要更新到区间
{
tree[rt].sum = flag*(r-l+);
tree[rt].mark = flag;
return;
}
update(r-l+,rt);
int mid = (l+r)/;
if(aa<=mid)
change(l,mid,aa,bb,flag,*rt);
if(bb>mid)
change(mid+,r,aa,bb,flag,*rt+);
tree[rt].sum = tree[*rt].sum + tree[*rt+].sum;
} int main()
{
int t,i;
int cs = ;
int aa,bb,val;
scanf("%d",&t);
while(t--)
{
memset(tree,,sizeof(tree));
scanf("%d%d",&n,&q);
build(,n,);
for(i=;i<q;i++)
{
scanf("%d%d%d",&aa,&bb,&val);
change(,n,aa,bb,val,);
}
printf("Case %d: The total value of the hook is %d.\n",cs++,tree[].sum);
}
return ;
}
2.最后求和法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
#define N 100011 struct node
{
int le,ri;
int sum;
}tree[*N]; int n,q; void build(int l,int r,int rt)
{ tree[rt].sum = ;
tree[rt].le = l;
tree[rt].ri = r;
if(l == r)
{
return;
}
int mid = (l+r)/;
build(l,mid,*rt);
build(mid+,r,*rt+);
} void change(int l,int r,int aa,int bb,int flag,int rt)
{
if(aa<=l&&bb>=r) //不用更新到底部,只要更新到区间
{
tree[rt].sum = flag;
return;
}
if(tree[rt].sum != )
{
tree[*rt].sum = tree[*rt+].sum = tree[rt].sum;
tree[rt].sum = ;
}
int mid = (l+r)/;
if(aa<=mid)
change(l,mid,aa,bb,flag,*rt);
if(bb>mid)
change(mid+,r,aa,bb,flag,*rt+);
} int query(int rt)
{
if(tree[rt].sum != )
return (tree[rt].ri - tree[rt].le + )*tree[rt].sum;
return query(*rt)+query(*rt+);
} int main()
{
int t,i;
int cs = ;
int aa,bb,val;
scanf("%d",&t);
while(t--)
{
memset(tree,,sizeof(tree));
scanf("%d%d",&n,&q);
build(,n,);
for(i=;i<q;i++)
{
scanf("%d%d%d",&aa,&bb,&val);
change(,n,aa,bb,val,);
}
printf("Case %d: The total value of the hook is %d.\n",cs++,query());
}
return ;
}
HDU 1698 & UESTC 1228 Just a hook的更多相关文章
- HDU 1698 Just a Hook (线段树区间更新)
题目链接 题意 : 一个有n段长的金属棍,开始都涂上铜,分段涂成别的,金的值是3,银的值是2,铜的值是1,然后问你最后这n段总共的值是多少. 思路 : 线段树的区间更新.可以理解为线段树成段更新的模板 ...
- HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)
2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...
- HDU 1698——Just a Hook——————【线段树区间替换、区间求和】
Just a Hook Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- HDU 1698 Just a Hook(线段树区间替换)
题目地址:pid=1698">HDU 1698 区间替换裸题.相同利用lazy延迟标记数组,这里仅仅是当lazy下放的时候把以下的lazy也所有改成lazy就好了. 代码例如以下: # ...
- Just a Hook (HDU 1698) 懒惰标记
Just a Hook (HDU 1698) 题链 每一次都将一个区间整体进行修改,需要用到懒惰标记,懒惰标记的核心在于在查询前才更新,比如将当前点rt标记为col[rt],那么此点的左孩子和右孩子标 ...
- HDU 1698 【线段树,区间修改 + 维护区间和】
题目链接 HDU 1698 Problem Description: In the game of DotA, Pudge’s meat hook is actually the most horri ...
- HDU 1698 Just a Hook(线段树成段更新)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1698 题目: Problem Description In the game of DotA, P ...
- HDU 1698 just a hook 线段树,区间定值,求和
Just a Hook Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1 ...
- HDU 1698 Just a Hook(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意:给出1~n的数,每个数初始为1,每次改变[a,b]的值,最后求1~n的值之和. 思路: 区间更新题目 ...
随机推荐
- 搭建angularjs API文档站点
提供一个国内可以访问的 angularjs API文档站点 http://i.frllk.com/ 文档直接在 github 上下载的: https://github.com/angular-cn/n ...
- Oracle不足与MySQL优势
Oracle库主要不足:1.单点故障:2.付费License;3.不支持水平扩展. MySQL及水平拆库的优势:1.单点故障影响率1/N:2.免费:3.可低成本水平扩展,近乎无限的水平扩展能力.
- .net经验积累
希望对.net编程者有所帮助 1.学会配置环境变量 1.我的电脑-属性-环境变量-双击下面的path-粘贴路径 2.ctrl+r 输入软件名字按回车 2.常用vs2010快捷键 代码格式化:ct ...
- Dalvik VM和JVM 的比较
dx:dx工具用于将.class字节码(bytecode)转换为Android字节码(保存在.dex文件中)这个字节码文件 是给 Android 的 Java 虚拟机(Dalvik虚拟机)运行用的. ...
- HTML · 图片热点,网页划区,拼接,表单
图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 网页的拼接: 在一个网络页面内,规划出多 ...
- C# 生成中间含有LOGO的二维码
效果如下: 1.无LOGO的二维码: 2.含有LOGO的二维码: 一.下载QrCode程序集: 使用的程序集有: 下载地址: http://zxingnet.codeplex.com/ 二.QRCod ...
- 【读书笔记】iOS-开发技巧-三种收起键盘的方法
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- Grand Central Dispatch (GCD)
Grand Central Dispatch (GCD) Reference Grand Central Dispatch (GCD) comprises language features, run ...
- Erlang 虚拟机 BEAM 指令集之内存管理相关的指令
翻看 BEAM 虚拟机指令集的时候(在编译器源码目录下:lib/compiler/src/genop.tab),会发现有一些和内存分配/解除分配相关的指令,如下所示: allocate StackNe ...
- MySQL之ALTER
1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL COMMENT '注释说明' 3:修 ...