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