10 2018 档案

摘要:【题解】 先建反向图,dfs求出哪些点可以到达终点。 再建正向图,dfs求出哪些点可以作为路径上的点。 最后在合法的点之间连边,跑dijkstra. 阅读全文
posted @ 2018-10-31 21:38 Driver_Lao 阅读(181) 评论(0) 推荐(0) 编辑
摘要:【题解】 树链剖分+线段树的模板题。每个点的点权是它父亲到它的边的边权,这样我们就完成了把边权变为点权的操作,之后直接树剖即可。 注意回答询问的时候要把lca(x,y)去掉,因为x到y的链上并不包含lca(x,y)到它的父亲的边。 阅读全文
posted @ 2018-10-31 19:54 Driver_Lao 阅读(214) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们先从1到Max ai枚举Tab占几个空格,然后跳着统计答案。 跳着统计答案的意思是对于每个长度i,在值域上%i的循环节是i,所以我们把值域分成m/i个区间,一个个计算答案。这样复杂度是调和级数,也就是n*ln n的。 统计答案的时候可以用值域上的前缀和辅助。 阅读全文
posted @ 2018-10-31 15:15 Driver_Lao 阅读(237) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们可以发现叶子节点的关联点一定是它的父亲节点,那么我们dfs一遍就可以求出所有节点的关联点,或者判断出无解。 对于每个点i,它的关联点u的危险度肯定比它连接的其他点vi的危险度小,我们从u向vi连边。 连边之后我们跑拓扑排序,并且用堆维护当前入度为0的点中编号最小的,以此来让字典序最小。 阅读全文
posted @ 2018-10-31 15:02 Driver_Lao 阅读(334) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小、最小直径是多少。 【题解】 每条边的边权都是一次函数,那么直径是单峰函数。单峰函数求最小值我们可以用三分法。 注意 阅读全文
posted @ 2018-10-31 14:42 Driver_Lao 阅读(211) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 某个物体要从A途经B到达C,在通过B的时候速度不能超过vd. 它的加速度为a,最大速度为vm;AB之间距离为d,AC之间距离为L; 问物体最少花多少时间到达C. 【题解】 分情况讨论。 若物体一直加速,通过B之前速度已经超过了vd,那么显然物体必须先加速后减速才能保证通过B是速度为vd 阅读全文
posted @ 2018-10-30 15:25 Driver_Lao 阅读(385) 评论(0) 推荐(0) 编辑
摘要:【题解】 考虑从小到大枚举边权,按顺序加边。 当前树被分成了若干个联通块,若各个块内的点只能跟块外的点匹配,那么最终的min g(i,pi)一定大于等于当前枚举的边。 判断各个联通块内的点是否全部能跟块外的点匹配,只需比较sum-cnt[i]、size[i],其中sum是所有x的和,cnt是块内x的 阅读全文
posted @ 2018-10-28 20:36 Driver_Lao 阅读(267) 评论(0) 推荐(0) 编辑
摘要:【题解】 跟51nod 1105差不多。 二分答案求出第L个数和第R个数,check的时候再套一个二分或者用two pointers. 最后枚举ai在b里面二分,找到所有范围内的数,排序后输出。 注意最后找到的数可能多于R-L+1,需要考虑这一点。 阅读全文
posted @ 2018-10-28 20:18 Driver_Lao 阅读(386) 评论(1) 推荐(0) 编辑
摘要:【题解】 二分答案,check的时候枚举ai再二分b,求出有多少个数比mid大(或小)。其实check的时候用two pointer也可以,因为mid是单调的,a、b也是单调的。 阅读全文
posted @ 2018-10-28 20:02 Driver_Lao 阅读(145) 评论(0) 推荐(0) 编辑
摘要:【题解】 经典的带权并查集题目。 设cnt[i]表示i前面的点的数量,siz[i]表示第i个点(这个点是代表元)所处的联通块的大小;合并的时候更新siz、旧的代表元的cnt,路径压缩的时候维护cnt即可。 阅读全文
posted @ 2018-10-27 23:14 Driver_Lao 阅读(223) 评论(0) 推荐(0) 编辑
摘要:【题解】 拓扑排序+DP即可。 阅读全文
posted @ 2018-10-27 22:03 Driver_Lao 阅读(294) 评论(0) 推荐(0) 编辑
摘要:【题解】 二分+dijkstra 二分需要交的过路费,然后跑dijkstra判断最短路是否小于s 阅读全文
posted @ 2018-10-27 20:24 Driver_Lao 阅读(146) 评论(0) 推荐(0) 编辑
摘要:【题解】 把询问离线,倒着加点,并查集维护连通性即可。 阅读全文
posted @ 2018-10-26 06:53 Driver_Lao 阅读(179) 评论(0) 推荐(0) 编辑
摘要:【题解】 先建反向图,用dijkstra跑出每个点到n的最短距离dis[i] 设f[u][k]表示dis(u,n)<=mindis(u,n)+k的方案数。对于边e(u,v,w),走了这条边的话需要多走的距离就是这条边的边权-原来u,v之间的距离,即w-(dis[u]-dis[v]) 那么转移就是f[ 阅读全文
posted @ 2018-10-25 16:47 Driver_Lao 阅读(230) 评论(0) 推荐(0) 编辑
摘要:【题解】 这两道题是完全一样的。 思路其实很简单,对于两种边权分别建反向图跑dijkstra。 如果某条边在某一种边权的图中不是最短路上的边,就把它的cnt加上1。(这样每条边的cnt是0或1或2,代表经过这条边GPS报警的次数) 最后用每条边的cnt作为边权建图,跑dijkstra即可。 判断某条 阅读全文
posted @ 2018-10-25 14:46 Driver_Lao 阅读(187) 评论(0) 推荐(0) 编辑
摘要:【题解】 f[i][j]表示最后一个数为h[i],公差为j的等差数列的个数。n方枚举最后一个数和倒数第二个数转移即可。注意公差可能为负数,需要移动为正数再作为下标。 阅读全文
posted @ 2018-10-24 18:13 Driver_Lao 阅读(204) 评论(0) 推荐(0) 编辑
摘要:【题解】 x xor y的结果在二进制下有奇数个1,等价于x与y在二进制下的1的个数之和为奇数,因为x xor y减少的1的个数一定是偶数(两个数这一位都为1,xor的结果为0,减少了2个1) 那么答案就是序列中二进制下有奇数个1的数的个数 乘 二进制下有偶数个1的数的个数。 因为n有1e7,暴力算 阅读全文
posted @ 2018-10-23 15:47 Driver_Lao 阅读(205) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们可以发现每次修改之后叶子结点到根的路径最多分为两段:一段白色或者黑色,上面接另一段灰色的。二分+倍增找到分界点,然后更新答案即可。 check的时候只需要判断当前节点对应的叶子结点的区间是否全部为同一种颜色,用树状数组维护所有叶子节点组成的序列的状态即可。 阅读全文
posted @ 2018-10-23 15:04 Driver_Lao 阅读(328) 评论(0) 推荐(0) 编辑
摘要:【题解】 可以发现每次推的操作就是把序列中每个数变为下一个数,再打一个减一标记;而每次加球的操作就是把球的位置加上标记,再插入到合适的位置。 用set维护即可。 阅读全文
posted @ 2018-10-23 14:55 Driver_Lao 阅读(233) 评论(0) 推荐(0) 编辑
摘要:【题解】 先建反向图,然后跑拓扑排序求出最长路。 将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字、起点的排名为第二关键字排序。 按照这个顺序更新这一层的答案,按照这一层每个点被更新的顺序得到这一层的点的排名。 阅读全文
posted @ 2018-10-23 10:39 Driver_Lao 阅读(152) 评论(0) 推荐(0) 编辑
摘要:【题解】 DP. 设f[i]表示前i个字母,保留第i个字母,最多可以保留多少个字母;设g[i]为当前字母为i的位置对应的f的最大值。 转移方程就是f[i]=max(f[i], g[j]+1) (j与s[i]不冲突) , g[s[i]]=max(g[s[i]], f[i]) . 阅读全文
posted @ 2018-10-20 23:50 Driver_Lao 阅读(152) 评论(0) 推荐(0) 编辑
摘要:【题解】 平衡树模板题,不过因为可以离线,所以有别的做法。把询问倒着做,变成删掉数字、求中位数,于是可以二分+树状数组。 阅读全文
posted @ 2018-10-20 23:19 Driver_Lao 阅读(169) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和。 【题解】 扫描线+线段树。 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到右Mex单调上升。 然后我们把区间左端点逐渐向右边移动,也就是扫描线是左端点。 我们可以发现每次移动 阅读全文
posted @ 2018-10-20 21:36 Driver_Lao 阅读(337) 评论(0) 推荐(0) 编辑
摘要:【题解】 把某一行或某一列有4个1的都统计出来,然后首尾接上尽量长的,注意首尾不能选上同一个矩阵,要维护前缀、后缀1最大值和次大值。 还要注意维护矩阵内连续1的长度,因为可能有 0 0 0 0 这种情况。 0 1 1 0 0 1 1 0 0 0 0 0 阅读全文
posted @ 2018-10-20 09:56 Driver_Lao 阅读(141) 评论(0) 推荐(0) 编辑
摘要:【题解】 离散化+线段树,注意处理好几种标记之间的关系。 阅读全文
posted @ 2018-10-19 15:22 Driver_Lao 阅读(167) 评论(0) 推荐(0) 编辑
摘要:【题解】 先用floyed处理出两点间的最短路。 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离。 分情况讨论来转移即可。 阅读全文
posted @ 2018-10-18 06:49 Driver_Lao 阅读(183) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2018-10-17 21:36 Driver_Lao 阅读(1) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 求一个序列的最长下降子序列的长度及其方案数,若两个子序列的数字是相同的但选取的位置不同,则只算一个。 【题解】 Dp,设f[i]为第i个位置为结尾的最长下降子序列的长度,g[i]为第i个位置为结尾的最长下降子序列的方案数。 g[i]=max(sigma g[j], 1) (j<i, f 阅读全文
posted @ 2018-10-16 20:10 Driver_Lao 阅读(188) 评论(0) 推荐(0) 编辑
摘要:【题解】 单调队列或者Two Pointers. 阅读全文
posted @ 2018-10-16 15:25 Driver_Lao 阅读(177) 评论(0) 推荐(0) 编辑
摘要:【题解】 期望题。设f[i]为到第i位的期望得分,g[i]为到第i位的期望combo. 若s[i]为o,f[i]=f[i-1]+2*g[i-1]+1(也就是f[i]-f[i-1]=(g[i-1]+1)^2-g[i-1]^2), g[i]=g[i-1]+1; 若s[i]为x,f[i]=f[i-1], 阅读全文
posted @ 2018-10-16 10:55 Driver_Lao 阅读(266) 评论(0) 推荐(0) 编辑
摘要:【题解】 取个对数然后二分即可。对于一个数x,x^x的位数就是(int)(lg(x)*x+1). 阅读全文
posted @ 2018-10-16 07:02 Driver_Lao 阅读(191) 评论(0) 推荐(0) 编辑
摘要:【题解】 就是基环外向树森林找环,然后从环向外统计size就可以了。 阅读全文
posted @ 2018-10-16 06:44 Driver_Lao 阅读(208) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算。 我们还需要确定最小生成树上哪些边需要经过两次。我们发现如果某个点当前的度为奇数,这个点到它的父亲的边要经过两次,所以我 阅读全文
posted @ 2018-10-16 06:39 Driver_Lao 阅读(152) 评论(0) 推荐(0) 编辑
摘要:【题解】 本题有多种做法,例如可持久化并查集、kruskal重构树等。 kruskal重构树的做法是这样的:先把边按照海拔h从大到小的顺序排序,然后跑kruskal建立海拔的最大生成树,顺便建kruskal重构树。 这样建出来的重构树是一个小根堆,也就是说,如果某个节点没有被淹,它的子树内的点都不会 阅读全文
posted @ 2018-10-15 07:56 Driver_Lao 阅读(191) 评论(0) 推荐(0) 编辑
摘要:【题解】 考虑Dp. 设f[i][j]表示当前在第i个垃圾,高度为j,最多可以存活到什么时候。转移方程就是f[i][j]=max(f[i-1][j-h[i]], f[i-1][j]+a[i]) 其中h[i]表示第i个垃圾能增加的高度,a[i]表示第i个垃圾能延长的存活时间,且能转移的条件是之前的f大 阅读全文
posted @ 2018-10-14 16:10 Driver_Lao 阅读(173) 评论(0) 推荐(0) 编辑
摘要:【题解】 DP题,我们用f[i][j]表示有n个节点、高度小于等于j的二叉树的个数。f[i][j]=sigma(f[t][j-1]*f[i-t-1][j-1]) t是1~i-1范围内的奇数。 阅读全文
posted @ 2018-10-14 15:36 Driver_Lao 阅读(188) 评论(0) 推荐(0) 编辑
摘要:【题解】 状压DP. f[i]表示现在的点是否连接的状态是i. 阅读全文
posted @ 2018-10-09 21:33 Driver_Lao 阅读(211) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们把智商ai当成重量,把情商bi当成价值,可以把这道题转化为一道经典的01背包问题。 f[i]=max(f[i],f[i-a[i]]+b[i]). 但是转化后与原来的01背包有一些不同: 转移必须支持负数,所以我们把f的下标平移400000个单位,全部变成正数。 有些代价为负数,这时我们 阅读全文
posted @ 2018-10-09 20:15 Driver_Lao 阅读(148) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们设总共有m个二进制位出现过1,那么如果n-k≥m,显然所有的1都可以出现,那么答案就是把所有的数或起来。 如果n-k<m,那么因为k不超过100,ai不超过1e5,所以n不超过117,直接n*1e5的Dp即可。 Dp的方式也是多种多样,如果设f[i][j]表示前i个数字或出j最少需要几 阅读全文
posted @ 2018-10-09 17:05 Driver_Lao 阅读(240) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 修改图中任一一条边的边权,使其加倍,问怎样使修改后图中的1~n的最短路最大。输出最短路的增量。 【题解】 先跑一遍dijkstra求出1~n的路径长度,记录下经过的边。枚举这些边进行修改,再跑dijkstra求出某条边修改后的最短路径的长度。 阅读全文
posted @ 2018-10-07 15:03 Driver_Lao 阅读(225) 评论(0) 推荐(0) 编辑
摘要:【题解】 每个格子可以到达的区域是一个菱形,但是我们并不能快速的求和,所以我们可以把原来的草地旋转45度,用二维前缀和快速处理菱形的区域的和。 阅读全文
posted @ 2018-10-06 09:58 Driver_Lao 阅读(279) 评论(0) 推荐(0) 编辑
摘要:【题解】 贪心。 把区间按照右端点从小到大排序,右端点相同的按照长度从小到大排序,然后按顺序考虑,能放就放下去。 维护能不能放下去用线段树即可。 阅读全文
posted @ 2018-10-06 08:27 Driver_Lao 阅读(153) 评论(0) 推荐(0) 编辑
摘要:【题解】 非常显然的DP,f[i]表示到第i个位置最多分成几组,f[i]=Max(f[i],f[j]+1) (j<i,sum[j]<=sum[i]) 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL l 阅读全文
posted @ 2018-10-04 10:20 Driver_Lao 阅读(206) 评论(0) 推荐(0) 编辑