线段树(lazy)-hdu1689
题目链接:https://vjudge.net/problem/HDU-1698
题目描述:


现在Pudge想做一些操作。让我们将钩子的连续金属棒从1编号到N。对于每个操作,Pudge可以将连续金属棒(编号为X到Y)更改为铜棒、银棒或金棒。钩的总值是N根金属棒的总和。更确切地说,每种棍棒的价值计算如下:对于每个铜棒,其值为1。对于每个银棒,其值为2。对于每个金棒,其值为3。Pudge希望知道在执行操作后钩子的总值。你可以认为原来的钩子是用铜棒做的。
输入:
输入由几个测试用例组成。输入的第一行是实例的数目。不超过10例。对于每种情况,第一行包含一个整数N,1<=N<=100000,它是Pudge的钩子的棒的数量,而第二行包含一个整数Q,0<=Q<=100000,它是操作的数量。接下来的Q行,每行包含三个整数X,Y,1<=X<=Y<=N,Z,1<=Z<=3,它定义了一个操作:将编号从X到Y的棒变为金属类Z,其中Z=1表示铜类,Z=2表示银类,Z=3表示金类。
输出:
对于每种情况,在操作之后用表示钩子总值的行中打印出钩子的总价值。使用示例中的格式。
代码实现:
#include <cstdio> using namespace std;
const int MAXN = 1e6;
int N;
typedef long long ll; struct node{
int l,r;
ll sum,lazy;
void update(ll x){//将(r-l)之间的value值变为x,即对sum进行修改
sum=1ll*(r-l+)*x;///1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量。
lazy=x;
}
}tree[MAXN<<];
//相当于压栈操作
void push_up(int x){
tree[x].sum=tree[x<<].sum+tree[x<<|].sum;
} void push_down(int x){
ll lazyval=tree[x].lazy;
if(lazyval>){
tree[x<<].update(lazyval);
tree[x<<|].update(lazyval);
tree[x].lazy=;//将其变为0,便于后续操作,因为后续还可能对该区间做更改
}
}
//build(1,1,n),从第一个区间开始建立
void build(int x,int l,int r){
tree[x].lazy=tree[x].sum=;
tree[x].l=l;tree[x].r=r;
if(l==r){
tree[x].sum=;
return;
}
int mid=(l+r)/;
build(x<<,l,mid);
build(x<<|,mid+,r);
push_up(x);//相当于压栈操作
}
//update(1,l,r,val),从第一个区间开始更新
void update(int x,int l,int r,ll val){
int L=tree[x].l,R=tree[x].r;
if(l<=L && R<=r){//保证区间[L,R]处在区间(l,r)内部
tree[x].update(val);//直接进入结构体内部对sum值进行修改
return ;
}
push_down(x);
int mid=(L+R)/;
if(mid>=l)
update(x<<,l,r,val);
if(mid<r)
update(x<<|,l,r,val);
push_up(x);
}
//query(1,1,N),从第一个区间开始查询
ll query(int x,int l,int r){
int L=tree[x].l,R=tree[x].r;
if(l<=L && R<=r)
return tree[x].sum;
push_down(x);
int mid=(L+R)/;
ll ans=;
if(mid>=l)
ans+=query(x<<,l,r);
if(mid<r)
ans+=query(x<<|,l,r);
return ans;
} int main(){
int T;
scanf("%d",&T);
int cae=;
while(T--){
scanf("%d",&N);
build(,,N);
int M;scanf("%d",&M);
while(M--){
int l,r;
ll val;
scanf("%d%d%lld",&l,&r,&val);
update(,l,r,val);
}
printf("Case %d: The total value of the hook is %lld.\n",++cae,query(,,N));
}
return ;
}
线段树(lazy)-hdu1689的更多相关文章
- JuQueen(线段树 lazy)
JuQueen Time Limit: 5 Sec Memory Limit: 512 MB Description Input Output Sample Input 10 10 5 state ...
- 分块+lazy 或者 线段树+lazy Codeforces Round #254 (Div. 2) E
E. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- POJ 2777——线段树Lazy的重要性
POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...
- poj3468 线段树+lazy标记
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92921 ...
- poj 2777(线段树+lazy思想) 小小粉刷匠
http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...
- hdu 1698 Just a Hook 【线段树+lazy】
题目 写了一天的线段树,这道题主要说明一下sum是赋值的,不是累加的,并且在push_down的时候lazy也是赋值的.因可能对懒标记的理解还不是很透彻吧. #include <iostream ...
- HDU3577Fast Arrangement(线段树+lazy)
Problem Description Chinese always have the railway tickets problem because of its' huge amount of p ...
- HDU 3954 Level up(多颗线段树+lazy操作)
又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...
- POJ3237 Tree(树剖+线段树+lazy标记)
You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...
- poj 3237 树链剖分模板(用到线段树lazy操作)
/* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...
随机推荐
- Confluence 6 使用 Apache 和 mod_proxy 的基本配置
在这些示例中,我们使用下面的信息: http://www.example.com/confluence - 你计划使用的 URL http://example:8090/ - Confluence 当 ...
- Confluence 6 Confluence 安装目录
Confluence 安装的目录(Confluence Installation directory)定义的是 Confluence 是在那里进行安装的.这个目录有时候也被称为 Confluence ...
- 10,关于在vs2017中的netcore项目使用BundlerMinifier 配置问题
查阅资料 https://github.com/madskristensen/BundlerMinifier/issues/230 今天下载了vs2017 rc 创建了个netcore的web项目,突 ...
- doy09 文件处理,拷贝文件
一\在python中打开文件,得到文件语句并赋值给一个变量 f=open('a.txt','r',encoding='utf-8')) 默认打开模式就为r: 2.通过句柄对文件进行操作 data=f ...
- 如何修改PDF文件内容,PDF怎么添加背景
很多的情况下,大家都会遇到PDF文件,不管是在学习中还是在工作中,对于PDF文件,文件的修改编辑是需要用到PDF编辑软件的,在编辑文件的时候,发现文件的页面是有背景颜色的,又该如何修改背景颜色呢,不会 ...
- vue和stylus在subline中显示高亮
首先: 安装这两个插件 Vue Syntax Highlight 和 stylus 1.按住 ctrl + shift + p 2.输入:install Package 3.输入: V ...
- linux更好看的top界面htop
top命令界面 性能测试时会经常用到top命令百用百顺就是样式不太美,下面介绍htop一个看起来更漂亮的top界面 安装htop yum install htop 安装完成键入htop命令,这样看起来 ...
- appium+python测试app使用相对坐标定位元素
我们获取到的是绝对坐标,如果换一个屏幕分辨率不同的手机那这个坐标自然会发生变化,要实现不同手机均能实现点击同一控件自然要用到相对坐标了,具体方法如下: 1.获取当前空间的绝对坐标(x1,y1),开启指 ...
- 论文阅读笔记二十八:You Only Look Once: Unified,Real-Time Object Detection(YOLO v1 CVPR2015)
论文源址:https://arxiv.org/abs/1506.02640 tensorflow代码:https://github.com/nilboy/tensorflow-yolo 摘要 该文提出 ...
- Html 文字排版
文字竖立排版,方法一 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="v ...