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的值之和. 思路: 区间更新题目 ...
随机推荐
- sqlite3之基本操作(二)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...
- Linux Shell系列教程之(十五) Shell函数简介
本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...
- 数据库==>>数据查询基础
数据查询基础 还好吗?几天不见,甚是思念呀!笑对人生,好好生活,快快乐乐的迎接我们的美好未来吧! 好吧!抒情结束,我们一起来学习一下我们今天的主题:数据查询基础,很有意思哟.让我们来感受它的魅力吧! ...
- mysql创建数据库指定编码
GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE ` ...
- [小北De编程手记] : Lesson 06 - Selenium For C# 之 流程控制
无论你是用哪一种自动化测试的驱动框架,当我们构建一个复杂应用程序的自动化测试的时候.都希望构建一个测试流程稳定,维护成本较低的自动化测试.但是,现实往往没有理想丰满.而这一篇,我会为大家讲解我们在使用 ...
- AJAX编程-封装ajax工具函数
即 Asynchronous [e'sɪŋkrənəs] Javascript And XML,AJAX 不是一门的新的语言,而是对现有技术的综合利用.本质是在HTTP协议的基础上以异步的方式与服务器 ...
- HTML中行内元素的竖直方向的padding和margin是否真的无效
参考资料:Inline elements and padding 今天写一个导航栏时遇到了一个问题:行内元素的padding-top,padding-bottom和margin-top,margin- ...
- RHEL7文件归档与压缩
本文介绍RHEL7.2文件的归档和压缩 文件归档 归档的好处:方便使用.查询.阅读,易于管理 (批量删除文件) 常用操作 命令:tar 作用:将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中 ...
- jquery对javascript事件的封装一览
描述 jquery javascript 鼠标点击某个对象 click() onclick 鼠标双击某个对象 dblclick() ondblclick 元素获得焦点 focus() onfocus ...
- Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
改下build.gradle文件,将里面的compileSdkVersion改为23即可 apply plugin: 'com.android.application' android { compi ...