随笔分类 - 数据结构—堆
1
摘要:任意k个都可以,也可以看做把不行的都选了,再随便选一个可以的要选的数量 把区间和m个值都排序,区间按l一序r二序排,枚举m个值,小根堆维护能帮韩当前枚举值的区间的右端点,这样方便删除区间,然后剩下的就都不行,所以ans=max(n size+1) 注意枚举完要弹出一个区间,表示这个区间属于当前枚举值
阅读全文
摘要:给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差 k的能交换,发现使原问题字典序最小也需要使这里的字典序最小 注意到p值差 include include using namespace std; const int N=3000005; int n,k,a[N],p[
阅读全文
摘要:如果枚举d来dp,那么就是设f[u][0/1]为u点不断/断掉和父亲的边,然后优先选取f[v][1]+w(u,v) include include include include using namespace std; const int N=300005; int n,du,v[N],d[N],
阅读全文
摘要:有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a b c d,ka=4,kb=2,kc=3,kd=4,按字典序就先选c然后b就不能合法了) 所以倒着来,建反图,然后按照n k[i]从大到小拓扑,因为是反图所以是
阅读全文
摘要:首先看两条链怎么合并,贪心可得是从大到小取max,多条链同理 所以dfs合并子树的大根堆即可,注意为了保证复杂度,合并的时候要合并到最长链上,证明见长链剖分 cpp include include include using namespace std; const int N=200005; in
阅读全文
摘要:和bzoj4504差不多,就是换了个数据结构 像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用一个可持久trie上维护最大xor值和对应的点即可 cpp include incl
阅读全文
摘要:像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用可持久化线段树维护(主席树?)每个点到他root的区间和,这样每次右端点右移就是上一个的线段树在(la[a[i]]+1,i)加上a
阅读全文
摘要:参考:https://www.cnblogs.com/CQzhangyu/p/8632904.html 要开longlong的 首先看dp,设f[u]为必选u点的子树内最大联通块,p[u]为不一定选u的子树内最大联通块,转移很显然就是f[u]=max(Σf[v],0),p[u]=max(max(p[
阅读全文
摘要:和数据备份差不多 设二元组(i,a[i]),开一个大根堆把二元组塞进去,以len排序,每次取出一个二元组 因为单纯的贪心是不行的,所以设计一个“反悔”操作。 记录二元组的前驱pr后继ne,把拿出来的二元组的len加进答案,然后把当前二元组和它的前驱后继当成一个,也就是len[x]=a[pr[x]]+
阅读全文
摘要:第一想法是按照结束时间贪心,但是这样有反例 所以先按照t贪心,能选则选,把选的楼的持续时间放进大根堆里,当当前的楼不能选的时候如果当前的持续时间比大根堆里最大的要小,就用这个替换最大,这样总数不变但是时间缩短了 cpp include include include include using na
阅读全文
摘要:这个题方法还挺多的,不过洛谷上要输出方案所以用堆最方便 先按起始时间从小到大排序。 我用的是greater重定义优先队列(小根堆)。用pair存牛棚用完时间(first)和牛棚编号(second),每次查看队首的first是否比当前牛的起始时间早,是则弹出队首记录当前牛的答案,再把新的pair放进去
阅读全文
摘要:先按照时间顺序加,价值塞进小根堆里,碰到不合法情况就从堆里减去
阅读全文
摘要:如果反着看,看成合并木板,就和合并果子一样了,把若干块放进一个小根堆,然后每次取出两个合并,把合并结果加进答案和堆里 代码里小根堆用优先队列实现(懒
阅读全文
摘要:我是智障系列。用了及其麻烦的方法= =其实树形sp就能解决 设直径长度+1为len(环长) 首先k=1,直接连直径两端就好,答案是2\ n len 然后对于k=2,正常人的做法是树形dp:先求直径,然后把树的直径上的所有边权标为 1,再求一次直径设新直径+1为len2,答案是2\ (n−1)−len
阅读全文
摘要:参考:http://blog.csdn.net/w_yqts/article/details/76037315 把相同符号的连续数字加起来,合并后ans先贪心的加上所有正数,如果正数个数sum m,设计二元组(i,a[i])表示合并后序列i位置上值为a,记录前驱后继,塞进按绝对值排序的小根堆里。每次
阅读全文
摘要:参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法。题意相当于若干个数取不相邻的k个使最小。先把数组差分,len表示这段空的长度。设二元组(i,len[i]),开一个小根堆把二元组塞进去,以len排序。每次取出一个二元组
阅读全文
摘要:参考:https://www.cnblogs.com/CQzhangyu/p/7071477.html 神奇的点分治序(或者叫点剖?)。就是把点分治扫过的点依次放进队列里,然后发现,对于每一棵树摊到序列上,每个点的值v是重心到这个点的距离,那么对序列上的每个点定义l为这个子树重心在序列上的位置,r为
阅读全文
摘要:设计一个五元组(i,l,r,p,v),表示在以i为左端点,右端点落在(l,r)中的情况下,取最大值v时右端点落在p。把这个五元组塞到优先队列里,以v排序,每次取出一个,然后把这个取过的五元组分成两个(i,l,p 1,p',v')(i,p+1,r,p'',v'')塞回去。 关于如何确定v和p,先求前缀
阅读全文
1

浙公网安备 33010602011771号