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

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. mongodb学习4---索引

    1,mongodb的性能分析 db.active.find({id:'sdfasdf6jh67j353g346hkfgh6'}).explain('executionStats') "mil ...

  2. Mysql的简单使用(三)

    接上文Mysql的简单使用(二) mysql中结构相同的两个表进行合并:(注意需要两个表的结构是一样的) 有如下结构的两个表father和person. 合并的步骤为: 1.把person表和fath ...

  3. [小北De编程手记] : Lesson 06 - Selenium For C# 之 流程控制

    无论你是用哪一种自动化测试的驱动框架,当我们构建一个复杂应用程序的自动化测试的时候.都希望构建一个测试流程稳定,维护成本较低的自动化测试.但是,现实往往没有理想丰满.而这一篇,我会为大家讲解我们在使用 ...

  4. SilverLight MD5加密

    效果体验:http://keleyi.com/tool/md5.htm 嵌入页面的代码: <div style="width:400px;height:230px"> ...

  5. LIST-PROCESSING用法 ABAP任意时刻进行List输出_SAP

    如何在SAP的Screen中编写List报表 1.相关命令LEAVE TO LIST-PROCESSING [AND RETURN TO SCREEN <nnnn>].LEAVE LIST ...

  6. AutoCAD .NET二次开发(三)

    在ArcGIS中,锁是一个经常遇到的东西,在打开一个该当时要锁定,编辑一个文档是再次锁定.要深入理解这个,要学习一下进程与线程.在CAD.NET中,也有Lock与Unlock. 获取一个文档,在进行处 ...

  7. SQL 查询学生缺考情况

    有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每个学生缺考的科目.A 学生表(student)字段1 学生号(s_id)字段2 学生名(s_nam ...

  8. 【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码

    一,工程目录 二,AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...

  9. IOS杂笔- 7(类方法load与initialize的区别 浅析)

    在介绍两种类方法之前,NSObject Class Reference里对这两个方法说明: +(void)initialize The runtime sends initialize to each ...

  10. 如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)

    首先介绍老外的文章:<How To Create an Expandable Table View in iOS>这是老外用Swift实现 的,对应的老外github项目源码:https: ...