
51Nod
linkfqy
A link to FQY.
展开
-
【斐波那契数列】51Nod 1350 斐波那契表示
题面在这里一道神奇的数学题……首先需要了解:将一个数每次减去最大可减的斐波那契数,一定是最优的方案之一以下用fif_i表示斐波那契数列的第i项则有: Gfi−1=Gfi−1−1+Gfi−fi−1−1+fi−fi−1⇒Gfi−1=Gfi−1−1+Gfi−2−1+fi−2G_{f_i-1}=G_{f_{i-1}-1}+G_{f_i-f_{i-1}-1}+f_i-f_{i-1} \\\Rightar原创 2017-09-13 21:18:55 · 896 阅读 · 0 评论 -
【DP】51Nod 1274 最长递增路径
题面在这里好题啊……肯定会有这样的DP:fi,jf_{i,j}表示终点是i,最大边权为j的最长路径然而就算离散后还是O(ne)O(ne)的其实可以直接对边排序,边权的那一维就可以省去了Tips:以后遇到边权递增的题目,第一想到对边排序值得注意的是,边权相同的边必须同时转移,不能有先后修正的关系示例程序:原创 2017-10-21 10:28:31 · 680 阅读 · 0 评论 -
【乱搞】51Nod 1622 集合对
题面在这里数学题,看懂了就很好做。下面给出证明:首先,集合的异或操作是可以类比位运算的异或操作的。对于一个集合AA,可以给全集的每个元素赋一个01变量,表示是否在集合AA中出现过这样A xor BA\text{ xor }B其实就是两个二进制数异或了然后这个东西是满足交换律和结合律的然后: (P xor A) xor (Q xor B)=A xor B(P xor Q) xor (A xor B)原创 2017-10-29 20:41:37 · 731 阅读 · 0 评论 -
【贪心+优先队列】51Nod 1053 最大M子段和 V2
题面在这里其实很简单……首先有一个贪心想法就是把所有的正数都取来但是这样子段数可能会超过m那么有以下两种方法减少子段数:删去一个正的子段取一个负的子段,并将相邻两个正子段合并然后把这两种操作都扔到优先队列里,每次取就好了示例程序:原创 2017-10-30 15:26:14 · 915 阅读 · 0 评论 -
【主席树】51Nod 1175 区间中第K大的数
题面在这里主席树裸题……联赛快来了还是练练手速吧示例程序原创 2017-10-30 16:46:01 · 875 阅读 · 0 评论 -
【DFS序+树状数组】51Nod 1681 公共祖先
题面在这里稍稍转化一下题面就可以得到,其实是求 ∑x=1nC2s\sum_{x=1}^n C_s^2 其中s是在两棵树中都是x的后代的节点个数如何统计s呢?其实也很简单先对一棵树处理出DFS序,然后遍历另一棵树时,不断插入当前节点,统计子树区间内的个数即可示例程序:原创 2017-10-30 19:52:32 · 778 阅读 · 0 评论 -
【二分+曼哈顿距离】51Nod 1671 货物运输
题面在这里首先想到二分,设当前答案为SS,传送门的两个端点为x,yx,y则对于ti−si>St_i-s_i>S的路径,必须满足: |x−si|+|y−ti|≤S\left| x-s_i \right|+\left| y-t_i \right|\le S 这个可以理解为曼哈顿距离而到某个定点(si,ti)(s_i,t_i)的曼哈顿距离相等的点构成的集合是一个正方形相当于判断所有正方形是否有交示原创 2017-10-23 07:19:23 · 702 阅读 · 2 评论 -
【状压DP】51Nod 1779 逆序对统计
题面在这里很水的状压DP……fsf_s表示s这个状态的最大逆序对数显然按照顺序去处理M个数,用于修正后面的转移的权值其实就是算有几个比当前大的示例程序:原创 2017-10-31 09:32:01 · 1146 阅读 · 0 评论 -
【树形DP】51Nod 1500 苹果曼和树
题面在这里定义fi,0/1f_{i,0/1}表示处理到i子树,i所在的块是否含有黑色点那么对于fi,1f_{i,1},可以由fi,1f_{i,1}和fi,0f_{i,0}得到对于fi,0f_{i,0},只能由fi,0f_{i,0}得到示例程序:原创 2017-10-23 20:11:44 · 818 阅读 · 0 评论 -
【二分+Two Pointers】51Nod 1686 第K大区间
题面在这里首先需要知道这样一个性质:给一个区间加入元素,众数的个数只会变多不会变少然后就可以想到二分答案只需要验证众数的个数大于等于mid的区间的个数是否大于等于K就好了这个可以用Two Pointers\text{Two Pointers}算法来实现:对于区间的起点i,若有终点j满足该区间众数的个数大于等于mid,则更大的j也满足而i往右枚举,只会使j更往右示例程序:原创 2017-10-24 07:54:40 · 618 阅读 · 0 评论 -
【二分+正序对】51Nod 1711 平均数
题面在这里考虑二分答案,其实就是求平均值大于等于mid的区间个数写出来就是∑air−l+1≥mid\frac {\sum a_i} {r-l+1}\ge mid所以每一项减去mid,写成前缀和就是Sr−Sl−1≥0S_r-S_{l-1}\ge 0然后就是求正序对了示例程序:原创 2017-10-25 15:28:13 · 719 阅读 · 0 评论 -
【组合数】51Nod 1627 瞬间移动
题面在这里考虑枚举移动的步数ii那么答案就是 ∑i=1i<min(n,m)Ci−1n−2⋅Ci−1m−2\sum_{i=1}^{i<min(n,m)}C_{n-2}^{i-1}\cdot C_{m-2}^{i-1}示例程序:原创 2017-10-25 16:42:07 · 828 阅读 · 0 评论 -
【概率DP】51Nod 1398 等公交
题面在这里考虑fif_i表示用了i时间,用了任意辆车概率之和然后就好了示例程序:原创 2017-11-04 16:17:01 · 591 阅读 · 0 评论 -
【贪心构造】51Nod 1385 凑数字
题面在这里乱搞就好了每次发现数字不够了就在最后添一个需要的数字示例程序:原创 2017-10-21 08:56:41 · 526 阅读 · 0 评论 -
【数学】51Nod 1421 最大MOD值
题面在这里有个想法就是先排序,对每个aia_i分别找[ai,2ai−1],[2ai,3ai−1],[3ai,4ai−1]…[a_i,2a_i-1],[2a_i,3a_i-1],[3a_i,4a_i-1]\dots中的最大值复杂度对吗?其实这个就是调和级数: ∑i=1n1i\sum_{i=1}^n\frac 1 i 可以证明这个是O(ln n)O(ln\space n)的所以总复杂度是O(n⋅原创 2017-10-21 07:56:25 · 709 阅读 · 0 评论 -
【反序表+DP】51Nod 1020 逆序排列
题面在这里科普一下关于反序表的知识:一个1到n的排列的反序表第 ii 位表示排列中 ii 的左边有几个比 ii 大的。反序表每位的取值范围:[0,0],[0,1],[0,2],[0,3]...,[0,n−1][0,0],[0,1],[0,2],[0,3]...,[0,n-1]排列和反序表是一一对应的关系。反序表每位相互独立。然后这题就是傻逼DP了示例程序:原创 2017-09-10 15:21:47 · 714 阅读 · 0 评论 -
【数学结论】51Nod 1674 区间的价值 V2
题面在这里很容易发现,一个序列的前缀and/or值可分为log(V)log(V)块其中V是序列中元素的最大值然后这题就很好做了枚举区间的右端点i,同时维护每一个块的范围和值显然有and块和or块两种分开维护那么i往后推一个,其实就是把每个块的值and/or上当前位置,再加上单点i然后合并相邻且值相等的块扫一波统计答案即可示例程序:原创 2017-09-10 15:31:02 · 751 阅读 · 0 评论 -
【贪心】51Nod 1241 特殊的排序
题面在这里这题没什么好说的,直接贪心就可以了可以发现在最优方案中,没有被移动过的数字一定是连续单调增的那么直接刷最长的连续单调增序列就好了示例程序:原创 2017-09-02 10:27:05 · 377 阅读 · 0 评论 -
【DP】51Nod 1052 最大M子段和
题面在这里显然是DPfi,jf_{i,j}表示前i个位置,分了j段的最大值则有: fi,j=Max{fi−1,j,fk,j−1}+aif_{i,j}=Max\{ f_{i-1,j},f_{k,j-1} \}+a_i k其实不用枚举,直接带着刷最大值就好了示例程序:原创 2017-09-02 10:37:04 · 806 阅读 · 0 评论 -
【置换群】51Nod 1125交换机器的最小代价
题面在这里ZZK说这是傻逼题但是我觉得好难啊显然,要使最终归为有序,必定构成若干个置换群对于每个置换群有两种方案:找群里最小的点,交换一圈群里最小点与群外最小点交换,交换一圈,再换回来然后就没有然后了示例程序:原创 2017-09-19 20:59:17 · 875 阅读 · 0 评论 -
【背包+阈值优化】51Nod 1597 有限背包计数问题
题面在这里显然,对于小于n√\sqrt n的物品可以直接对每个背包大小记前缀和对于大于n√\sqrt n的物品直接改定义为“选了i个物品,背包大小为j”即可很好转移吧……示例程序:原创 2017-10-07 19:21:20 · 651 阅读 · 0 评论 -
【分治计数|单调栈】51Nod 1215 数组的宽度
题面在这里用单调栈分别维护maxmax和minmin的”势力范围”显然很好做其实分治的话就更简单了只需要记录mxmx和mnmn以及它们的前缀和就好了分类讨论一下,这是分治计数的核心示例程序:分治计数:原创 2017-09-21 21:50:34 · 646 阅读 · 0 评论 -
【单调栈】51Nod 1423 最大二“货”
题面在这里考虑枚举区间的次大值。那么可以维护一个递减的单调栈,里面都是可能的最大值然后第一个比当前大的值就是区间的最大值,更新答案就好了倒过来再做一次示例程序:原创 2017-10-27 20:34:45 · 697 阅读 · 0 评论 -
【贪心】51Nod 1615 跳跃的杰克
题面在这里其实很SB的题目……因为每次跳跃后,长度就增加1,所以往左跳一次,右跳一次就相当于移动了一个单位肯定会有一个想法,就是不断往一个方向跳,然后一个单位一个单位地移动但是还不是最佳答案考虑跳过n到了x则x−nx-n是偶数就可以将之前某次跳跃反向否则就继续跳,直到x−nx-n是偶数示例程序:原创 2017-10-20 19:09:09 · 886 阅读 · 0 评论 -
【贪心】51Nod 1476 括号序列的最小代价
题面在这里这题不太容易想到……其实还是很简单的先把所有的?换成’)’,然后一路扫过去如果不符合配对的要求就在之前的?中找修正代价最小的用优先队列维护一下,然后就好了示例程序:原创 2017-10-20 20:12:46 · 854 阅读 · 0 评论 -
【容斥】51Nod 1829 函数
题面在这里其实很简单……我太菜了……想了好久……因为题目要求B中所有元素都至少被覆盖一次所以枚举有几个元素没有被覆盖(这是容斥的基本套路)答案就是: ∑i=0mCim⋅(m−i)n⋅(−1)i+1\sum_{i=0}^m C_m^i\cdot (m-i)^n\cdot (-1)^{i+1}示例程序:原创 2017-10-28 19:04:45 · 809 阅读 · 0 评论 -
【单调栈】51Nod 1349 最大值
题面在这里最大值相关题目求控制区间已经是很明显的套路了啊喂枚举当前点为区间的最大值,用单调栈求出范围,两边一乘就好了示例程序:原创 2017-10-28 21:15:47 · 795 阅读 · 0 评论 -
【莫比乌斯反演】51Nod 1678 lyk与gcd
题面在这里一开始不会做,在Lynstery大佬的点拨下秒懂了……首先推柿子: ∑j=1n[gcd(i,j)=1]aj⇒∑j=1naj∑d|(i,j)μ(d)⇒∑d|iμ(d)∑d|jaj\sum_{j=1}^n[gcd(i,j)=1]a_j \\\Rightarrow \sum_{j=1}^n a_j \sum_{d|(i,j)} \mu(d) \\\Rightarrow \sum_{d原创 2017-11-28 20:18:23 · 821 阅读 · 0 评论