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的值之和. 思路: 区间更新题目 ...
随机推荐
- 【Android】开源项目UI控件分类汇总之ProgressBar
Android开发的宝库越来越多,我开发中有需要的组件,主要参考Trinea的大作Android开源项目分类汇总(包含了后面的绝大多数).CSDN上直接拿来用!最火的Android开源项目还有CSDN ...
- chenxi的html学习笔记
0.本文主体源自:http://www.cnblogs.com/coco1s/p/4034937.html,有兴趣的可以直接去那里看,也可以看看我整理加拓展的.1.浏览器内核: 1.ie:triden ...
- swift学习笔记之-析构过程
//析构过程deist import UIKit /*析构过程(Deinitialization):析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标示 ...
- Emmet插件比较实用常用的写法
看了一些关于Emmet插件写法的文档,港真,怎么可以写这么长啊.其实知道几个大概要点加上实践基本就能上手写了啊 杂话 我前面有一篇[今天发现新大陆:haml和Emmet ],其实一开始的想法是写给自己 ...
- ASP.NET中UEditor使用
ASP.NET中UEditor使用 0.ueditor简介 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点.开源基于BSD协议,所有源代 ...
- [Android]IllegalStateException: Could not find method onBind(View)
FATAL EXCEPTION: main Process: org.diql.aidldemo, PID: 2274 java.lang.IllegalStateException: Could n ...
- android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口
Binder间进程通信的JAVA层接口,主要是通过JNI方法来调用Binder库的C/C++接口 在JAVA层,将Service组件称为JAVA服务,Service组件的代理称为JAVA服务代理. 一 ...
- char与TCHAR相互转化
char与TCHAR相互转化 char strUsr[10] = "Hello"; TCHAR Name[100]; #ifdef UNICODE MultiByteToWideC ...
- APP国际化
1.app本地内容国际化 ①在项目中新建一个New File ---> iOS Resource -> String File ---> 命名为Localizable(之所以命名为L ...
- CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)
这篇文章主要介绍了CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)的方法,需要的朋友可以参考下 文章写的不错,很详细:IDO转载自网络: 准备篇: 1.配置防火墙,开启 ...