数据结构-线段树
文章平均质量分 82
围巾的ACM
啊啊什么时候也能成为一个大牛啊
展开
-
POJ 2528 Mayor's posters(离散化+区间set线段树)
题意:市长选举,在一块可以视为宽为1的矩形中贴自己的海报,后贴的海报会覆盖之前的海报,问贴完之后能看到多少块海报。思路:留意到这个矩形的最大长度可以去到100000000,而n最多为10000,所以可以离散化一下,然后区间set开搞就可以了Trick:这里的数组要开大一点,不然会迷之RE#include#include#include#includeusing name原创 2016-03-07 22:12:48 · 308 阅读 · 0 评论 -
POJ2777 Count Color(线段树)
题意:有一个长版,有两种操作,一种是在区间[a,b]上颜色,另外一种是询问区间有多少种颜色思路:线段树维护一个color信息,其中color>0表示节点所指的区间都有某种颜色color, color=-1 表示该节点的子节点的颜色不一致.#include<cstdio>#include<iostream>#include<cstdio>#include<iostream>#include<c原创 2016-04-13 21:55:26 · 292 阅读 · 0 评论 -
HDU 5239 Doom
思路:打个表之后发现最多操作29次,之后区间的值就不会再改变,然后就是一个线段树了#includeusing namespace std;#define LL long long#define ULL unsigned long long#define maxn 100005 + 10#define mod 9223372034707292160ULL#define lso原创 2016-04-26 22:42:49 · 597 阅读 · 2 评论 -
HDU 5023 A Corrupt Mayor's Performance Art
思路:简单的线段树染色#includeusing namespace std;#define lson l,m,i<<1#define rson m+1,r,i<<1|1const int maxn = 1e6+6;sets;struct Node{ int color; int left; int right; int m;}tree[maxn<<2];vo原创 2016-05-02 00:10:46 · 354 阅读 · 0 评论 -
Codeforces Round #291 (Div. 2) D R2D2 and Droid Army(线段树+二分)
题意:给你一个N*M的矩阵,每次你可以使整一列的值减少一,当某一行的所有列为0时那个机器视为被消灭,你可以射击K次,问能消灭的最多的连续机器人数目思路:二分答案,枚举区间的起点,然后用线段树查询区间最大值即可#include#include#include#include#include#include#include#include#include#includ原创 2016-05-27 19:38:24 · 303 阅读 · 0 评论 -
hdu5755 Bubble Sort(树状数组or线段树)
思路:考虑一个位置上的数字c在冒泡排序过程的变化情况。c会被其后面比c小的数字各交换一次,之后c就会只向前移动。数组从右向左扫,树状数组维护一下得到每个值右边有多少个比其小的值,加上原位置得到最右位置,最左位置为初始位置和最终位置的最小值。#include #include #include #include #include #include #include #inc原创 2016-07-28 20:24:00 · 441 阅读 · 0 评论 -
hdu5475 An easy problem(线段树)
思路:一个线段树裸题#include using namespace std;typedef unsigned long long ULL;typedef long long LL;const int INF = 0x3f3f3f3f;const double eps = 1e-9;const int maxn = 100000 + 100;int MOD;struct原创 2016-09-10 08:56:55 · 293 阅读 · 0 评论 -
HDU 5692 Snacks(线段树)
思路:题目要求必须从0号结点经过x号结点,那么其实就是求x号结点的子树到0号结点的最大距离,那么可以先DFS一遍把DFS序弄出来,顺便预处理每一个结点到0号结点的距离,然后建线段树,维护结点到0号结点的距离就可以了#pragma comment(linker, "/STACK:1024000000,1024000000") `#includeusing namespace std;原创 2016-09-11 23:28:49 · 906 阅读 · 0 评论 -
CSU 1809 Parenthesis(线段树前缀和)
思路:这种括号的题目有一种经典的套路就是遇到(加一,遇到)减一,这样整个序列最后的前缀和一定是非负的,同样的这里贪心一下就会发现只有把( 和 )交换的时候才会出问题,那么可以用一个线段树或者RMQ维护区间最小值,然后如果交换之后(a,b-1)这个区间有前缀和#includeusing namespace std;const int maxn = 1e5+7;#define lso原创 2016-09-04 09:52:49 · 738 阅读 · 0 评论 -
hdu4027 Can you answer these queries?(线段树)
题意:给定区间,将区间的每个值都变为原来的平方根,查询区间和思路:线段树维护即可,用allone表示该数或者该区间是否需要更新注意:输入时候的L可能会大于R.....#include #include #include #include #include #include #include #include #include #include #includ原创 2016-03-25 20:05:07 · 261 阅读 · 0 评论 -
POJ 3264 Balanced Lineup
思路:线段树求最大值减最小值,每个结点分别维护最大值和最小值即可。#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define ma原创 2016-03-25 19:28:45 · 270 阅读 · 0 评论 -
POJ 3468 A Simple Problemwith Integers(线段树:区间add,区间查询)
思路:线段树的区间add和区间查询模板#include#include#includeusing namespace std;#define LL long long#define lson i*2,l,m#define rson i*2+1,m+1,rconst int maxn = 100000+100;LL sum[maxn*4];LL addv[maxn*4原创 2016-02-25 20:54:49 · 379 阅读 · 0 评论 -
UVA 11992 Fast MatrixOperations(线段树)
题意:给你一个一开始全为0的矩阵,有三种操作,子矩阵全部增加一个数,子矩阵替换一个数,查询子矩阵之和和最大最小值思路:显然的线段树,留意到这个矩阵最多只有20行,所以每一行都建一颗线段树即可#include#include#include#include#includeusing namespace std;const int maxn = 1000010;const原创 2016-03-20 09:25:42 · 280 阅读 · 0 评论 -
CodeForces 629D Babaei and Birthday Cake(线段树维护DP)
题意:有n个蛋糕,然后第i个蛋糕只能放在地上或者放在体积和编号都比他小的上面,然后问你体积最多能堆多大?思路:用线段树维护DP,显然这个东西和lis(最长上升子序列)有一点像我们首先把每个东西的体积都离散化一下,然后我们选取比他小的最大值,然后进行更新就好了#includeusing namespace std;const int maxn = 1e5+6;typed原创 2016-04-01 09:55:26 · 1013 阅读 · 0 评论 -
HDU 1166 敌兵布阵(线段树入门题)
题意:中文题思路:单点更新,区间求和的线段树入门题#include#include#includeusing namespace std;const int maxn = 50000+5; //线段树需要维护的信息int sum[maxn*4];#define lson i*2,l,m#define rson i*2+1,m+1,r//i结点收集子结点的统计结原创 2016-02-23 22:49:58 · 364 阅读 · 0 评论 -
HDU 1754 I Hate It(线段树:单点替换,区间最值)
题意:中文题思路:线段树基本应用,单点替换区间最值#include#include#includeusing namespace std;const int maxn = 200000+5;const int INF = 1e9;//线段树需要维护的信息int sum[maxn*4];#define lson i*2,l,m#define rson i*2+1,m原创 2016-02-23 23:26:03 · 368 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number(线段树:单点更新,区间求和)
思路:之前用的树状数组做,现在尝试用线段树来做,维护一棵线段树,树中的每个叶子节点表示的是这个节点是否出现过,比如叶子节点i控制的范围是[2,2],那么sum[i]=1表示2这个数已经出现了,如果sum[i]=0表2这个数还没出现.如果j节点控制范围[4,8],那么sum[j]=3表示[4,8]区间有3个数出现了. 如果当前处理的是a[i],那么用query(a[i]+1原创 2016-02-23 23:41:05 · 335 阅读 · 0 评论 -
POJ 2828 Buy Tickets(线段树)
题意:火车站有n个人排队,他们是按顺序到达的,但是他们乱插队。每个人有两个值pos[i]和val[i]。比如现在第5个人来了,他的pos[5]值为3,那么他就会插队到当前第3个人位置的后面(第0个人是售票窗口)。依次给出所有人的pos和val值,要你最终按所有人的位置顺序输出val值。思路:维护一颗线段树,该树的叶子结点初始值为1,表示这个位置可以占用,当确定一个人的位置的时候就把那个值变成0原创 2016-02-24 21:08:06 · 449 阅读 · 0 评论 -
HDU 2795 Billboard(线段树)
题意:中文题思路:建立一颗线段树,线段树维护的每个元素代表广告牌的一行的当前剩余最大空间。 最多只有n(nw),直接输出-1即可。所以我们线段树最多只需要维护20W个元素。就算h有10亿,后面那些行根本是浪费。在输入的时候取最小就好了。 现在我们依次读入wi,找到能放下wi的序号最小的线段树叶节点,然后更新线段树即可。这个查询过程我们可以原创 2016-02-24 15:47:42 · 374 阅读 · 0 评论 -
HDU 1698 Just a Hook(线段树:区间set,区间查询)
思路:线段树区间set,区间查询模板//HDU 1698 线段树 区间set 区间查询#include#include#includeusing namespace std;#define lson i*2,l,m#define rson i*2+1,m+1,rconst int MAXN=100000+100;int sum[MAXN*4];int setv[MA原创 2016-02-25 20:56:36 · 493 阅读 · 0 评论 -
hdu5828 Rikka with Sequence(线段树)
思路:HDU4027的升级版,多了一个区间add的操作,考虑一下显然开根号的递减速度是很快的,2^64最多不超过8次就能减到1,而且会出现很多区间的数字都是一样的情况,那么可以在线段树多维护一个flag值,表示区间里面是否所有数都是相等的,如果是的话那么开根号就只开到这里就行了,具体实现细节还是蛮多的....#includeusing namespace std;const int原创 2016-08-11 21:28:10 · 781 阅读 · 3 评论