
线段树
geng4512
蛤蛤蛤蛤
展开
-
poj2750 PottedFlower(线段树的环状操作)
题目:Potted Flower 大意:该你一个换环,求环上的最大连续的和(如果最大和包含所有数,要求减去最小的一个)。 思路:这道题的思路并不难,需要在线段树里维护区间的最大和,最小和(应为是环状的,所以答案有可能是总和减去最小和),然后需要用一个区间左边的最大最小,右边的最大最小来维护区间的最大和最小和。这道题的解法就是这样。代码奉上#include<cstdio>#include<alg原创 2015-07-02 13:45:50 · 639 阅读 · 0 评论 -
Codeforces Zip-line 650D 345Div1D(LIS)
传送门 大意:给出一个序列,求修改一个数过后的最长上升子序列。 思路:可以用主席树在线搞,也可以用树状数组离线搞,明显后者好写得多。我们首先读取所有的询问,然后就把询问绑在给出的位置,然后我们正向做一遍LIS,反向做一遍LDS,然后就可以解决这个问题了。#include <cstdio>#include <algorithm>#include <vector>#define MAXN 40原创 2016-03-11 14:06:10 · 1068 阅读 · 0 评论 -
HDU5361 In Touch(线段树 + 最短路)
传送门 恰逢才做过VFK的A+B Problem,发现这道题也可以那样搞。区间连边的时候,我们就可以给那个区间在线段树对应的标号上连边。 线段树也可以不建出来,直接当做一个标号的合集,不占用内存,只用模拟在线段树上找区间的过程就可以了。 如果不清楚的话,可以看下A+B Problem的题解里面配有插图。 连好边之后就可以直接跑DijkstraDijkstra。 分析一下时间复杂度,线段树节原创 2016-02-24 12:56:26 · 1130 阅读 · 0 评论 -
BZOJ2683 简单题(CDQ分治)
传送门 之前听别人说CDQ分治不难学,今天才知道果真如此。之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱…… cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区间的答案,每次把区间折半。对于本题来说时间复杂度T(N)=T(N/2)+O(NlogN)T(N) = T(N/2)+O(NlogN) T(N)=O(Nlog2N)T(N) = O(Nlog^2N)原创 2016-03-06 01:13:02 · 1325 阅读 · 0 评论 -
BZOJ4293 [PA2015]Siano(线段树)
传送门 这Seg确实不好写,不过因为它与ai的相对顺序无关,所以,我们在对ai排序之后,就可做了。维护一个区间最大值,维护一个和,维护一个区间赋值的懒标记,再维护一个时间变化的标记就可以了。 因为不论怎样在排序过后的序列里面右边的一定不小于左边的,所以我们可以在线段树里面二分来找到每一次操作的开始位置,然后就可以区间修改了。#include<cstdio>#include<algorithm>原创 2016-02-20 11:11:19 · 1143 阅读 · 3 评论 -
BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)
传送门Description给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?Input第一行一个整数N,表示我们要将1到N插入序列中,接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)OutputN行,第i行表示i插入Xi位置后序列的最长上升子序列原创 2016-02-14 20:13:35 · 740 阅读 · 0 评论 -
BZOJ3218 UOJ#77 A+B Problem(最小割+主席树)
竟然在BZOJ上拿了Rank1太给力啦。传送门(BZOJ)传送门(UOJ)说说这道题目吧:首先是说说这个构图吧。因为有选择关系,我们很容易想到最小割。Ans = sigma(i为白色){w[i]} + sigma(i为黑色){b[i]} - sigma(奇怪的i){p[i]} 转化一下就变成了sigma(所有的i){w[i]+b[i]} - sigma(i为白色){b[i]原创 2016-02-24 00:34:47 · 3155 阅读 · 0 评论 -
BZOJ3038 && BZOJ3211 上帝造题的七分钟2 && 花神游历各国 (线段树 + 开方标记)
传送门 这道题看一眼就知道是线段树的题目,但是一看,题目要求区间开方,我就又傻了。想了一会,发现就算是10^{9}在开方5次之后就变成1了,所以就算是我们单个开方,时间复杂度也就是O(NlogN)。但是为了避免重复开方,我们要给线段树的每一个节点做一个标记,表示下面的区间是否全部为1和0。那样我们就可以避免重复开方了。代码:#include <cstdio>#incl原创 2015-08-23 13:47:04 · 964 阅读 · 0 评论 -
poj2182 Lost Cows (线段树)
传送门 大意:有一个1-n的排列,数据给出从第二个到第n个数中的每一个数前面有几个数比这个数小,要求还原这个1-n的排列 思路:最近做这种题好像有点感觉了,很自然的想到,我们可以从最后一个数来倒推,一直推出第一个过后就可以完事了。这样的话,我们很容易写出一个N²N² 的算法。但作为一名OIer,我们要求上进,所以我们就会想,可不可以优化一下呢。其实我们发现,在找前面出现了几个比目标值小的操作很冗原创 2015-08-16 14:03:53 · 960 阅读 · 0 评论 -
BZOJ3545: [ONTAK2010]Peaks(线段树合并)
传送门 这题允许离线的话,就直接线段树合并就可以了。 这个线段树就是一棵值域线段树。枚举一维表示边权的大小,把边权小于枚举值的边的两端所在的线段树合并了,在线段树里查询第k大值就可以了。 如果是加强版的话,可以使用主席树合并来完成。#include <cstdio>#include <algorithm>using namespace std;#define MAXN 500005in原创 2016-07-28 16:30:18 · 1679 阅读 · 2 评论