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 ...
随机推荐
- 命令行导入SQL文件
摘要:把数据库导出为XX.sql格式的数据库文件,导入到另外一个数据库中的时候,总是无法全部导入.及时用mysql的命令界面导入依然是无法全部导入.老师告诉我:在命令行中运行的效率和成功率是最快和最高 ...
- 【书海】《Head First Java》 ——读后总结
<Head First Java> 中文版 (第二版) IT`huhui前言录 <Head First Java>这本书我不算特别细的看了一遍.认为十分适合初学者,甚至是没接触 ...
- APUE1
[APUE]进程控制(上) 一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是in ...
- 个性二维码开源专题<替换定位点>
基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // F ...
- jenkins插件 build timeout和build timestamp
build timeout plugin, 允许对job设置timeout时间,当超时时,job将abort. build timestamp pluin,使得job log的每次输出前面都增加当时的 ...
- Cmd命令
write----------写字板 mspaint--------画图板 mobsync--------同步命令 eudcedit-------造字程序 dvdplay--------DVD播放器 ...
- junit批量测试
引入一种“测试套件”的概念: package test; import org.junit.Test; public class Test1 { private int value = 1; publ ...
- proj01总结:spring jdbc操作
commons-collections.jar: Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大.必须使用的jar包. commons-l ...
- ios 项目里常用的宏
NSLog(@"__func__ : %s", __func__);//oc测试环境,打印文件名,方法名 NSLog(@"__FUNCTION__ : %s" ...
- 【Android】Android内存机制,了解Android堆和栈
1.dalvik的Heap和Stack 这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native. 下面针对上面列出的数据类型进行说明,只有了解了我们申请的数 ...