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 ...
随机推荐
- poj 1325 Machine Schedule
Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java class name ...
- JavaScript知识架构学习路径(一)- 变量篇
[摘要]本文是专为JavaScript入门者而总结的,总体上将JavaScript的基础部分分成了九大块,分别是变量.运算符.数组.流程控制结构.字符串函数.函数基础.DOM操作基础.文档对象模型DO ...
- lnmp memcache出问题
打开另一台用0.9装好的memcache 的PHP配置文件,找到了“extension = "memcache.so" ,将这个加入到了1.0的php.ini重启后 执行/memc ...
- Dynamic CRM 2013学习笔记(二十)字段改变事件的二种实现方法
CRM里有二种方式实现字段change事件,一种是在form里,一种完全通过js来实现.本文介绍下二者的用途及区别. 1. Form里用法 这种方式估计其实也是添加一个js的function. 这种方 ...
- Dynamic CRM 2013学习笔记(三十九)流程2 - 业务流程(Business Process Flows)用法详解
业务流程(Business Process Flows)是CRM 2013 里一个新的流程,它提供了可视化的流程表现.业务人员创建有效.流线型的业务流程让最终用户知道当前在哪.下一步要做什么,用户可以 ...
- How Delete File with Readonly Permission?
class Program { static void Main(string[] args) { string file=@"E:\readme.txt"; try { File ...
- 结对实验报告-android计算器设计
一:引言 目前手机可以说是普及率非常高的电子设备了,由于其便于携带,使用方便,资费适中等等原因,现在手机已经在一定程度开始代替固定电话的通话功能,以及一些原来电脑软件上的功能了.手机上的软件也随着 ...
- Wix 安装部署教程(四) 添加安装文件及快捷方式
通过之前三篇的介绍,大家对wix的xml部署方式也应该有一些认识,今天天气不错,再来一发.主要介绍桌面,开始菜单,卸载等功能的如何添加.希望园友们支持! 一.如何添加文件 Demo打包程序很简单,就一 ...
- [安卓] 5、SeekBar拖动条
越来越发现这些控件用法大同小异了,这里注意几个函数:seekBar.setSecondaryProgress(0);设置初始进度为0,总共为0~99,对其监听用setOnSeekBarChangeLi ...
- paip.多维理念 输入法的外码输入理论跟文字输出类型精髓
paip.多维理念 输入法的外码输入理论跟文字输出类型精髓 通常,我们的输入法使用的外码是拼音,但是,这个的用户体验很差.. 应该使用多个外码类型... ##按照词汇来源,有如下几个 固有词ati 来 ...