随笔分类 - 知识点
摘要:传送门 解题思路 区间dp:一般dp[i][j]表示区间i...j的答案,这个答案可以从某个或某些小区间转移而来。 大部分题的解法就是先枚举做外层循环len,表示区间长度,然后枚举区间左端点i,然后计算出右端点j,然后枚举i到j中的所有断点,根据dp[i][k],dp[k+1][j]计算出dp[i]
阅读全文
摘要:传送门 解题思路 主要思想是断环为链。 把数组开双倍大小,然后在n后面接上1~n-1,这样的好处是所有的长度为n的链都包含在内。 然后对于每一个长度为n的区间i......j,我们要做的是判断是否存在一个点k,使得i.....k的和小于0。 对的,和! 前缀和! 然后要找一个最小的前缀和! 长度为n
阅读全文
摘要:传送门 真是一道毒瘤题(弄了接近一下午+一晚上) 解题思路 先对所有的点按照a-b-c的优先值从小到大排序,然后去重(注意要记录每一个有几个重复的,因为条件是小于等于,所以重复的对答案也有影响),然后再按照关键字b归并排序,排序过程中,用树状数组记录c值,每一次合并时如果是右半部分的b值较小,答案就
阅读全文
摘要:传送门 解题思路 按照x的大小分治。 然后归并排序。 归并时按照y值。 然后步入难点: 假设我们已经求出了左半部分的最近距离和右半部分的最近距离,两个距离的较小值设为d。 然后我们把划分左右两部分的中线的x值定为midx。 很显然,最终的答案有三种情况: 两点在左半部分 两点在右半部分 一个点在左边
阅读全文
摘要:传送门 解题思路 就是一道树形dp的模板。 偷得课件QAQ: 这个题用dp[i][0]表示i不去时以i为根的子树的最大快乐指数, dp[i][1]表示i去时以i为根的子树的最大快乐指数。 然后转移方程就很容易写出来了。见代码。 最后要注意输入的u,v是v是u的上司。 AC代码 1 #include<
阅读全文
摘要:传送门 匈牙利算法 匈牙利算法(别名“找对象游戏”),就是给你一个二分图,求最大匹配。 最大匹配就是做多能连多少条边。 我们把这个抽象的概念转化成现实问题——找对象。 男女两组,男生A组,女生B组,每一个男生都有自己喜欢的女生(可能不止一个),作为上帝的你,尽可能的让更多的人成为男女朋友。 怎么做呢
阅读全文
摘要:最长上升子序列 传送门 题意 对于给定的一个n个数的序列,找到它的一个最长的子序列,并且保证这个子序列是由低到高排序的。 例如,1 6 2 5 4 6 8的最长上升子序列为1 2 4 6 8。 基本思路 非常显然,这类题用dp求解。 dp[i]表示已i为结尾的最长上升子序列的长度,首先枚举每一个末尾
阅读全文
摘要:传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等)。 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样QAQ 看一看这道题我们用r[x]=0表示是x和f[x]是同种生物,等于1表示x吃f[x],等于2表示
阅读全文
摘要:传送门 这是一道典型的单调栈。 题意理解 先来理解一下题意(原文翻译得有点问题)。 其实就是求对于序列中的每一个数i,求出i到它右边第一个大于i的数之间的数字个数c[i]。最后求出和。 首先可以暴力求解,时间复杂度o(n^2)显然TLE。 然后就是用单调栈来做。 单调栈 单调栈就是维护一个栈,使得栈
阅读全文
摘要:传送门 解题思路 看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求? 注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方案被认为是相同的。 这里就用到了一种基于dp的dp。 我们用a[i]存原来的数,
阅读全文
摘要:传送门 一道裸的错排问题 错排问题 百度百科上这样说 就是对于一个排列,每一个数都不在正确的位置上的方案数。n 个元素的错排数记为 D(n)。 公式 D(n)=(n−1)∗(D(n−2)+D(n−1)) 推出公式(感性) 对于第n个数,放在k位置上。 而第k个数有两种情况: 当第k个数放到n位置时,
阅读全文
摘要:传送门 解题思路 用并查集f存朋友关系,一个数组e存的是敌人关系,是一个辅助数组,所以叫做种类并查集。 当p和q是朋友时,直接合并,但是当是敌人时,需要一些操作。 当p还没有敌人时(即p的敌人是自己),直接e[p]=q; 否则就把p的敌人和q变成朋友,这也就是变相把p和q变成敌人。 当然,对q也是如
阅读全文
摘要:题目链接 https://www.luogu.org/problem/P5367 什么是康托展开 百度百科上是这样说的: “康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。” “康托展开是一个全排列到一个
阅读全文
摘要:众所周知,背包问题很重要。 相信大部分人写的背包都是先枚举的物品,其实部分背包也可以先枚举容积。 例如01背包,在二维未优化时,可以先枚举j,在枚举i,不影响到结果。 还有完全背包(物品有无数个),优化后也可以先枚举j。 其实先枚举i、j本质上都是一样的,需要注意的其实就是在计算这一个状态时,以前的
阅读全文
摘要:传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数。 因为有一个类似于去重的操作,所以就有一个数组记录一下is[i]表示编号为i的贝壳上一次出现的地方,每一次更
阅读全文
摘要:c/c++中获取字符串长度。有以下函数:size()、sizeof() 、strlen()、str.length();一、数组或字符串的长度:sizeof()、strlen()1、sizeof():返回所占总空间的字节数(1)、对于整型字符型数组(2)、对于整型或字符型指针2、strlen():返回
阅读全文
摘要:题目链接 https://www.luogu.org/problemnew/show/P3368 树状数组 最基础的用法:https://www.cnblogs.com/yinyuqin/p/10961243.html 在这里实现的是区间加,单点查询。 一说到区间加,我们就会想到差分序列,关于差分序
阅读全文
摘要:前缀和序列 所谓前缀和数组,就是从第一个元素到当前元素的和。假设这个前缀和数组为d[],原数组为a[],那么d[ i ] = a[ 1 ]+a[ 2 ]+a[ 3 ]+...+a[ i-1 ]+a[ i ]。在实际应用中,可以直接d[ i ]=d[ i-1 ]+a[ i ]。 它主要用于查询一段区间
阅读全文
摘要:题目链接 https://www.luogu.org/problemnew/show/P3374 树状数组 树状数组最基本的就是求区间和。 维护: 空间复杂度:O(n) 时间复杂度(区间和,单点修改): 修改:O(logn) 查询:O(logn) 用c[i]表示(i-lowbit[i]+1,i)区间
阅读全文
摘要:原理 0x的意思其实是十六进制,后面加的数其实就是一个十六进制数。 在十六进制中,我们知道a代表10,b代表11,c代表12,d代表13,e代表14,f代表15。 所以3f3f3f3f这个数用十进制数表示其实就是1061109567,是int中的一个比较大的数。而且在程序中,经常要相加,而这个数*2
阅读全文

浙公网安备 33010602011771号