好题笔记
yryryryrr
「最低限度都没有做到的人,没有资格去羡慕有才能的人。无法成功的人正是因为想不到成功的人花费了多少心血,才无法成功的啊!」——雪之下雪乃
展开
-
P4071 [SDOI2016]排列计数(错排)
前言其实就是一个个错排公式和组合数的应用,感觉自己推的有的费劲错排公式首先考虑一下递推式子。首先假如说第一个放的不自己,那么第一个数就有n-1种方案。随便拿出来一种去看。假如说第二个放的是第一个的是不是就是对d[n−2]d[n-2]d[n−2],也就是对n-2个数做错排。假如不是,是不是就是对剩下的n-1个做错排 , 也就是d[n−1]d[n - 1]d[n−1]。所以说d[i]=(i−1)∗(d[n−1]+d[n−2])d[i] = (i-1) * (d[n-1] + d[n-2])d[i]原创 2021-11-21 18:18:29 · 363 阅读 · 0 评论 -
[ZJOI2010]排列计数
前言计数问题解决问题转化首先这题单纯的去看题目的意思其实很难的,之后我们就去转化一下问题,iii 和 i/2i / 2i/2可以让你想到啥,是不是二叉树,那么f[i]>f[i/2]f[i] > f[i/2]f[i]>f[i/2]这是啥,是不是小根堆,其实不用知道这是个小根堆也可以,只要可以看出来这是一个二叉树就好了。正解之后我们发现是不是1只可以放在root上,之后是不是左右儿子是互相不影响的,之后我们就去分开考虑。左儿子给l个,那么剩下的是不是只用放到右儿子是不是就好了。a原创 2021-11-18 15:41:22 · 282 阅读 · 0 评论 -
P2261 [CQOI2007]余数求和
知识整除分块加上取模转换解首先a%b = a - [a/b] (下取整) * b没问题吧之后对于∑i=1nkmodi\sum_{i=1}^{n}kmodii=1∑nkmodi是不是就可以化成n∗k−∑i=1ni∗k/in * k - \sum_{i=1}^{n} i*k/in∗k−∑i=1ni∗k/i 下取整之后右边的那个是不是整除分块加上等差数列,是不是就解决了coding time#include<bits/stdc++.h>using namespace std原创 2021-11-17 21:52:06 · 76 阅读 · 0 评论 -
P7447 [Ynoi2007] rgxsxrs毒瘤数据结构
前言首A黑题,虽然离不开题解,但是还是很激动我的想法首先我是想取维护区间的max,之后假如区间max小于x,那么我们就不用去递归了,之后如果大于就去分别处理,但是可以发现这个做法虽然也有均摊,但是当x很小时候无异于暴力,所以还是要优化正解首先是十分有用(毒瘤 )的不均匀分块,我们取K(一个基数),之后按照【1,k)【k 2 , k 3) …这样去分块,之后就可以最多分出来 logkai\log_k ailogkai个块。我在每一个块上开一个线段树,之后线段数上维护区间最大值,区间和,区间原创 2021-11-13 21:38:31 · 334 阅读 · 0 评论 -
数据结构刷题合集
一P4113 [HEOI2012]采花这是一个求一个区间出现次数大于等于二的数字的个数这个的思路其实十分的的人类智慧,首先我们不难想到把所有的操作离线下来,之后就可以把复杂度降低了,之后就考虑一下如何去问维护信息,首先我们可以考虑前缀和,也就是参考HH的项链那道题,我们对于每一个color记录一下上一个出现的位置last1,之后假如再次出现就给上一个位置那里加一这里不直接给第二次的位置加一是因为,考虑223这个序列,假如查询(2,3) ,就会出问题。之后我们发现还有可能出现三次,这个假如像之前处理就原创 2021-10-23 13:15:25 · 296 阅读 · 0 评论 -
动态规划刷题合集
P2051 [AHOI2009]中国象棋这是一个十分不错的区间计数dp首先我们会发现这个有两个维度,所以显然要降维,所以考虑一下把一行的状态进行压缩,也就是看一看可不可以把一行进行合并操作,于是我们就可以发现加入把一行看成一个,那么每一列最多只可以放两个,每一行可以增加两个,所以就可以设计一下状态dp[i][j][k]表示放到第i行,有j列有一个棋子,有k列有两个棋子的方案数,所以就可以很顺利的感觉这个转移方程是要分类讨论的一。一个子都不放所以说dp[i][j][k] = dp[i-1][j][原创 2021-10-22 20:52:03 · 138 阅读 · 0 评论 -
配对统计
前言这真的是一道好题,随机抽题抽到了这个它,对于树状数组和排序的理解又上一层了题解首先我们可以发现这个好的配对要求的是这两个树相差最小,之后假如我们排好序就可以发现这个配对只可以在左右两边那么分类讨论一下,无非是:左右之差相等,左边大,右边大。这样我们是不是就可以在nlogn的时间内求出所有好的配对的个数,之后所有的询问假如说我们一个一个暴力的扫过去,复杂度还是会炸,会多一个n,那么我们去转化一下一个询问区间(l,r)的配对个数 = r以前可以的 - l-1以前的可以的这是啥,是不是区间前缀原创 2021-10-12 20:39:16 · 140 阅读 · 0 评论 -
P3523 [POI2011]DYN-Dynamite
前言这道题是一个树上二分的题,其实很有思维量的思路首先这是一道让选择m个节点,每一个点到关键节点的距离的最小值中的最大值最小化的一道题目首先第一个最小值就是每一个选定节点到最近的关键节点的距离,其实不用太在意,之后就是最大值最小化,这显然是二分答案的一道题,所以考虑二分一个mid,看看可不可以用mid的距离去覆盖全部的关键节点,之后就是考虑这个checkcheck首先我们可以用覆盖的思想去理解这道题,就是每一个选定节点可以覆盖全部的关键节点就是一个true,那么我们就用两个数组f[x] --原创 2021-10-03 17:16:48 · 102 阅读 · 0 评论 -
[HEOI2016/TJOI2016]排序
前言这是一道思维好题,也告诉了我二分答案写不好真的也会送进AFO思路首先这个操作是对于一个数列,我们会对于一个l,r的区间进行升序or降序的操作,问几次过后q位置上的数是几。这个其实暴力很好想,但是时间复杂度显然是不对的,之后我们就去考虑一下对于一个0,1串的操作是如何的,首先我们是将这个区间有几个1给求出来,之后我们就要对于这个区间进行0,1赋值是不是就好了,那么推广一下就是最终的结果首先二分答案,所有大于等于mid的看成是1,小于的是0,之后就是进行区间赋值的操作,最后就是看看q位置上的是1/原创 2021-10-02 18:43:07 · 78 阅读 · 0 评论 -
NOIP2018 赛道修建
前言简直了,又是一道看着题解做出来的题,我感觉我在考试时根本写不出来答案,哎部分分这也是我可以写出来的啦m==1就是去求树的直径,简单树退化成链这也不是很难想,其实就是二分+链上子段和就是一直找下去,如果cnt>=mid就统计一次答案,如果最后统计出来的答案比m大就l=mid,要不然就r=mid-1(这里二分答案)菊花图这其实就是正解的思路指引首先考虑二分答案(显然吧),之后呢,我们是不是就要去check,如何check,对于所有val>mid的边,显然直接统计就好了,要是原创 2021-09-27 20:44:39 · 247 阅读 · 0 评论 -
第七次noip模拟赛后总结加改错
前言还是第一道签到题没有做出来,但是感觉这一次的考试还不错,不过还是可以发现问题,其实就是对于已经学过的东西记忆十分不好,所以在清明节的时候我打算回顾一下已经学过的代码第一题这其实是一道萌萌题,显然假如一个串的长度为i,i>k ,那么假如前面k个都可以整除2^k,那么这个串必然也可以整除,这是因为(10的k次方可以被2的k次方整除,这个也比较好理解),所以只用就去对于每一个i,只用去看每一个前k为的串是不是满足被2的k次方整除,之后合并就欧克,复杂度估计是nk,符合要求int main(原创 2021-09-06 21:06:13 · 81 阅读 · 0 评论 -
noip第四次模拟赛赛后总结
前言感觉最近越来越会骗分了,但是就是各种的性质都有一点看不出来,简单的题目可以骗大部分得分,但是标答总是近在咫尺却拿不上第一题https://www.luogu.com.cn/problem/T197838这是一道简单题,想一想就可以理解首先去理解字典序最小,也就是要在前面的数字尽可能的少,那其实就可以想到贪心了(但是考试的时候并没有想到这个简简单单的方法,哎。。)假如第一个数不是1,那么我们是不是就在前面一直插入1,这样的构造一定是“有趣”的。但假如不是,其实就是另外的想法,假如这一个a[i原创 2021-08-30 20:28:30 · 59 阅读 · 0 评论 -
P5536核心城市
这道题是一个树的直径的一道变异板子题。首先去分析题目,每一个点到核心城市的距离是它到其中某一个的最小值,二我们要去找的最小值,就是在k个城市不断变化的过程中的所有距离的最大值的最小值其实题目会让你想到erf,但是没有办法去做,可以想到二分的复杂度严重超标,所以我们去看一看题目的性质,所有点距离的最大值,嗯。。。是不是不难想到这个最大值一定是在直径上,因为假如有一个点到某一个点的距离大于直径上的点,那么这个点一定是在直径上。所以我们就可以想到去在直径上做文章,这k个核心城市的核心是不是一定在这条直径的中原创 2021-08-26 20:54:42 · 91 阅读 · 0 评论 -
洛谷刷题笔记
刷题笔记这里呢会有一些我认为比较提供思路,但是又不是特别重要的内容p2700这个就是一个正着作难,反着好做,其实和星球大战很想,就是最大生成树的思路,每一次拿出的边看看左右端点的祖先是不是敌人,注意这里一定要是祖先,假如我们只对单独点去进行判断,那么在一堆我方点连在一起后,有连了一个敌人,那么这一个链都不可以连敌人了,所以一定是对于祖先的操作,最后并查集维护就好。...原创 2021-08-21 20:32:21 · 171 阅读 · 0 评论 -
CF106C Buns动态规划解决多重背包
bunsCF106C这是一道可以用背包来做(但是我不会),所以直接来了dp,这题我们读完可以很轻松的发现,做包子的顺序和我们所得到的收益无关,并且状态的思考其实也是显而易见,dp[x][y] 做前x种包子话y面包所得收益的最大值,至于另外一个馅料的维度我们完全可以用一个小循环去枚举,不用单放到状态里,那么动态转移方程是不是也就显而易见了,dp[x][y]=max(dp[x-1][y-k消耗]+收益k),k自然就是做这个包子的数量,至于对于馒头我们完全可以在枚举dp找答案时候加入就ok了,最后代码如下原创 2021-08-06 16:22:18 · 93 阅读 · 0 评论 -
CF245H
CF245H好题笔记这是一道计数和记忆化搜索的好题,算是我直接用这道题来讲这两个知识点。记忆化搜索: 我们这题一眼看起来有点mancher的感觉,但是其实这道题并不是mancher,而是道计数dp,我们其实可以一下子就像出来状态dp[x][y] 从x到y的回文子串的个数,那么通过容斥原理我们可以知道dp[x][y]=dp[x+1][y]+dp[x][y-1]-dp[x+1][y-1] +if(x==y) 这个还是很容易想出来的一个转移方程,至于状态的想法其实直接就是计数dp的感觉,转移方程就是在草稿原创 2021-08-06 15:02:06 · 86 阅读 · 0 评论 -
CF1061C Multiplicity
好题笔记CF1061C Multiplicity这是一道用滚动数组来去优化时间和空间的dp题目,题面就不加以解释了,直接上正解。对于这种取数的dp其实状态都是套路,第x个成为子集里第k个数与否,可以就dp[x][k]=dp[x-1][k-1]+1,如果不可以就dp[x][k]=dp[x-1][k-1],这个转移方程好去想出来,但是不论是二维数组的空间还是两层循环的时间都不可以,所以我们呢发现dp的状态只和上一个状态有关,所以可以用滚动数组来去优化空间,并且我可以在每一个数被枚举到的时候找出他的所有因数原创 2021-08-06 11:46:12 · 65 阅读 · 0 评论 -
跳房子
好题笔记跳房子这一题是一可以说是二分答案的一个经典应用,想来讲一下不加优化的版本,也就是可以的一半的分。首先我们看到了最少的g,那么我们是不是就想到了二分答案,我们找出它可以到达的左端点(最开始赋值为1),之后找出可以到达的右边最大值(注意这里是max(d,a[n].z),因为有可能最开始就一下跳出去了),然后二分他,mid=(l+r)>>1之后就开始判断,只要(l,mid)可以那么我们一定就去找更小的,如果不可以我们去找最大的,至于判断也很简单,我们发现肯定这一个格子是从上一个取得得分最原创 2021-08-05 12:04:10 · 115 阅读 · 0 评论 -
星球大战
好题笔记星球大战 洛谷P1197一道利用并查集去确定图里面连通性的问题。看完题目,其实没有什么想法,最初先用树剖来操作,后来发现难以进行( 那么现在来正解。我们既然去删点很难,那么我们为什么不考虑考虑去重新修建呢,把每一次的操作离线处理,之后从最后一个往前去修,每一次我们用并查集去判断连通,只要修完之后多出来的边使两个集合连通,那么total–,最开始我们设每一个点都是独立的,也就是total=n-k(这里我们先把全都毁掉的结果算出来),然后就是类比的操作,最后把得出的total倒叙输出就OK了启原创 2021-08-04 13:50:12 · 65 阅读 · 0 评论 -
火烧赤壁
好题笔记三火烧赤壁一道很好的离散化题目,对于刚接触离散化的人来说可能有一点点难,首先这一题我们是可以用n^2的复杂度跑的,但是我们发现数轴的下标太大了,所以我们呢就想到了让下标离散化,我们知道在每一个关键点中间其实都是可以一起完成的,所以我们就用一个c数组先完成离散化的操作,之后每一个起点和终点中间的点我都把他打上标记 ,(注意这是已经是离散化好的点),最后每一个关键点管的是他到下一个关键点之前的那些,所以只需一波暴力统计就可以了。代码如下#include<bits/stdc++.h>u原创 2021-08-03 23:13:15 · 188 阅读 · 0 评论 -
Cdq分治
学习笔记Cdq分治其实这一个是对于多维数据的一个分治,我们用二维为例子,我们先将一维进行排序,之后我们对第二维进行分治时候,我们就可以保证前面的第一位度一定小于后面二第一维度,然后就用第二维度去进行答案的累加就OK了例题来一道奶牛,一看到奶牛就知道是ACM的题了吧,描述就不加了,主要是思路虽然说这道题的数据如果打暴力也可以做出来,但是毕竟要不断进步,我们发现他的求和不仅有max又有绝对值,所以说我们没有办法直接分治,那么我们呢就可以用cdq分治,先排序声音,之后就只用对路程分治就欧克了。代码如下原创 2021-08-03 23:09:08 · 38 阅读 · 0 评论 -
合唱队列 最长上升子序列
好题笔记合唱队列我发现了我对于dp题只要他改了一点点我就想不出来,哎。这一道题其实和最长上升子序列是一个东西,我们只不过是多了一个中间的东西,那么我们就枚举中间,看看左边的上升子序列多长,右边的下降子序列多长,之后算一下要删掉去多少,之后取最小值就OK代码如下#include<bits/stdc++.h>using namespace std;int n;int a[10000];int lis(int l,int r){ int dp[10000]; memset(原创 2021-08-03 23:07:48 · 56 阅读 · 0 评论 -
尼克的任务 动态规划
好题笔记尼克的任务 动态规划这一道题对于我这一个刚刚接触dp的孩子来讲是很难的,但是他的思想我向来在这里缕一缕。首先我们发现这一道题我们可以进行转移的量只有两个,一个时间每一个是任务,所以我们会去猜要不要用二维数组,但是一下子就会发现太不合实际,所以我们就看看一时间为标准进行循环,首先我们需要知道每一个时间点是否会有任务开始,所以我们用一个ti数组来记录i时刻是否有任务(我知道可能还会有很多问题,待会再讲,记得这给得从后往前找,也是待会再讲),之后我们呢就要去找动态转移方程i时候无任务 f[i]原创 2021-08-03 23:06:41 · 73 阅读 · 0 评论 -
火柴排序
好题笔记火柴排序这道题其实有用数据结构来写的方法,但这一次我尝试的使用分治来写,我们首先发现其实ai-bi的平方就是要我们距离的绝对值之差最小,之后我们可以想到,先将两个数组都离散化,之后以一个数组为标准去调整另一个就OK了,那么我们就去想怎么办呢。假设a是我们的标准数组,b是要调整的数组(这里都是离散化好了的),那么我们就可以给a[i]认为是i将b数组中与a[i]相等的量赋值为i ,这样我们就可以理解为将b数组化为1234.。。。n的一个操作,这个其实就是逆序对的个数。代码如下:#include原创 2021-08-03 23:05:25 · 91 阅读 · 0 评论 -
移球游戏
好题笔记移动球游戏写下此篇,用来记录上一次noip我想了一小时还是没做出来的题(这一道题是一个典型的构造题,我个人觉得是近几年noip质量最高的题目之一,不仅思维量十分大,而且码量也不小,最主要的是像我这种算法十分匮乏的人也可以想出来。首先题目可以去洛谷找一下,我们直接开始上正解:一般构造题目都是从简单的开始想起,我们从只有两颜色的开始,我们要怎么做呢,先假设颜色为1,2 柱子为abc,我们不难发现第一步就是把a上面所有1的个数数出来,假设s个,之后把b上面的s个放到c上,之后把a上的1放到b,2原创 2021-08-03 23:04:10 · 196 阅读 · 0 评论