05 2018 档案
摘要:分析: 30+暴力应该还是蛮水的,可以随便写写... 60+的就没那么容易了,但是应该挺裸的,往上架一颗线段树,查询连续1或0的长度,或者找到前缀中,第一个1或0,之后区间覆盖,单点查询,开bool,完全可做,手动模拟二进制加减法就可以了,O(nlog^2) 96的是被卡常了...仔细思考一下,如果
阅读全文
摘要:分析: 这个题,还是蛮有趣的。考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和。 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑或的结果冲突的概率就几乎没有了。 lca什么的,随便求。 剩下的,考虑二分答案,如果左区间的全为奇数
阅读全文
摘要:分析: 一开始一直Wa,发现是建图建错了,必须得拆点。 S连i,流量为a[i],费用为0,i+n连T,流量同上,费用为0,之后i连i+1费用为0,流量为inf,之后S连n*2+i,流量为li,费用为0,之后枚举j从1到n,n*2+i连接j+n,费用为p[i],之后i连接i+d[i]+1,费用为q[i
阅读全文
摘要:分析: 能看出来,这是一个费用流的题,建图很朴实,i连i+1,费用为存储费用,流量为仓库容量,之后S连i,费用为单价,流量为inf,之后i连T,流量为a[i],费用为0,之后裸上费用流... 附上代码:
阅读全文
摘要:分析: 比较裸的分层图最短路,我的实现方式是,每次求出1所有节点的最短路,之后用每一个节点更新与其相连的节点(取较小值),之后做K次,就求出了分层图的最短路了。 附上代码:
阅读全文
摘要:分析: 双倍经验(数据范围不同)。 我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案。那么我们考虑预处理出pre[i]表示从1走到i满足最短路的并且经过pre[i],pre[i]为路径第二个节点。那么,针对每一个边,(x,y,z,
阅读全文
摘要:分析: 没想到这道题还能二分查找... 这题主席树的话,裸的很显然...我们将每一个数分解质因数,之后建一个可持久化权值线段树维护[L,R]区间内的每一种质因子的个数,分解质因数的话,可以选择用线筛,总体时间复杂度为O(qlognlogn+nlogn+n);之后的常数巨大,比根号跑的还慢...当然,
阅读全文
摘要:分析: 听说主席树和莫队可以做,前者不想写,后者我不会... 我们考虑将询问离线,按照左端点排序,之后先处理好从1开始选的答案,之后枚举从1到n,之后依次删除nxt[i],添加nxt[nxt[i]],之后当询问左端点等于i的时候,更新答案。 附上代码:
阅读全文
摘要:分析: 听说是莫队裸题,很显然,我并不喜欢莫队。 我们可以考虑将询问离线,以右端点排序,之后从1枚举到n,依次树状数组中修改i和last[i],之后当i==询问的右节点时,find一下答案就可以了。 附上代码:
阅读全文
摘要:分析: 我们可以考虑,因为我们必须经过这些节点,那么我们可以将它状压,并且我们因为可以重复走,只是要求停顿前后,不要求遍历前后,那么我们之间存一下点与点之间的最短路,之后每次转移一下就可以了。 f[i][S]表示在i节点,状态为S,转移:f[i][S]=max{f[j][S^(1<<i-1)]+di
阅读全文
摘要:分析: 我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序。目测可以使用堆来实现,线段树也能实现,链表和并查集不能实现。 每次放球可以暴力的放入,因为满足实际不可以放入超过n个球。 每次取走的球可
阅读全文
摘要:分析: k很小,可以状压。 f[S][i]表示状态S表示在i之前k+1个中点的边数奇偶情况 之后转移的时候,S的最后一位不能为1 附上代码:
阅读全文
摘要:分析: 这个题很好啊,比起什么裸的状压DP高多了! 我们可以考虑,什么时候答案最大:全合并,之后再分裂 这样,我们必定可以得到答案,也就是说答案必定小于n+m 那么我们可以考虑,什么时候能够使答案更小:就是n中去一些,m中取一些,它们的和相等的时候,ans-=2; 这样,我们就可以考虑状态f[S][
阅读全文
摘要:分析: 建图最短路,比较裸。 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然。 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码:
阅读全文
摘要:可并堆 可并堆,又称为左偏树,满足从一个节点一直向左儿子走比一直向右儿子走距离更长。 这样,它就满足了往右走最多log次,也就是每次合并的时间复杂度为O(log) 合并:将一个合并到另一个的右儿子上,合并的同时满足堆的所有性质。 BZOJ1455罗马游戏: 维护小根堆,每次合并的时候讲大的合并到小的
阅读全文
摘要:分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝。 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: 其实这种方法就能跑的飞起,虽然是递归的,并且状态和转移比较多。 其实还有别的方法,比如说将它转化为dfs序上做背包
阅读全文
摘要:点分治: 通常用来处理树上路径信息,选出部分,把部分的全部处理更新答案,用部分与部分之间的联系求出整体。 一般,我们选择重心作为分治对象。 对两个不属于统一部份的进行合并的时候,我们通常需要预处理出到分治中心的信息,再对这种信息进行合并。 点分治很多题的关键在于容斥原理,容斥原理通常能够排除掉很多不
阅读全文
摘要:分析: 模拟赛T3,其实很水,当时出于某些原因,没有去写这道题... len>46必定有解 为了满足不是三角形,那么斐波那契数列是最优选择,而斐波那契数列的第46项超过了2^31-1,所以超过46不能选 之后朴素LCA+暴力(暴力我一开始没有想到怎么写...) 附上代码:
阅读全文
摘要:分析: 树形DP中的一种,基环树DP 针对每一个环跑DP,f[i],g[i]分别表示选或者不选,之后我们注意每次遍历的时候,不要重复遍历。 附上代码:
阅读全文
摘要:分析: 构造法...每次找到一个没有被选过的数,用这个数推出一个表格,之后在表格上跑状压DP,时间复杂度O(n) 附上代码:
阅读全文
摘要:分析: 这个题的状压DP还是比较裸的,考虑将疾病状压,得到DP方程:F[S]为疾病状态为S时的最多奶牛数量,F[S]=max{f[s]+1}; 记得预处理出每个状态下疾病数是多少... 附上代码:
阅读全文
摘要:分析: 我们如果选择点i,那么我们不能选择i-1和i+1,如果没有这个限制,直接贪心就可行,而加上这个限制,我们考虑同样贪心,每次选择i后,将点i-1,i+1从双向链表中删除,并且将-a[i]+a[i-1]+a[i+1]推入堆中,处理K次,得到最优答案 附上代码:
阅读全文
摘要:分析: 这个题一看就是裸的树剖... 唯一值得考虑的就是它的根一直在变化,我们可以这样想,如果假根在这个点的子树外,那么直接将这个点的子树作为答案区间,如果在子树内,则相对复杂,我们假设son为root所在的节点x的儿子的子树内的儿子编号,那么答案就是min(1到idx[son]-1,idx[son
阅读全文
摘要:分析: 首先,连续选择一段必定最优... 区间DP,f[i][j]表示从i开始,连续j个被吃掉了,并且,牛在i处,g[i][j]则表示在i+j-1处 f[i][j]可以从g[i+1][j]和f[i+1][j]转移,g[i][j]可以从g[i][j-1]和f[i][j-1]转移,转移方程: f[i][
阅读全文
摘要:分析: 这是今天下午的考试题,推了2个小时,考试中A掉了 首先,循环串通过字符串hash可以O(1)判断:get_hash(l,r-len)==get_hash(l+len,r);显然可证。 我们其次可以发现,循环串的长度是所求串的长度的约数 之后我们可以发现,如果两个不同的子串是循环串,那么这两个
阅读全文
摘要:分析: Dijkstra求最短路树,在最短路树上进行操作,详情可见上一篇博客:http://www.cnblogs.com/Winniechen/p/9042937.html 我觉得这个东西不压行写出了有点丑...之后写了一个压行后更丑的... 附上压行后的代码:
阅读全文
摘要:分析: 树剖裸题,[Usaco2009 Jan]安全路经Travel 的简化版 剖开最短路树,遍历每一条没在最短路树上的边。 这种情况下,有且仅有u到v路径上,出来lca之外的点能够通过这条边到达,并且,路径长度为:dis[u]+dis[v]+val-dis[x];(dis[x]是从根到x的最短路长
阅读全文
摘要:A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598:牛跑步 求前K短路 因为A*算法我们每次用来向外拓展的是估价函数最小的点,那么,我们必定能够得到,
阅读全文
摘要:分析:水题 每次安装的时候和根节点求lca的过程中区间覆盖+区间查询 每次删除的时候查询子树中安装的数量+区间覆盖 附上代码:
阅读全文
摘要:分析: 区间合并,lcol是左端点的颜色编号,rcol是右端点的颜色编号,那么我们向上合并的时候,如果左儿子的rcol等于右儿子的lcol那么区间的sum--。 另外,如果重链顶的颜色等于重链顶的父节点的颜色,那么ans--; 附上代码:
阅读全文
摘要:分析: 数据范围表示:c特别的小(c<20) 我们可以考虑nlogn*c^2的算法。 线段树维护区间信息:f[i]表示在[l,r]这段区间中选择i个数相乘的和。 因此,我们可以将区间看成一个点,在PushUp的时候用背包的方式更新父节点。(仔细观察发现这是卷积) 剩下的就是一些优化了... 附上代码
阅读全文
摘要:斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ; 1<=j<i (O(n^2)暴力)这样一个式子,首先,如果xxxx(xxx)与j无关,那么这是一个单调队列(可以理解?) 那么我们思考一下,如果xxxx(xxx)与i
阅读全文
摘要:很早之前写的题了,发现没有更博,想了想,更一发出来。 Orz ljss 这是冬令营上的例题...之后,我推出来了一种时间复杂度没有问题,空间复杂度没有问题的方法,额(⊙o⊙)…和给出的正解不同,但是能AC 分析: 正解是什么我忘了,我还是讲一下我自己的方法吧... 首先,这是一个并查集的题...但是
阅读全文
摘要:分析: 构造数据时间有些长,可以用秦九韶优化一下。 二分答案+贪心,即:另每一个b[i]尽可能的小的同时满足题意,在枚举过程中,判断是否存在一个b[i-1]>a[i]+x 如果存在,那么向右找 如果不存在,向左找 附上代码: 卡了一下常数(loj上需要卡一下常数,bzoj和洛谷不用,开O2跑的飞快)
阅读全文
摘要:分析: 这道题很恶心...那个-1卡了我一会儿,其他的部分很简单。 我们能够看出,解题个数和n相关,并且形成不下降序列,那么我们可以二分找到第一个满足解题数为K和最后一个满足解题数为K的位置 判断两件事,(1)check(1)>=k(2)ans1<=ans2 附上代码:
阅读全文
摘要:并查集 正序处理时间复杂度为n^2,考虑逆序处理,这样,时间复杂度从n^2降为nlogn 附上代码:
阅读全文
摘要:分析: 一开始没看懂题... 后来想用二分答案却不会验证... 之后,想到用主席树来维护... 建一个权值线段树,维护出这个权值以前所有的点最晚在哪里出现... 之后,查一下是不是比查询区间的l断点大...如果小,往左查,如果大,往右查... 附上代码...
阅读全文
摘要:网上有很多人说用dfs序+线段树做...其实stl的堆可以...可并堆可以...很多奇奇怪怪的东西都能做... 可并堆比较好想...也比较好写... 分析: 首先,这是一个网络流做不了的题...数据太大... 其次...我们可以这样考虑一下,这个点的子树中,将这个点的权值仅更新给最大的那个就能满足
阅读全文
摘要:树状数组+主席树,模板题,不多说...
阅读全文
摘要:额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长度最小,那么我们可以考虑将区间按长度排序 之后,因为我们是需要最大最小,所以,我们必定选择在排完序的
阅读全文
摘要:分析: 这是一个DP,没什么好说的,细节很烦人。 DP[i][j]表示到第i个位置,高度为j点最少的次数。 转移: 当j=m时 k属于[m-h,m]都可以向DP[i][j]转移,即dp[i][j]=min(dp[i-1][k]+1); 当j!=m时 dp[i][j]=min{dp[i-1][j-h]
阅读全文
摘要:题面描述:尽可能多的放置符合要求的炸弹。 分析: 在i,j处放置炸弹,则在第i行,上一个硬石头之后,下一个硬石头之前,第j列,上一个硬石头之后,下一个硬石头之前,不能再次放置炸弹。 首先,这个题,一看很显然就是一道网络流的题面。 那么,我们可以这样想,硬石头与硬石头之间建立二分图,而如何建立呢? 假
阅读全文

浙公网安备 33010602011771号