线段树
FightingForFinal
这个作者很懒,什么都没留下…
展开
-
HDU2795 贴广告
HDU2795 Billboard 题意:有一块h*w的广告牌,往上面贴n个1*wi的广告(不可覆盖),尽量贴最上面,满足最上面时尽量贴最左边,如果哪个广告贴不下不能就输出-1,贴的下就输出它在哪一行 思路:如果以行数为区间,建立线段树,广告最多有n=200000条,即使每个广告一行也就需要h=200000行就足够了;树的叶子节点表示广告牌的高度,而父节点存储子节点的最大剩余值;所以每次找到最大原创 2015-09-17 15:36:49 · 312 阅读 · 0 评论 -
HDU1166敌兵布阵
HDU1166敌兵布阵 简单的线段树,单点更新及区间求和,不需优化,更新到叶子节点#include<cstdio> struct node{ int left,right; int sum; }tree[50000*4]; int p,add; void Build(int l,int r,int cur){ tree[cur].left=l; tree[cur].原创 2015-09-17 15:34:11 · 217 阅读 · 0 评论 -
POJ3264 区间最大最小值
POJ3264 Balanced Lineup 题意:求给定区间的最大最小值的差 需要优化,不然会超时,不必找到叶子节点#include<cstdio> #include<algorithm> #define MIN 1000001 #define MAX 0 using namespace std; struct node{ int left,right; int Max,Mi原创 2015-09-17 15:37:36 · 242 阅读 · 0 评论 -
线段树的建立、更新、查找
#include<iostream> using namespace std; struct node{ int left,right; int sum; }tree[100]; int p,v; void Build(int l,int r,int cur){ tree[cur].left=l; tree[cur].right=r; if(l==r){///原创 2015-09-17 15:33:35 · 502 阅读 · 0 评论 -
HDU1754 I 单点更新,区间最值
HDU1754I Hate It 简单的线段树,单点更新及区间最值,不需优化,更新到叶子节点#include<cstdio> #include<algorithm> using namespace std; struct node{ int left,right; int Max; }tree[200000*4]; int p,v;///把p点的值改为v void Build(in原创 2015-09-17 15:35:52 · 306 阅读 · 0 评论 -
HDU1394 求逆序数
HDU1394Minimum Inversion Number 逆序数:a[i]后面比它小的数的个数即为a[i]的逆序数,题目要求的是序列的逆序数,求和即可 题意:一个由0..n-1组成的序列,每次可以把队首的元素移到队尾,求形成的n个序列中最小逆序数 思路:一个序列的逆序数可以用线段树,或者暴力法求得,然后递推得到改变位置的序列的逆序数 线段树:(31ms)#include<cstdio>原创 2015-09-17 15:36:27 · 349 阅读 · 0 评论 -
POJ2828 插队
POJ2828 Buy Tickets 题意:人们一个一个的来排队并插队,按人到来的顺序给出每个人插队的位置(插在第几个人后面),并告知每个人的id号,输出最终队伍的情况 分析:从最后来的一个人开始向来得更早的人遍历,这样pos(插在第几个人后面)的意义就变成了,前面有多少个空位。线段树上每个节点中存储的是当前时刻,该区间有多少空位。具体分析了一下第一个样例,如图 #include<cstdi原创 2015-09-17 15:37:15 · 381 阅读 · 0 评论 -
POJ3468 区间成段增减
POJ3468 A Simple Problem with Integers 思考:本题节点要存哪些信息?只存该区间的数的和,行不行? NO! NO! 分析:只存和,会导致每次加数的时候都要更新到叶子节点,速度太慢,这是必须要避免的。本题树节点结构: struct node{ int left,right;//区间起点和终点 long long sum;/原创 2015-09-17 15:38:41 · 265 阅读 · 0 评论 -
HDU1698 区间成段替换
HDU1698 Just a Hook 由于只需查询总和,所以输出tree[1].sum即可#include<cstdio> struct node{ int left,right; int sum,add; }tree[100001*4]; int c; void Build(int l,int r,int cur){ tree[cur].left=l; tree原创 2015-09-17 15:39:05 · 243 阅读 · 0 评论