HDU 4107 Gangster Segment Tree线段树
这道题也有点新意,就是须要记录最小值段和最大值段,然后成段更新这个段,而不用没点去更新,达到提快速度的目的。
本题过的人非常少,由于大部分都超时了,我严格依照线段树的方法去写。一開始竟然也超时。
然后修补了两个地方就过了,详细改动的地方请參看程序。
知道最大值段和最小值段,然后修补一下就能过了。不是特别难的题目。
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std; const int SIZE = 200002;
const int TREESIZE = SIZE + (SIZE<<1);
int N, M, P;
int segTree[TREESIZE];
int smallest[TREESIZE];
int largest[TREESIZE]; inline int lChild(int rt) { return rt<<1; }
inline int rChild(int rt) { return rt<<1|1; } void build(int l, int r, int rt)
{
segTree[rt] = 0;
smallest[rt] = 0;
largest[rt] = 0;
if (l == r) return ; int m = l + ((r-l)>>1);
build(l, m, lChild(rt));
build(m+1, r, rChild(rt));
} inline void pushUp(int rt)
{
smallest[rt] = min(smallest[lChild(rt)], smallest[rChild(rt)]);
largest[rt] = max(largest[lChild(rt)], largest[rChild(rt)]);
} inline void pushDown(int rt)
{
if(segTree[rt])
{
int l = lChild(rt), r = rChild(rt);
largest[l] += segTree[rt];
largest[r] += segTree[rt];
smallest[l] += segTree[rt];
smallest[r] += segTree[rt];
segTree[l] += segTree[rt];
segTree[r] += segTree[rt];
segTree[rt] = 0;
}
} void update(int L, int R, int val, int l, int r, int rt)
{
if (L <= l && r <= R)
{
if(largest[rt] < P)
{
smallest[rt] += val;
largest[rt] += val;
segTree[rt] += val;
return ;
}
if(smallest[rt] >= P)
{
smallest[rt] += val<<1;
largest[rt] += val<<1;
segTree[rt] += val<<1;
return;
}
} //if (r < L || R < l) return;//在这里推断也会超时
pushDown(rt); int m = l + ((r-l)>>1);
if (L <= m) update(L, R, val, l, m, lChild(rt));
if (m < R) update(L, R, val, m+1, r, rChild(rt)); pushUp(rt);
} inline void pushDown_2(int rt)
{
if (segTree[rt])
{
segTree[lChild(rt)] += segTree[rt];
segTree[rChild(rt)] += segTree[rt];
}
} void printTree(int l, int r, int rt)
{
if (l == r)
{
if (l != N) printf("%d ", segTree[rt]);
else printf("%d\n", segTree[rt]);
return ; //记得返回。
}
pushDown_2(rt); int m = l + ((r-l)>>1);
printTree(l, m, lChild(rt));
printTree(m+1, r, rChild(rt));
} int main()
{
int a, b, c;
while (scanf("%d %d %d", &N, &M, &P) != EOF)
{
build(1, N, 1);
//memset(largest, 0, sizeof(largest)); 这样写反而超时
//memset(smallest, 0, sizeof(smallest));
//memset(segTree, 0, sizeof(segTree));
while (M--)
{
scanf("%d %d %d", &a, &b, &c);
update(a, b, c, 1, N, 1);
}
printTree(1, N, 1);
}
return 0;
}
HDU 4107 Gangster Segment Tree线段树的更多相关文章
- SPOJ 11840. Sum of Squares with Segment Tree (线段树,区间更新)
http://www.spoj.com/problems/SEGSQRSS/ SPOJ Problem Set (classical) 11840. Sum of Squares with Segme ...
- Implementation:Segment Tree 线段树
早就听人提起过线段树,今天有题搞不出来,讨论上说要用一下线段树,看了下,本质上是空间划分索引,只不过是一维上面的,如果在二维则是四叉树,三维则是八叉树,如果可以动态调整那么跟R-Tree就很相似了,他 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
- hdu 1754 I Hate It 线段树 点改动
// hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...
随机推荐
- 控制反转(Inversion of Control)之我的理解
关于控制反转(Inversion of Control),在具体实现上也有许多其它的叫法,如依赖倒置(Dependency Inversion Principles, DIP).依赖注入(Depend ...
- Windows7上搭建Cocos2d-x 3.1.1开发环境
前言 现在,越来越多的公司采用Cocos2d-x 3.0来开发游戏了,但是现在这样的文章并不多,所以打算写一系列来帮助初学者快速掌握Cocos2d-x 3.0.首先就从开发环境的大家说起吧. 开发工具 ...
- Mac OS X上尝试编译CoreCLR源代码
CoreCLR登陆GitHub之后,体验CoreCLR首当其冲的方式就是在自己的电脑上编译它,昨天分别在Windows与Linux上成功编译了CoreCLR,详见: 1)Windows上成功编译Cor ...
- Getting the first day in a week with T-SQL
A colleague just asked me if I knew a way to get the first day in a week in SQL Server. While I'm su ...
- 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug
开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...
- [stm32] GPIO及最小框架
1.GPIO硬件结构图: 2.GPIO程序结构: 3.框架介绍: 这里的ASM是固定启动文件夹,startup_stm32f10x_hd.s表示当前stm32类型为高容量设备,当然还有md.s等. C ...
- Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)
Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...
- CentOS 7 service systemnctl
在之前的版本中关闭防火墙等服务的命令是 service iptables stop /etc/init.d/iptables stop 在RHEL7中,其实没有这个服务 [root@rhel7 ~]# ...
- 适合于小团队产品迭代的APP测试流程
一.测试周期 测试周期一般为2~3天,根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向主管或产品经理确认项目排期. 二.测试资源 测试任务开始前,检查各项测试资源. 产品功能需求文档. ...
- Leetcode 206 Reverse Linked List 链表
将单向链表反转 完成如图操作,依次进行即可 1 2 3 /** * Definition for singly-linked list. * struct ListNode { * int val; ...