摘要: 有这样一类问题:一个n个点m条边的有向图中,找到一颗总边权最小的生成树,使得根节点能到达任意一个点(这样的一颗树就叫做这个图的最小树形图); 我们怎么暴力怎么来: 1.首先,我们对于图中的每个点y求出所有出边指向y中边权最小的点x,对于(x,y)建立父子关系;2. 2.然后我们按照这个关系得到一个图 阅读全文
posted @ 2019-12-13 16:10 神之右大臣 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 题面 虚树的模板题: 虚树的思想是只保留有用的点(在这道题目里面显然是标记点和lca),然后重新构建一棵树,从而使节点大大减少,优化复杂度 我们维护一条链(以1号点为根),这条链左边的所有在虚树上的位置都已经处理完毕;而这条链右边的和下面的都未处理; 这条链我们用栈来维护; 对于要新加的询问点now 阅读全文
posted @ 2019-12-12 20:11 神之右大臣 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 题面 我们寻找一个东西总是比判断一个东西复杂,对吧; 那么就转化思路:如果我们知道等差数列的中间项mid,那么就是寻找一对数(l,r),使得abs(mid-l)==abs(mid-r),且l<mid<r; 可以枚举每个数作为中间项,然后O(n)的判断是否存在这样的数对(l,r); 但这是O(n^2) 阅读全文
posted @ 2019-12-12 16:56 神之右大臣 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题我们首先会想到优化建图; 线段树优化建图?不对不对; 那么就具体问题具体分析: 浅显的性质:有可能选择的边一定存在于按x或y排序的相邻的两个点之间; 那么O(n)建图,然后dijkstra就好了; #include <bits/stdc++.h> #define inc(i,a,b) f 阅读全文
posted @ 2019-12-10 19:53 神之右大臣 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 1.Huffman Tree(哈弗曼树) 1.1首先存在定义: 树的带权路径长度:树中所有叶节点的权值乘上其到根的路径长度之和 构造一棵二叉树使其带权路径长度最小,称这样的二叉树为哈夫曼树。也叫最优二叉树 1.2 性质1:哈弗曼树是一颗满二叉树: 证明:如果不是满二叉树,我们就把儿子数为1的节点变为 阅读全文
posted @ 2019-11-10 15:31 神之右大臣 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 题面: 我们知道:相邻房间的犯人的宗教相同的方案数=总方案数-相邻房间的犯人的宗教不相同的方案数; 那么所有方案数是m^n; 我们假设第一个房间有m中取值方案,而对于每个房间(非第一个)都有m-1个取值方案,所以总方案是(m-1)^(n-1)*m; 那么答案就显而易见了; #include <bit 阅读全文
posted @ 2019-11-08 20:44 神之右大臣 阅读(142) 评论(1) 推荐(0) 编辑
摘要: 其实这个东西真的算自动机吗?好像还真的符合自动机的定义啊; 我将在下面用人话来定义序列自动机,并不像某度某科一样不说人话; 设一个字符集S,nxt[i][j]表示第i个位置往后第一个j元素出现的位置; 这个nxt数组可以O(n)的求出来,可以自行验证; for(int i=n-1;i>=0;--i) 阅读全文
posted @ 2019-11-08 20:20 神之右大臣 阅读(435) 评论(6) 推荐(0) 编辑
摘要: 题面: 小a是一名强迫症患者,现在他要给一群带颜色的珠子排成一列,现在有N种颜色,其中第i种颜色的柱子有num(i)个。要求排列中第i种颜色珠子的最后一个珠子,一定要排在第i+1种颜色的最后一个珠子之前。问有多少种排列珠子的方案。 输入格式 第一行一个整数N,表示珠子颜色数量第二行N个整数,分别表示 阅读全文
posted @ 2019-11-07 20:41 神之右大臣 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 题面 总体来说是一道从下往上的DP+贪心; 设f[i]表示将消息传给i,i的子树全部接收到所能消耗的最小时间; 那么对于i的所有亲儿子节点j,我们会贪心地先给f[j]大的人传递,然后次大..... 可以证明,这样的答案一定是最优的; 然后f[i]=max(f[i],f[j]+cnt); 总的时间复杂 阅读全文
posted @ 2019-11-06 20:11 神之右大臣 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 题面 对于每个点,我们可以用一次dfs求出这个点到以这个点为字树的最远距离和次远距离; 然后用换根法再来一遍dfs求出这个点到除这个点子树之外的最远距离; 显然的,每次的询问我们可以用向上的最大值加向下的最大值得到; 具体换根法的实现可以看下面的代码~; #include <bits/stdc++. 阅读全文
posted @ 2019-11-06 17:29 神之右大臣 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 题面 10%的数据,n ≤ 100, k = 0,w = 0。直接输出即可。(就是个完全匹配) 10%的数据,n ≤ 10, k≤ 20, 0 ≤ w ≤ 500。O(n!)枚举。(就是搜索啊~) 10%的数据,n≤ 15,k ≤ 20, 0 ≤ w ≤ 500。状压,fi,j表示处理了左边前i个点 阅读全文
posted @ 2019-11-06 17:15 神之右大臣 阅读(140) 评论(0) 推荐(0) 编辑
摘要: T1.[LNOI2014]LCA 给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。 有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z 阅读全文
posted @ 2019-11-05 19:44 神之右大臣 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题明显的一定要找到直径的具体路径,所以两遍dfs是比较好的选择; 第一问是一道弱智题吧? 主要难度全部分摊在了第二问; 其实不难,先找到任意一个直径; 对于任意一个在直径上的点: 设nxt[i]表示这个点的下一个位置,pre[i]表示这个点的上一个位置; ls[i]表示这个点到直径的左端点 阅读全文
posted @ 2019-11-05 16:03 神之右大臣 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题是一道数位DP的模板题; 因为窝太蒟蒻了,所以不会递推,只会记忆化搜索; 首先,咋暴力咋来; 将一个数分解成一个数组,这样以后方便调用; 数位DP的技巧:(用1~b的答案)-(1~a的答案)就是(a~b的答案); 那么对于每个数码i,我们做两次dfs(分别以a为上界和以b为上界); 设正 阅读全文
posted @ 2019-11-04 20:41 神之右大臣 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 先说一句题外话,有谁看到的第一眼看成了某站的知名up主夏日祭?题面夏至祭是一场迎接祖灵于夏季归来同时祈求丰收的庆典。村里的男人会在广场上演出冬之军跟夏之军的战争,夏之军会打倒冬之军的大将冬男,再放火将他连山车一起烧掉。谢尔吉斯村长已经选好了N个人参加演出,其中一些人负责演夏之军,另一些人负责演冬之军 阅读全文
posted @ 2019-11-04 20:16 神之右大臣 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题面 首先你要知道题问的是什么:使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度; 怎么做?线段树! 我们在线段树上维护两个东西:1.这个区间内斜率的最大值 2.从这段区间开头可以看到的区间内的所有楼房 初始化:对于每一个叶子节点,从这段区间头可以看到的楼 阅读全文
posted @ 2019-11-03 21:06 神之右大臣 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题比较显然地,是一道树形背包; 但是会有环,怎么办呢? 缩点!tarjan缩点! 然后在新图上跑树形背包就可以AC了 #include <bits/stdc++.h> #define inc(i,a,b) for(register int i=a;i<=b;i++) using names 阅读全文
posted @ 2019-11-03 19:58 神之右大臣 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题咋看都是无法从dp入手,那么就从数据结构入手!; 首先你要会权值线段树和线段树合并。 然后你要知道: 对于任意一个节点,交换左右子树对当前节点和前面的所有节点没有影响。 因为这是前序遍历:根节点->左子树->右子树。可以看到,交换左右子树对前面的节点无影响。 我们清楚,交换子树只会对该逆 阅读全文
posted @ 2019-11-01 20:33 神之右大臣 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 左偏树是用来快速地合并堆的 正常的堆是一颗完全二叉树,我们用笨方法去合并它: 假设我们要将x和y这两个小根堆合并,我们判断一下如果x的堆顶大于y的堆顶,就交换一下x和y,然后继续合并x的某个子孩子和y。 堆被人们所推广的原因就是因为它的时间复杂度比较稳定,根本原因是堆是一颗完全二叉树 但显然的:这样 阅读全文
posted @ 2019-11-01 19:34 神之右大臣 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 【问题描述】 Mark Douglas是一名优秀的锻造师。与他优秀的锻造水平不相符,他非常穷,以至于很多好刀都因为缺少素材缺少资金无法打造。 Mark把他有能力锻造的所有n种刀建成了一棵锻造树,除了第1种刀可以直接打造以外,其他的刀都只能从某一种刀加工而来。具体而言,第i种刀只能从第fai种刀加工而 阅读全文
posted @ 2019-10-31 19:14 神之右大臣 阅读(459) 评论(0) 推荐(0) 编辑
摘要: 模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一个大的搜寻空间内找寻命题的最优解。模拟退火是由S.Kirkpatrick, C.D.Gelatt和M.P.Vecchi在1983年所发明的。V.Černý在1985年也独立发明此演算法。模拟退火算法是解决TSP问题的有 阅读全文
posted @ 2019-10-30 19:48 神之右大臣 阅读(707) 评论(0) 推荐(0) 编辑
摘要: T1:首先你要发现,对于任意一个奇数i,i xor (i-1)=1; 那么我们可以将答案转化为统计有多少个1相互异或起来; 所以答案就那么几种; 如果你用的数位DP,只能说明你太高估day1T1了; #include <bits/stdc++.h> using namespace std; long 阅读全文
posted @ 2019-10-29 17:00 神之右大臣 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 这道题与2018年十二省联考中的异或粽子很相像,可以算作一个简易版; 因为这不需要可持久化; 也就是说求任意两个数异或起来的第k大值; 首先把所有数放进trie里。 然后二分答案,枚举每个数,相应地在trie上从高位开始跑,统计答案。 具体做法:当前跑到二进制第k位,已经确定了比k高的位的数字,使得 阅读全文
posted @ 2019-10-29 16:34 神之右大臣 阅读(534) 评论(0) 推荐(0) 编辑
摘要: 题面 GarsiaWachs算法专门解决石子合并问题: 设一个序列是A[0..n-1],每次寻找最小的一个满足A[k-1]<=A[k+1]的k,那么我们就把A[k]与A[k-1]合并,并向前寻找一个第一个超过他们的和的数,把这个数插入到他后面; 阅读全文
posted @ 2019-10-29 15:44 神之右大臣 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 题面 我们无论怎么走,都是要从此点沿最短路径走到终点,所以我们以n为原点跑两边dijkstra就可以了; 而抱怨数可以根据之前跑出来的东西新建一个图,然后跑最短路就好了; 阅读全文
posted @ 2019-10-28 11:28 神之右大臣 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题可以理解为是一个分层图,也可以理解为是二维的SPFA dis[i][j]表示到达i这个点速度为j的最短路 然后跑已经死了的SPFA就好了; 阅读全文
posted @ 2019-10-28 10:54 神之右大臣 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 题面: 一个长度为 n 的序列,对于每个位置 i 的数 ai都有一个优美值,其定义是:找到序列中最长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] 中位数为 ai (我们比较序列中两个位置的数的大小时,以数值为第一关键字,下标为第二关键字比较。这样的话 [l, r] 的长度只有可能 阅读全文
posted @ 2019-10-27 14:38 神之右大臣 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 题面 下面数列的第 n 项: f(0) = a0 ,f(1) = a1 ,f(2) = a2 f(n) = b×f(n − 1) + c×f(n − 2) + d×f(n − 3) + e (n ≥ 3) 输入格式 包含 1 行,共 8 个整数:a0、a 1、a 2、b、c、d、e、n。 输出格式 阅读全文
posted @ 2019-10-27 14:24 神之右大臣 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题由于问最大值最小,所以很容易想到二分,但怎么验证并且如何实现是这道题的难点; 首先我们考虑,对于一个军队,尽可能的往根节点走(但一定不到)是最优的; 判断一个军队最远走到哪可以树上倍增来实现; 但是,这并没有结束,因为可能这颗子树的军队会去另一个军队; 我们先找出所有以根节点的子节点为根 阅读全文
posted @ 2019-10-25 19:30 神之右大臣 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 1.欧几里得求gcd 2.扩展欧几里得求解线性方程 首先根据Bezout定理,对于任意的a,b:ax+by=gcd(a,b); 然后根据欧几里得求gcd的方法构成等价方程,在递归的同时求出x,y; 另外一种写法:(不只是long long 的事情) 3.扩展欧几里得求逆元 这其实与上面的求线性方程的 阅读全文
posted @ 2019-10-24 19:56 神之右大臣 阅读(160) 评论(0) 推荐(0) 编辑