题目链接: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的更多相关文章

  1. JuQueen(线段树 lazy)

    JuQueen Time Limit: 5 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 10 5 state ...

  2. 分块+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 ...

  3. POJ 2777——线段树Lazy的重要性

    POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...

  4. poj3468 线段树+lazy标记

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 92921   ...

  5. poj 2777(线段树+lazy思想) 小小粉刷匠

    http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...

  6. hdu 1698 Just a Hook 【线段树+lazy】

    题目 写了一天的线段树,这道题主要说明一下sum是赋值的,不是累加的,并且在push_down的时候lazy也是赋值的.因可能对懒标记的理解还不是很透彻吧. #include <iostream ...

  7. HDU3577Fast Arrangement(线段树+lazy)

    Problem Description Chinese always have the railway tickets problem because of its' huge amount of p ...

  8. HDU 3954 Level up(多颗线段树+lazy操作)

    又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...

  9. 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 ...

  10. poj 3237 树链剖分模板(用到线段树lazy操作)

    /* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...

随机推荐

  1. swift 实践- 03 -- UILabel

    class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 标签 let ...

  2. WinSCP安装与使用

      WinSCP 是一个 Windows 环境下使用的 SSH(Source Shell)的开源图形化 SFTP(SSH File Transfer Protocol) 客户端.同时支持 SCP(So ...

  3. Java 开源博客 Solo 2.5.0 发布

    Java 开源博客 Solo 2.5.0 发布 Solo 是一款一个命令就能搭建好的 Java 开源博客系统,如果你想开个独立博客,请一定不要错过! 2.5.0 版本主要支持了 Markdown/JS ...

  4. 使用 Jira 和 Confluence 6 在一起

    这个过程是有趣的过程.请参考 Use Jira applications and Confluence together 文档来找到有关整合的相关内容,能够在后续的开发中更多的节省时间,以及你需要安装 ...

  5. Linux 用户(user)和用户组(group)管理概述

    一.理解Linux的单用户多任务,多用户多任务概念: Linux 是一个多用户.多任务的操作系统:我们应该了解单用户多任务和多用户多任务的概念: 1.Linux 的单用户多任务:单用户多任务:比如我们 ...

  6. Es6模块语法笔记

    /** * Created by Administrator on 2017/4/15. */ /*---------------------export命令--------------------- ...

  7. <a>之间怎么放值</a> 挺简单的,第一次遇到···

    需求描述:对列表中的某一列内容添加a标签(其实就是对td标签下添加a标签了). 思路简介:拿到这个我首先的反应就是在td标签对text获取内容的代码中动态拼接<a></a>字符 ...

  8. 10进制 VS 2进制

    10进制 VS 2进制 时间限制: 1 Sec  内存限制: 32 MB 题目描述 样例输出 623 #include<stdio.h> #include<string.h> ...

  9. Vue-CLI 3.x 设置反向代理

    最近在项目中使用了Vue CLI 3.0版本,项目中需要设置反向代理解决跨域问题,下面记录一下设置过程. 新建配置文件 (vue-cli3.x 官网的配置文档 https://cli.vuejs.or ...

  10. C程序的内存分配及动态内存

    1.程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分:1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局部变量. 函数参数. 返回数据. 返回地址等. ...