
线段树
文章平均质量分 70
TA201314
这个作者很懒,什么都没留下…
展开
-
借教室[NOIP2012]解题报告
思路一:O(mlogn) 裸的线段树,维护最小值和区间修改;由于是第一次写线段树,所以不太会写。代码: #includeusing namespace std;#include#include#include#includechar * ptr=new char[50000000];int tree[2500000],lazy[250000原创 2014-11-05 16:45:35 · 2277 阅读 · 1 评论 -
[spoj11414] combat on a tree 解题报告
拿来学了下线段树合并。 注意到当我们对线段树打反转标记,它节点的位置就改变了。那么我们线段树合并复杂度分析的那一套理论还适用么?答案是适用,因为我们可以认为所有节点都是打完所有标记以后的,就是不打标记合并,这样做的话它的合并其实是和打标记之前的合并是对称的,因为这棵树是一棵满二叉树。 代码:#include<cstdio>#include<iostream>using namespace s原创 2016-04-27 11:04:46 · 804 阅读 · 0 评论 -
[poj1741]tree 解题报告
经典的点分做法就不说了(然而我写点分t了。。)线段树/平衡树启发式合并的话,就是维护子树每个节点到子树跟的距离,打一个整棵子树的标记,然后按dfs/bfs序启发式合并,合并之前先查询一下答案即可。 如果用线段树启发式合并的话,时间复杂度是O(TNlog2N)O(TN\log^2N)的,与点分一样;但是如果用splay启发式合并的话,时间复杂度存是O(TNlogN)O(TN\log N),实际跑起来原创 2016-04-21 17:31:11 · 1039 阅读 · 0 评论 -
LCT学习笔记
一、什么是势能分析? 势能分析首先要有一个势能函数F(S),S是一个数据结构集合,是你要分析的所有数据结构的集合,比如说你要分析一坨splay/lct森林的时间复杂度,那么f就是splay/lct森林的势能函数,而不仅仅是一棵splay/lct,虽然它也可以是。 对于每一次操作,我们进行这样的放缩:实际运行代价+势能改变量 ≤G(n)(n=|S|)。G(n)是一个比较良性的函数。那么我们把所有操原创 2016-03-31 21:44:04 · 2574 阅读 · 0 评论 -
[spoj11482]Count on a trie 解题报告
一开始以为是AC自动机的题,发现一直不会求T的AC自动机。后来想到可以求S的sa,就发现简单多了! 我们可以dfs S,然后对于S中的一个节点处理它的询问。(二分+hash比较大小) 那么问题就在于怎么维护T的hash。本来想用可持久化块链,发现mle了。就只好学了下treap。 treap的话,如果把rank看成下标,把随机的值看成权值的话,其实就是一颗随机数列上的笛卡尔树。树高等于比前面的原创 2016-04-18 09:49:06 · 1166 阅读 · 0 评论 -
[bzoj4527]K-D-Sequence 解题报告
这题一开始傻逼了想了好久笛卡尔树之类的东西,然后一写发现错了。。然后思考了一下又想了个笛卡尔树上的,一写发现又错了。。 考虑扫右端点,设当前扫到了i,那么对于每个j < i,设xj=max{ak}(j≤k≤i),yj=min{ak}(j≤k≤i)x_j=\max \{a_k \} (j\le k\le i),y_j=\min \{ a_k \} (j \le k \le i),就是要求min{j}原创 2016-04-21 06:58:04 · 1005 阅读 · 0 评论 -
[Ahoi2014]奇怪的计算器 解题报告
感觉这是一道非常好的题,不过我看几乎所有人都是把它当傻逼题写的,为出题人感到遗憾。一个很简单的性质是无论如何操作,每个数的相对大小是不变的,所以我们每次改变的都是一个区间。所以我们维护一个标记(k,b0,b1)(k,b_0,b_1)表示对这个区间里的数x的操作为先*k,然后+b0x+b_0x,然后+b1+b_1。这样的话对于当前在节点的标记(k,b0,b1)(k,b_0,b_1),然后再加上一个新的原创 2016-06-01 22:15:00 · 1364 阅读 · 0 评论 -
[bzoj4373]算术天才⑨与等差数列 解题报告
先来说一下傻逼的做法。 考虑如何约束等差数列这个条件,如果k=0,就是[最大值=最小值];否则就是区间中[相邻两数差的绝对值的gcd=k][(最大值-最小值)/(r-l)=k][区间中没有相同元素]。 gcd可以在O(log2n)O(\log^2n)的时间复杂度很容易搞出来,所以问题就在于怎么确定区间中没有相同元素。 显然,如果记每个位置下一个和它权值相同的位置在哪,那就转化成了求区间最小值的原创 2016-04-18 08:36:36 · 1338 阅读 · 0 评论 -
[JSOI2009]面试的考验 解题报告
考虑将询问区间按右端点排序。考虑x会与它前面产生贡献的点对,显然,如果i<j<x,ai>aj>axi<j<x,a_i>a_j>a_x,那么(i,x)就是无用的。也就是说我们要求位置 < x且权值大于axa_x的点和小于axa_x的点的两个类似笛卡尔树的序列的东西,而这个在随机数据中显然是O(logn)O(\log n)的。 但是问题是怎么求这个东西呢?一个比较脑残的想法是线段树!就是我们存一棵权值原创 2016-04-05 14:41:55 · 1187 阅读 · 0 评论 -
[uoj228]基础数据结构练习题 解题报告
这题好厉害呀。。看完题一看。。相邻两个数开根号的话差会由a-b变成a√−b√\sqrt a -\sqrt b,相当于除了一个a√+b√\sqrt a+\sqrt b,这样的话很快差就要变成0了,傻逼题呀!。。时间复杂度O((n+m)lgnlglgn)O((n+m)\lg n\lg \lg n) 然后写完一交,70. 一看数据。。差为1…卧槽?! 原来当差为1的时候开完根号可能差还是为1,就是如原创 2016-09-11 16:32:53 · 1810 阅读 · 0 评论 -
[Poi2011]Tree Rotations 解题报告
拿这道题来学了一下线段树合并。 主要是照着这个课件学的,但是他那一句 整个过程的开销不会比向一棵空树顺序插入n个整数来的大我完全没有看明白。。自己想了很久,终于想明白了。 之前有一句话是很关键的: 合并的开销正比于两棵树的公共节点数所以我们考虑线段树中一个节点[l,r],它作为公共节点出现的次数是多少呢?显然是将[l,r]中所有元素合并的代价,就是r-l次!所以总的时间复杂度就是O(原创 2016-04-27 08:28:04 · 1063 阅读 · 0 评论 -
[bzoj3489] A simple rmq problem 解题报告
说几种比较傻逼的做法: 考虑一个点i,设它前面第一个和它相等的点的位置是lastilast_i(若没有就是0),设它后面第一个和它相等的点的位置是nextinext_i(如果没有就是n+1),则它会产生贡献的区间[l,r]要求lasti+1≤l≤i,i≤r≤nexti−1last_i+1\le l \le i,i\le r \le next_i-1。所以如果把询问的区间看作平面上的点,这就相当于是原创 2016-04-26 07:11:39 · 1449 阅读 · 0 评论 -
[NOI1999]内存分配 解题报告
[NOI1999] 内存分配时间限制:1 s 内存限制:128 MB内存是计算机重要的资源之一,程序运行的过程中必须对内存进行分配。经典的内存分配过程是这样进行的:内存以内存单元为基本单位,每个内存单元用一个固定的整数作为标识,称为地址。地址从0开始连续排列,地址相邻的内存单元被认为是逻辑上连续的。我们把从地址i开始的s个连续的内存单元称为首地址为i长度为s的地址片。运行过程中有若干进程需要占用内存,对于每个进程有一个申请时刻T,需要内存单元数M及运行时间P。在运行时间P内(即T时刻开始,T+原创 2015-01-10 11:03:41 · 2356 阅读 · 0 评论 -
[SDOI2009]HH的项链 解题报告
一、这道题。。据说有大神考场上的时候搞了一坨线段树实现了在线。。二、离线是早就想到了,但是一开始我是按左端点扫的。。导致。。相当麻烦,还做了个前缀和什么的。三、其实如果按右端点扫,就很简单了!对于许多相同的数,我们完全可以只保存当前它们最右边那个,然后被保存的数被置1,没保存的置0,于是就成了简单的区间求和了。四、当然还有一种比较难理解的差分做法,说起来比较麻烦。。也比较蛋疼。。绕原创 2014-12-06 11:12:17 · 969 阅读 · 0 评论 -
[NOI2010]超级钢琴 解题报告
超级钢琴【问题描述】小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的原创 2015-01-17 14:09:16 · 1993 阅读 · 2 评论 -
[CODEVS3032]摆放球 解题报告
这个题本来我是想练堆用的,结果堆没练出来,倒是练了练线段树。此题属于那种看起来特别简单,一做起来做出翔的那种;交了六遍,对拍了N年才A。主要需要注意的是这么几点:1、节点保存什么信息?题目中让求的是距离最大,但这玩意儿在线段树中不太好办;我一开始想当然地写成了r-l式的距离,结果合并信息的时候呵呵了。更好的做法是保存区间中连续一段空橱子的个数:①设置变量意义时一定要从易于理原创 2015-01-03 11:41:09 · 1159 阅读 · 0 评论 -
[tyvj1730二逼平衡树]解题报告
学了一下主席树,由于怕调不出来,选择了用普通线段树套权值线段树。犯得一些傻逼错误是:①把大小写n混用结果弄错了。②没过样例TM就交了。③被题意坑了,“保证有序序列所有值在任何时刻满足[0,10^8]",并不意味着询问非负。#include#include#include#includeusing namespace std;#includechar * p=(cha原创 2015-03-14 11:57:09 · 741 阅读 · 0 评论 -
SDOI2015游记
Day1 今天的遗憾主要在于T1,没有想到2个块里可能会有两种不等价的交换,其实这种计数问题,应该要想到会有不等价的情况的。。但是我还是没想到,导致白丢了15分。 但是反过来想,其实即使我想到了不等价的情况,实际上我也觉得我搞不出正解的,我并没有想到可以用搜索来解决这个问题,虽然它在知道题解之后看起来很显然了。 那么,作为总结的话,是要告诉自己以后该怎么避免这种情况的发生。原创 2015-04-13 18:52:29 · 1972 阅读 · 5 评论 -
[CODEVS1283]等差子序列解题报告
这真的是一道很神的题,但在CODEVS。。可以暴力过掉。。当然,在BZOJ上是不可以的。所以。。我还是看了看题解,题解是这样说的:一、一个基本的转化是将题目中的描述翻译为一个长度为3的等差子序列,即存在x,k,使得x-k与x+k在x异侧。二、我们先来看一个错误的贪心思路,因为是一个1~N的排列,所以我们可以把它们视为离散后的数据,首先我们将其按奇偶分开,奇数放一边,偶数放一边,这样就可原创 2014-12-01 21:06:40 · 1487 阅读 · 0 评论 -
[CF335D]Rectangle And Square 解题报告
中文题面: 【描述】 你有N个矩形(编号从1到N)。所有矩形的四个角的坐标都是整数,并且两组对边分别平行于X和Y两坐标轴。不同的矩形可能接触,但是不会重叠。 现在你的任务是:选出一些矩形,使它们恰好拼成一个正方形。 【输入】 第一行,一个整数N,为矩形的数目。 以下N行,每行四个整数x1, y1, x2, y2,描述一个左下角为(x1, y1),右上角为(x2, y2)的矩形。这N行原创 2015-06-27 11:58:10 · 1294 阅读 · 0 评论 -
[Apio2009]CONVENTION会议中心 解题报告
这题并不会做。。 这道题的主要问题是如何求一个区间的最大不相交线段覆盖,思路是可以用倍增来加速贪心。就是说我们本来是求一个区间里最多有多少条线段,我们把它转换成二分/倍增线段数,求其最短的区间是多少。 代码:#include<cstdio>#include<iostream>using namespace std;#include<algorithm>#include<cstring>原创 2016-04-05 09:56:29 · 2371 阅读 · 0 评论 -
SDOI2016Round1
Day1T1做了三个半小时,然后T2写的很急判素数写跪了一句话,T3只剩一个20分暴力的时间了。。于是就这么愉快的滚粗了。发现原来我还不会数位DP。。 Day1T3竟然有log3nlog^3n,不过我卡了很久发现似乎确实卡不掉。。最多卡到1.5s左右。。因为线段下传的log与区间长度有关,如果链剖的log大了的话它就会很小;而如果让在每个重链上的长度比较大就会导致链剖的log变得很小。所以很难卡。原创 2016-04-12 08:49:56 · 967 阅读 · 0 评论 -
[code+月赛]Yazid的新生舞会
用很有趣的方法做了这道题。标算非常厉害,并没有想到。。 考虑求众数为x的区间数量,由序列a构造序列b,bx(i)=−1+2∗[a(i)==x]b_x(i)=-1+2*[a(i)==x],作前缀和sx(i)=sx(i−1)+b(i)s_x(i)=s_x(i-1)+b(i)。 ans=∑x=0n−1∑1≤j<i≤n[sx(i)>sx(j)]ans=\sum_{x=0}^{n-1}\sum_{1\le原创 2018-01-02 02:43:44 · 1008 阅读 · 0 评论