算是线段树中的一道水题了,必须用到懒操作,否则会超时。或者也可以刚开始不计算和,只更新节点,最后算整个线段的颜色和。

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的更多相关文章

  1. HDU 1698 Just a Hook (线段树区间更新)

    题目链接 题意 : 一个有n段长的金属棍,开始都涂上铜,分段涂成别的,金的值是3,银的值是2,铜的值是1,然后问你最后这n段总共的值是多少. 思路 : 线段树的区间更新.可以理解为线段树成段更新的模板 ...

  2. HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)

    2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...

  3. HDU 1698——Just a Hook——————【线段树区间替换、区间求和】

    Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit  ...

  4. HDU 1698 Just a Hook(线段树区间替换)

    题目地址:pid=1698">HDU 1698 区间替换裸题.相同利用lazy延迟标记数组,这里仅仅是当lazy下放的时候把以下的lazy也所有改成lazy就好了. 代码例如以下: # ...

  5. Just a Hook (HDU 1698) 懒惰标记

    Just a Hook (HDU 1698) 题链 每一次都将一个区间整体进行修改,需要用到懒惰标记,懒惰标记的核心在于在查询前才更新,比如将当前点rt标记为col[rt],那么此点的左孩子和右孩子标 ...

  6. HDU 1698 【线段树,区间修改 + 维护区间和】

    题目链接 HDU 1698 Problem Description: In the game of DotA, Pudge’s meat hook is actually the most horri ...

  7. HDU 1698 Just a Hook(线段树成段更新)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1698 题目: Problem Description   In the game of DotA, P ...

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

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意:给出1~n的数,每个数初始为1,每次改变[a,b]的值,最后求1~n的值之和. 思路: 区间更新题目 ...

随机推荐

  1. flask-uploads扩展的使用笔记

    涉及的flask扩展 flask-uploads flask的一个文件上传扩展, 提供了UploadSet这个概念 flask-wtf(中文) 很强大的表单的扩展 flask-bootstrap bo ...

  2. smartstore-net

    记录一下,抽空下载源码了研究下

  3. hdu 1518 拼正方形

    本题来自:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题意:输入几个长度,判断能否拼成正方形. 以下部分参考了网友代码,终于ac啦. #include ...

  4. winform(无边框窗体与timer)

    一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要放置的控件可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入(pictureBox1_MouseE ...

  5. Swift 学习笔记第一天-变量常量,及数据类型

    1.定义变量 用关键字 var 比如 var i=2 2.定义常量用let 如let c=3 可见Swift 定义时不用指定类型.由编译器推断 如果想指定类型 var i:Int32=2 练习 let ...

  6. Linux 学习手记(3):Linux基本的文件管理操作

    复制文件和目录 在Linux中使用命令cp来复制文件或者目录,使用方式: cp 源文件(文件夹) 目标文件(文件夹) cp命令常用参数: -r 递归复制整个目录 -v 显示详细信息 移动.重命名一个文 ...

  7. 设计模式:模版模式(Template Pattern)-转

    模版模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤. 我们使用冲泡咖啡和冲泡茶的例子 加工流程 ...

  8. Resharper注册机实现以及源代码

    一直用Resharper,每次找注册机也麻烦,就想怎么才能自己能做个注册机,把它原理给搞懂了,不就不用找了.今天早上起来研究了下Resharper注册机,网上找到一位大神之前做Resharper注册机 ...

  9. Java部分总结图片版2(已加上原图链接!!!)

    Java部分总结图片版2(加上原图链接)

  10. 利用 cos 组件实现jsp中上传附件

    需求:在web功能中附件上传功能为最基本的功能之一,所以用cos组件做了一个附件上传的demo.附件上传功能的实现可以利用其它的java组件实现,相关资料网上比较多. 说明步骤:下载组件并安装 --& ...