题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

Let us number the consecutive metallic sticks of the hook from 1 to N. For each operation, Pudge can change the consecutive metallic sticks, numbered from X to Y, into cupreous sticks, silver sticks or golden sticks.
The total value of the hook is calculated as the sum of values of N metallic sticks. More precisely, the value for each kind of stick is calculated as follows:

For each cupreous stick, the value is 1.
For each silver stick, the value is 2.
For each golden stick, the value is 3.

Pudge wants to know the total value of the hook after performing the operations.
You may consider the original hook is made up of cupreous sticks.

题意描述:给出n个数,初始化为1,然后Q个操作,每个操作x,y,z如下:

z为1:更新从第x个数到第y个数连续区间为1.

z为2:更新从第x个数到第y个数连续区间为2.

z为3:更新从第x个数到第y个数连续区间为3.

最后求出这个n个数的和。

算法分析:线段树区间更改的做法,设立sum[]和col[](lazy标记)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #define inf 0x7fffffff
 8 using namespace std;
 9 const int maxn=100000+10;
10
11 int n,q;
12 int sum[maxn<<2],col[maxn<<2];
13
14 void PushUP(int rt) {sum[rt]=sum[rt<<1]+sum[rt<<1|1]; }
15 void PushDown(int rt,int m)
16 {
17     if (col[rt]!=-1)
18     {
19         col[rt<<1]=col[rt<<1|1]=col[rt];
20         sum[rt<<1]=(m-m/2)*col[rt];
21         sum[rt<<1|1]=(m/2)*col[rt];
22         col[rt]=-1;
23     }
24 }
25
26 void build(int l,int r,int rt)
27 {
28     col[rt]=-1;
29     if (l==r)
30     {
31         sum[rt]=1;
32         return;
33     }
34     int m=(l+r)>>1;
35     build(l,m,rt<<1);
36     build(m+1,r,rt<<1|1);
37     PushUP(rt);
38 }
39
40 void update(int l,int r,int rt,int x,int y,int z)
41 {
42     if (x<=l && r<=y)
43     {
44         col[rt]=z ;sum[rt]=(r-l+1)*z;
45         return;
46     }
47     int mid=(l+r)>>1;
48     PushDown(rt,r-l+1);
49     if (y<=mid) update(l,mid,rt<<1,x,y,z);
50     else if (x>mid) update(mid+1,r,rt<<1|1,x,y,z);
51     else {update(l,mid,rt<<1,x,mid,z);update(mid+1,r,rt<<1|1,mid+1,y,z); }
52     PushUP(rt);
53 }
54
55 void query(int l,int r,int rt)
56 {
57     if (l==r) return;
58     PushDown(rt,r-l+1);
59     int mid=(l+r)>>1;
60     query(l,mid,rt<<1);
61     query(mid+1,r,rt<<1|1);
62     PushUP(rt);
63 }
64
65 int main()
66 {
67     int t,ncase=1;scanf("%d",&t);
68     while (t--)
69     {
70         scanf("%d%d",&n,&q);
71         int x,y,z;
72         build(1,n,1);
73         //cout<<sum[1]<<endl;
74         for (int i=1 ;i<=q ;i++)
75         {
76             scanf("%d%d%d",&x,&y,&z);
77             update(1,n,1,x,y,z);
78         }
79         query(1,n,1);
80         printf("Case %d: The total value of the hook is %d.\n",ncase++,sum[1]);
81     }
82     return 0;
83 }

转载于:https://www.cnblogs.com/huangxf/p/4391145.html

hdu 1698 Just a Hook 线段树区间更新相关推荐

  1. hdu 1698 Just a Hook(线段树区间更新·经典)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1698 数据:case,n,q,q行x,y,z.在长度为n的hook上进行q次区间更新,把它们的价值改变.最 ...

  2. HDU 1698 Just a Hook (线段树区间修改+区间查询)

    题目链接: 传送门 题意:Pudge对装备钩子进行若干次的强化,强化分为三种分别对应的价值是1,2,3,在经历过若干次操作后,输出钩子对应的总价值,每次强化都是对钩子进行区间修改 解题思路:在明白了题 ...

  3. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  4. HDU 1698 Just a Hook 线段树

    区间更新中 lazy标记的pushdown操作 风格还是傻崽的...感觉很好用... /********************* Template ************************/ ...

  5. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

    题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...

  6. hdu 1556 Color the ball 线段树 区间更新

    水一下 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 ...

  7. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  8. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  9. Just a Hook(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 In the game of DotA, Pudge's meat hook is actual ...

最新文章

  1. 格式工厂mac版_格式工厂无广告版,支持PDF文件的转换
  2. 大脑只需单个神经元就可进行XOR异或运算,Science新研究揭开冰山一角,引发热议...
  3. ”语义分割”中的“语义”
  4. Java里面遍历list的方式
  5. POJ 1189 钉子和小球
  6. android 网络程序下载,Android之网络文件下载
  7. Newton Raphson算法
  8. 数据分页模块系列 (二) 完美封装PageModel实现分页模块
  9. 2020年三非上岸北邮计算机院考研经验贴(励志)
  10. excel跨多个表格求和_收藏学习!一个Excel函数搞定进销存报表,你还在花钱买软件?...
  11. SPSS描述性统计--非连续变量的描述统计
  12. 影响我一生的两本书(02)_huadingjin_新浪博客
  13. 某软件大赛编程题(转)
  14. ios浏览器微信支付回调页面_iOS微信支付结果页面返回原程序按钮
  15. 读书笔记---《小强升职记》
  16. android服务无法启动,Android应用程序无法启动服务
  17. Android中的验证码输入框
  18. Single Image Haze RemovalUsing Dark Channel Prior
  19. python常用函数库-Python常用库大全及简要说明
  20. Unity之手机键盘自定义输入栏位置适配不同手机分辨率适配

热门文章

  1. linux6.5 yum命令,CentOS6.5使用yum命令方便快捷安装Nginx
  2. canvas 两个圆相交重叠区域颜色填充_「译」Canvas中的环绕规则 -Winding rules in Canvas...
  3. arch linux系统安装教程,Arch Linux系统的安装(BIOS)教程,archlinux
  4. linux c语言 文件拷贝,怎么在linux下用c编程实现文件的复制
  5. jq监听input type=file发生改变,即选择文件,并获取文件名称
  6. php 使用支付宝SDK报错解决
  7. 计算机内存断点,计算机 | 码农们都需要知道的「中断」相关知识
  8. 祁是计算机,南京邮电大学计算机/软件学院导师介绍:祁正华
  9. mysql增删查改总结_MySQL2 数据增删改查 SQL总结
  10. dnf丢失clientbase_clientbase.dll