03 2021 档案

摘要:原题链接 考察:背包dp 思路: luogu题解的300分界线的题解本蒟蒻完全看不懂 .这篇题解是自己对第一篇题解的理解. 首项观察数据范围可以发现此范围MLE,需要压缩范围.根据极差<=3.可以将体积范围压成1~4. 但是!这道题不能把m根据vi压缩体积,根据vi的压缩不同,会导致m得到不同的取值 阅读全文
posted @ 2021-03-31 23:23 acmloser 阅读(115) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:单调栈 错误思路: 枚举滑动窗口大小,从头到尾计算.TLE O(n2) 正确思路: 根据a[i]对答案的贡献来计算,由题意得ans += (r-l)*a[i] 其中r是a[i]作为最大值的区间个数,l是a[i]作为最小值的区间个数.那么问题是如何计算区间个数. 首先明白单调栈和单调队 阅读全文
posted @ 2021-03-31 13:24 acmloser 阅读(61) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路 思路: 就是最短路....由贪心知道去曾今去过的点只会平白无故损失能量,所以要尽量不走旧点,可以跑一遍dijkstra g[n][n]需要long long,不知道是不是因为这个反复WA.... 1 #include <iostream> 2 #include <cstrin 阅读全文
posted @ 2021-03-31 01:27 acmloser 阅读(48) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 首先要发现负数个数a,正数个数b转化为其他ai bi实际上构成了一张无向图. 然后就能发现当负数个数为奇数时,且n为偶数时,会有一个负数不能转化为正数. 1 #include <iostream> 2 #include <cstdio> 3 #include <algo 阅读全文
posted @ 2021-03-30 23:47 acmloser 阅读(65) 评论(0) 推荐(0) 编辑
摘要:AcWing 734. 能量石 和 HDU 1074 Doing Homework 以及POJ 陪审团的区别 这3题属实看得我有点迷惑与HDU不同的是,这道不允许使用结构体dp的题都不是要求全部选完,只是选部分.HDU要求作业必须全部做完.而且time与cost可以分别记录.原因不知道是否是在这. 阅读全文
posted @ 2021-03-30 16:12 acmloser 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:分组背包dp 错误思路: 设置f[i][j]前i组选j个的集合,但这样划分集合没有考虑钱数,求不到最优解.pass 设置f[i][j][k]表示前i组选j个体积为k的三维数组,先不说有MLE的风险,而且枚举几个的时候很难计算体积 正确思路: 由上面应该要联想到状压dp,在能枚举出几个 阅读全文
posted @ 2021-03-30 09:35 acmloser 阅读(123) 评论(0) 推荐(0) 编辑
摘要:暂时的总结 01背包:n种物品和体积为m的背包,每种物品只能选1次,问能装的最大价值: f[i][j] = f[i-1][j-v]+w,f[i-1][j](以最后一步选与不选来划分集合) 观察式子可知,f[i][j]只能由f[i-1]的状态转移而来,因此只需要保存f[i]与f[i-1]两个状态. 0 阅读全文
posted @ 2021-03-28 13:51 acmloser 阅读(69) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:状压dp 完全没想到状压dp,思路全跑dfs了,但是dfs又觉得m范围不定数据可能很大....然后被卡死了.... 题解参考了这位po主,写得比本蒟蒻好 GO 思路: 参考状压dp模板哈密顿路径f[i][j]表示到达i状态且最后落脚点为j的方案数,f[i|1<<j][j] += f[ 阅读全文
posted @ 2021-03-26 16:28 acmloser 阅读(71) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:模拟(?) 思路: 对于当前点,先找以它为顶点第一类正方形边长,再找第二类正方形边长.最后计算一下以它为顶点的连通块1的数目,如果1的个数 = (边长-1)*4,那么这就是一类正方形. 还是要多动脑啊,不想没用啊TAT 1 #include <iostream> 2 #include 阅读全文
posted @ 2021-03-26 14:18 acmloser 阅读(99) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:模拟 思路: 看起来很像USACO的一道bfs搜索题,但是这道题不能去重,且x范围很大,一定会TLE.由此我们可以列出前几项发现规律.每层排序后,首项必然是n*(n+1)>>1,由此我们可以预处理每层的最大项,每层每个元素相差2,由此模拟. 坑点:i*(i+1)>>1一定要加LL!! 阅读全文
posted @ 2021-03-26 01:36 acmloser 阅读(36) 评论(0) 推荐(1) 编辑
摘要:原题链接 考察:贪心 思路: 这是构造递增序列不是等差递增序列!!!看了半天没想出来怎么写,结果发现看错题目了555 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 t 阅读全文
posted @ 2021-03-26 00:19 acmloser 阅读(28) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:前缀和+二分+双指针 补一个大佬的神级解法 Go 错误思路: 纯双指针处理,写了几个小时没写出来..... 思路: 前缀和预处理,sum[i]表示1~i坐标有多少个1,那么[l,r]区间内1的个数为sum[r] - sum[l-1],那么我们可以枚举端点,计算[l,r]区间里有多少个 阅读全文
posted @ 2021-03-25 23:21 acmloser 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:二维费用背包 思路: 套01背包模板,但是数组范围不要开错,注意N,M,K的位置,记录此题纯粹提醒我自己..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std 阅读全文
posted @ 2021-03-24 01:02 acmloser 阅读(62) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+dp 思路: 很像NOI1999的导弹拦截,但是这道题的决策需要决定是加入上升子序列还是下降子序列,然后判断加入到哪一个上升子序列. 多决策问题多用dp或搜索,这道题用dp需要记录的状态有:当前第几个数,当前上升子序列个数,当前下降子序列个数,但关键是当前最优解不一定能推到全 阅读全文
posted @ 2021-03-23 20:37 acmloser 阅读(61) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:扩展gcd 思路: 套exgcd模板但是答案没有那么简单!!! 坑点: 存在!a||!b的情况,此时答案是系数为0的变量的范围.但是if !a&&!b 此时只有!c才存在答案. 此时a&&b, 我们可以求出x,y的某一个解.如果直接while(x+=b/d)统计会TLE.因此必须转换 阅读全文
posted @ 2021-03-23 01:02 acmloser 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:博弈论(找规律) 思路: 可以想到dfs奇偶剪枝那道题,每次移动都会改变奇偶性,我们看最后一步是奇还是偶即可. 1 #include <iostream> 2 using namespace std; 3 int n; 4 int main() 5 { 6 while(scanf(" 阅读全文
posted @ 2021-03-22 09:12 acmloser 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:博弈论 找规律 思路: 数字太大了,sg函数求不出来,因此只能先打表找规律(然后什么都没看出来) 看了网上的题解才懂怎么找...= = 先分类几种情况: a%b==0,先手必胜 a>b&&b<a<2b. 此时难以直接判定胜负,需要模拟,此时a只有一种选择.达到判定条件退出. a>2* 阅读全文
posted @ 2021-03-22 08:11 acmloser 阅读(16) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:博弈论 思路一: dfs记忆化搜索,枚举当前结点能到的每一个点.sg函数记录不能到达的点. 当sg函数>0,说明有操作时当前点到达0点.此时先手为胜. 思路二: 上面的思路数据稍微小点,就会报错... 找规律.观察操作,每次操作使日期的奇偶性改变.终点的日期之和(不考虑年)为偶数,所 阅读全文
posted @ 2021-03-22 00:57 acmloser 阅读(23) 评论(0) 推荐(0) 编辑
摘要:原题链接 思路: 直接dfs会MLE,需要打表,根据行列奇偶性判断是否能胜,由打表得当n%2==1&&m%2==1时必败. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int n,m; 5 int main( 阅读全文
posted @ 2021-03-21 17:11 acmloser 阅读(17) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:博弈论 思路: 当往上走不能再前进时sg(x,y) = 0.在sg函数里模拟行走,记录sg函数的值.最后结果是n个骑士坐标异或 1 #include <iostream> 2 #include <cstdio> 3 #include <set> 4 #include <cstring 阅读全文
posted @ 2021-03-21 16:47 acmloser 阅读(19) 评论(0) 推荐(0) 编辑
摘要:原题链接 思路: 和这道Multiplication Puzzle 很像,但初始化不一样.f[i][j]表示杀死[i,j]区间的最小值,枚举的间断点k是最后杀死的狼k.那么状态转移方程很好想,主要是初始化的问题,当len=1时,f[i][j] = a[i]还是a[i]+b[i-1]+b[i+1],由 阅读全文
posted @ 2021-03-18 02:13 acmloser 阅读(37) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:区间DP 思路: 观察样例可以发现,当两只兔子在同一块石头时,ans+1,在不同但质量相同的石头时,ans+=2.这里就有点像密码脱落那道题求回文序列的长度(不是子串).但是根据样例2,我们求出来的最大回文序列长度只有3,原因是在回文序列外的单个字符没有计入.由此可以发现ans有两部 阅读全文
posted @ 2021-03-17 12:03 acmloser 阅读(66) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp LIS的延伸题 思路: 当区间没有重叠部分的时候,就可以加上+f[j]. 注意:当有重叠部分的时候,不能f[i] = max(f[i],f[j]),如果数据eg:[1,10] [2,3] [4,19]3区间会把2区间加上,而2区间必须是原w . 1 #include <io 阅读全文
posted @ 2021-03-15 12:16 acmloser 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp 这也能dp系列,完全没想到. 注意这道题是检查子矩阵,所以不用围绕主矩阵的对角线检查. 思路: 枚举子矩阵的左下角坐标,定义f[i][j]是以(i,j)为左下角坐标的最长对称边长.可以发现f[i][j]的最大边长最多为f[i-1][j+1]+1.三重循环枚举即可. 这题的原 阅读全文
posted @ 2021-03-15 10:33 acmloser 阅读(48) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp 错误思路: f[x][y]代表坐标(x,y)的最少时间,状态转移方程推不出来,而且完全没有用到木板 正确思路: 上面的状态表示其实比较接近.dp问题要将大问题分解为若干个小问题.将起始点看作一块木板,f[i][0]表示从左边跳下去的最短时间,f[i][1]表示从右边跳下去的 阅读全文
posted @ 2021-03-15 07:33 acmloser 阅读(45) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:01背包dp 错误思路: 定义二维结构体结构体DP[i][j],代表前i个人选j个的值.DP[i][j].cost代表最小花费,DP[i][j].sum代表最大和.由第i个人选不选划分集合. 此思路错在这里的最优子结构不一定推得到最优解. 比如数据: 5 3 1 1 2 3 4 4 阅读全文
posted @ 2021-03-14 17:03 acmloser 阅读(55) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp 思路: 很容易看出状态转移方程,坑到本蒟蒻的是计算时间,总之请记下来.... 这里的f[n]是秒数. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int N = 2010 阅读全文
posted @ 2021-03-14 02:01 acmloser 阅读(33) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp 思路: 乍一看我还以为是背包dp,实际不是,f[i][j]表示第i秒,j位置能得到的最大数.f[i][j] = max(f[i-1][j],f[i-1][j-1],f[i-1][j+1])+w[i][j].每个位置能获得的馅饼数要用另一个数组存,不能用f数组. 关于如何初始 阅读全文
posted @ 2021-03-14 01:29 acmloser 阅读(47) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:状压dp 错误思路: 贪心思想,每个作业用ed-cost = st排序,输出路径就是排序后的路径. 错误数据12 a 6 14 b 10 7 很明显可以发现如果数据中出现了ed-cost <0就会错误,按贪心思路是先选a,但是最优解是先选b.很明显先做完能及时做完的可以减少减去的分数 阅读全文
posted @ 2021-03-13 21:41 acmloser 阅读(63) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp LIS模型 思路: 对于每一个砖块,存储6个不同的情况.将所有砖块按a,b排序,然后按LIS的模板做即可,不用担心a很小,b很大的情况.a很小注定了放在它前面的只能是a更小的. 上面是LIS的思路,本蒟蒻是三重循环未排序,因为未排序所以二重循环会出现小砖块没更新的情况,所以 阅读全文
posted @ 2021-03-13 15:41 acmloser 阅读(62) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 or STL 思路一: map记录出现次数.(说是这么说,但我看此题的第一反应是离散化) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <unordered_map> 5 us 阅读全文
posted @ 2021-03-13 14:39 acmloser 阅读(54) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp 错误思路: f[i][j]表示前i个字符形成j段的和.此时分为两种情况: 不选a[i],f[i][j] = f[i-1][j] 选a[i]->a[i]为独立的一段,f[i][j] = f[i-1][j-1]->a[i]不为独立的一段,此时的条件是a[i-1]也在第i段中,状 阅读全文
posted @ 2021-03-13 07:41 acmloser 阅读(33) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp 思路: f[i]定义为以i结尾的连续子序列的最大值,划分集合分为a[i]做起点,或者从前面的最大值连续到a[i],状态转移方程是f[i] = max(f[i-1]+a[i],a[i]). 本题最难的点在找起点和终点(对本蒟蒻而言)....下面的测试数据可以测出代码是不是"短 阅读全文
posted @ 2021-03-12 17:04 acmloser 阅读(43) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs 思路: 和前面的互为互质数简直一模一样,就是把条件换成无边即可. 本题最大的坑点在输出格式上,请注意名词单复数 实测本题字母没有乱序给出. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #in 阅读全文
posted @ 2021-03-11 19:40 acmloser 阅读(56) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+剪枝 思路: 很容易想到枚举每一个数,时间复杂度240需要剪枝: 搜索顺序剪枝:从小到大枚举 最优性剪枝:如果now&后面所有数>=ans,return &操作只会让数字>=原数.这里不能只与k个数,存在&大数变得更小的情况. 排除冗余:组合性枚举 本题的关键剪枝:配合剪枝2 阅读全文
posted @ 2021-03-11 16:49 acmloser 阅读(47) 评论(0) 推荐(0) 编辑
摘要:原题链接 思路: 很显然是枚举对角线的点,关键在于枚举出对角线端点后怎么求另外两个点. 大佬有详细的证明,我就不画了...GO 要注意的是如果是正方形,一个正方形的对角线会枚举两次,因此答案要>>1.坐标右移并*2是避免小数和负数. 1 #include <iostream> 2 #include 阅读全文
posted @ 2021-03-11 09:18 acmloser 阅读(97) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs + 剪枝 思路: 搜索顺序是枚举每一个有颜色的格子左右移动的操作,时间复杂度是O(352*5).需要剪枝: 搜索顺序剪枝,这个应该没有 最优性剪枝.因为我们需要的是字典序最小的序列,也就是列坐标越小越好.可以先枚举列再枚举行,这样如果返回1就一定是最小的. 还有一个最优性剪枝 阅读全文
posted @ 2021-03-10 21:59 acmloser 阅读(101) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+剪枝 思路: 从最后一列开始dfs,用bool 数组记录哪些数字被使用了即可.接下来思考如何剪枝: 搜索顺序剪枝: 从大到小枚举,大数字在低位可能性较大. 冗余处理:这里是排列型枚举. 可行性剪枝:比较关键,需要两个剪枝:高位无进位. 从第1列~第n列检查是否符合实际. 最优 阅读全文
posted @ 2021-03-10 12:21 acmloser 阅读(172) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs 不看算法标签完全看不出是dfs系列 思路: 枚举每一个点选与不选的集合.依次考虑几个剪枝: 搜索顺序剪枝,可能要按点权值和排序?,这样写挺麻烦的= = 最优性剪枝,这里本蒟蒻不知道怎么剪,可能存在选d较小,选c较大,但是选d a是ans的情况. 可行性剪枝,如果算出来加入这个 阅读全文
posted @ 2021-03-10 09:18 acmloser 阅读(60) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+剪枝 思路: 很像小猫爬山的分组问题,但这里只考虑一组.涉及剪枝: 排除冗余:组合型枚举 最优剪枝: 如果前面所有物品和+当前w都<ans return 搜索顺序剪枝:很明显从大到小搜索. 注意这道题最优性剪枝不能是当前w<ans return. 因为可能n个小的拼凑出更大的 阅读全文
posted @ 2021-03-10 01:20 acmloser 阅读(25) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+剪枝 错误思路: 用bfs解此题,会WA,因为我们要时间为T时刚刚好到达,bfs是最短时间.这道题需要我们在D周围绕圈子 思路: 直接暴力TLE了.所以需要一些剪枝. 当时间==T时回溯 这个剪枝比较关键,奇偶剪枝,如果S坐标之和的奇偶与D奇偶相同,说明我们到达D需要偶数步, 阅读全文
posted @ 2021-03-09 23:11 acmloser 阅读(50) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+剪枝 思路: 首先明确暴力的思路,我们枚举每一层的r与h,求出所有满足V=N的表面积(dfs本质是暴力,我们所要做的就是剪枝).接下来考虑一些剪枝: 搜索顺序的剪枝.当我们当前枚举的体积很大时,剩下能找的r、h体积就必须尽量小,这样可以优化搜索顺序. 最优性剪枝:当s>=an 阅读全文
posted @ 2021-03-09 21:38 acmloser 阅读(78) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+剪枝 思路: 写dfs先定搜索顺序,很明显我们需要枚举和,一共64个木棒,如果暴力枚举是264,必然TLE,因此在枚举和时就需要优化.可以发现如果这些木棒能拼成等长的大木棍,那么所有木棒的和一定是大木棍的倍数.由此我们只需要枚举sum的约数.定下搜索顺序后,就是将木棒分成等长 阅读全文
posted @ 2021-03-09 15:10 acmloser 阅读(79) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs+剪枝 错误思路: 一开始是想按行搜或者九宫格搜.但是只能想到每九个格子搜一次看有哪些数字,再dfs 没想到位运算优化. 正确思路: 预处理每行、每列、每个九宫格有哪些数字.用8位二进制数表示哪些数字被使用了(本每次找九格用位运算优化到O(1)).每次搜索找到分支最少的格子搜( 阅读全文
posted @ 2021-03-09 08:09 acmloser 阅读(36) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:玄学dfs 思路1: 枚举组,判定当前数能否放进当前所有组.if 能, 加入到组中 else 新创立一个组.关键在于判定组内元素与当前数是否互质,这里用乘积代表组内的元素,如果与乘积不会互质,那么与组内所有元素一定不互质.(但是感觉会爆long long,10个数字,1040,但是实 阅读全文
posted @ 2021-03-08 21:21 acmloser 阅读(98) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs 时隔n年练习string 的自带函数,完全不记得substr了.... 思路: 首先注意重叠部分的长度使用是任意的.预处理出每个字符串之间重叠的最短长度.然后dfs相连即可. 判定前后缀是否相等用substr较为方便.主要有两种用法 Go 因为重合部分不能超过原字符串长,所以 阅读全文
posted @ 2021-03-08 17:43 acmloser 阅读(100) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:bfs 思路: 行走方式不同的迷宫问题,最坑的是输入的先是列数再是行数. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 阅读全文
posted @ 2021-03-08 10:03 acmloser 阅读(79) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:bfs 错误思路: 定义结构体Node,用Node里vector记录路径. 此思路会TLE,当n很大时,每次赋值都要消耗一定时间. 正确思路: 用数组记录路径,即用PII 数组记录到达该点的上一步的坐标.到时候再迭代即可. 注意:当迭代的时候,不要重新定义PII it!!!!! 最最 阅读全文
posted @ 2021-03-08 09:40 acmloser 阅读(77) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:Flood Fill + hash 思路: 首先连通点很容易找到,关键是判定星群是否相似.对计算机来说很难保存每个连通块形状再旋转比较.这里可以考虑hash映射.这里的经验值是计算连通块两两之间的距离,累加和,作为关键字.这里要用sqrt,不能直接用平方和.平方和更容易发生冲突,比如 阅读全文
posted @ 2021-03-08 00:56 acmloser 阅读(61) 评论(0) 推荐(1) 编辑
摘要:原题链接 考察:Flood Fill(dfs or bfs) 思路: 用Flood Fill算法时,判定边界是否有> < 的高度. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std 阅读全文
posted @ 2021-03-07 22:51 acmloser 阅读(95) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:Flood Fill(dfs or bfs) 错误思路: 根据每个数字建立一张char类型的新图. 这种做法超麻烦!!!注意这道题1 2 4 8的数字不是偶然的,这正好对应每位二进制的1. 这道题用如果用方向数组要根据下标来判断该位是否为1才能继续前进. 1 #include <io 阅读全文
posted @ 2021-03-07 21:08 acmloser 阅读(52) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:差分 思路: 首先认识到差分数组的下标是1~n+1.因为要求序列值全部相同,不同种序列的值取决于b[1]的值.某段区间内全部+1,相当于差分数组b[l]+1,b[r]-1.要让次数最少,让所有操作尽可能有效,即让b数组2~n的正数-1,负数+1.操作次数是max(正数和,负数和).第 阅读全文
posted @ 2021-03-06 16:38 acmloser 阅读(55) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:二分 再做一次还是没想到系列 蒟蒻本蒻 思路: 这道题的check函数很好想,就是枚举端点,找到区间>=l&&平均值>=mid的区间.暴力枚举是sum[j]-sum[i]>=(j-i)*mid.我们需要进行优化,要将二重循环优化到一维,i必须省去,我们求[i,j]区间是否平均值>=m 阅读全文
posted @ 2021-03-06 15:29 acmloser 阅读(46) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:二分 思路: 嵌套二分,和上一题Matrix差不多,中位数和排序后的a数组都具有单调性. 更好的check函数是,score是a[j]与a[i]的差值,已经确定a[j],那么可以求出a[i]的位置(lower_bound),从而计算前面有多少个符合条件的. 为什么本题不会有不存在的情 阅读全文
posted @ 2021-03-06 10:52 acmloser 阅读(47) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:二分 第一次做这题我还以为是dfs..... 思路: 首先烘干时间符合单调性,二分烘干时间,难点在如何写判断函数.首先两种情况: a[i]<=s,直接无视. a[i]>s,需要考虑它用烘干机的时间,注意不能直接算把它烘干完的时间,因为浪费的时间没有利用,假设它用烘干机的时间是t,那么 阅读全文
posted @ 2021-03-06 01:56 acmloser 阅读(26) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:二分 思路: 首先这道题不是让我们求坐标,而是求具体的值.观察式子,当j不变时,i增大,值增大.分数满足单调性,j不变时,i也满足单调性.二分分数,枚举每一列有多少个满足分数<小于当前score,根据总数再继续二分score.在枚举每一列时,i也满足单调性,所以也用二分枚举i. 注意 阅读全文
posted @ 2021-03-06 00:28 acmloser 阅读(40) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:组合数学 思路: C[i][j] = C[i-1][j-1]+C[i-1][j],注意拿当前数+不拿当前数,和分苹果的划分方式不一样.当C[i][j] = 0,Sum[i][j] = 1,求前缀和i、j范围必须相同. 1 #include <iostream> 2 #include 阅读全文
posted @ 2021-03-04 23:32 acmloser 阅读(63) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:枚举 + hash 思路: 暴力是直接枚举a[i]与a[j],需要优化省去一重循环.我们枚举的a[i],a[j]检查是否为k倍数时,需要让a[j]*10t + a[i](t位为a[i]的位数,注意这里用字符串转换反而不如直接求位数方便).一重循环枚举a[i]时,t已知,a[i]已知, 阅读全文
posted @ 2021-03-04 21:31 acmloser 阅读(111) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 考虑四个端点的规律,而不是斜率相同的点的规律.除了第三象限其他端点的值与x、y都很好找.第三象限要进行x+1>=<y分类.代码写繁琐了,y总的思路将点分为在上、下、左、右更好. 1 #include <iostream> 2 #include <cstring> 3 # 阅读全文
posted @ 2021-03-04 19:55 acmloser 阅读(62) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线段树 or 树状数组 思路: 套模板即可. 注意:build函数里,赋值不是赋值a[u],而是a[l].l、r是1~n范围内.u是线段树结点编号. 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 阅读全文
posted @ 2021-03-04 13:24 acmloser 阅读(49) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树状数组 +贪心 or归并排序+贪心 思路: 首先一个定理:冒泡排序的交换次数 = 逆序对个数.证明: 冒泡排序每次交换减少一个逆序对,当最后逆序对数量 = 0,交换次数>=k. 又因为每次只能减少一个.那么必然可以取到k.对于某一个人i而言,i前面>hi有k个,后面<hi有t个.k 阅读全文
posted @ 2021-03-04 08:54 acmloser 阅读(77) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树状数组 思路: 数据中x,y按升序的方式给出,当前xi yi 对于在它前面的星星,y一定<=yi,x不定,对于它后面的星星,要么y>=yi要么x>=xi,可以发现后面的星星一定不在计算的范围内.于是我们可以边读数边计算1~xi的前缀和. 注意:x可以从0开始,add函数不允许下标是 阅读全文
posted @ 2021-03-03 19:14 acmloser 阅读(77) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dp+矩阵快速幂 思路: 首先了解邻接矩阵的一个性质:当邻接矩阵Tk , aij表示从i到j长度为k的路径数有aij条.以k = 2为例,aij*ajk 表示从i->j有一条路,从j->k有一条路.总体就是i->k有一条路.当j变化时就能得到方案数. 但是这道题的边权并非为1,这个性 阅读全文
posted @ 2021-03-03 10:47 acmloser 阅读(62) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察: 矩阵快速幂 思路: f[N]表示1~n栈灯在t 秒的状态,每盏灯只与它自己和它左边的灯有关.构造n*n的矩阵,在它自己和它左边的灯的位置取1,可以发现res[i] = (f[i-1]*a[j][i]+res[i])%2. 1 #include <iostream> 2 #inclu 阅读全文
posted @ 2021-03-02 22:55 acmloser 阅读(59) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:矩阵快速幂+floyd最短路 思路: 首先明白这道题不是矩阵相乘,res[i][j] = min(res[i][j],a[i][k]+b[k][j]). a[i][j]如果代表经过x条路的最短路,b[i][j]代表经过y条路的最短路.那么res是经过x+y条路的最短路. 注意: 图上 阅读全文
posted @ 2021-03-02 21:07 acmloser 阅读(96) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:矩阵快速幂 思路: 构造1X4的矩阵{f[n],f[n-1],f[n-2],S[n]},根据给出的递推公式很容易构造出a矩阵.注意数据有n = 1和n = 0的情况,需要特判. 1 #include <iostream> 2 #include <algorithm> 3 #inclu 阅读全文
posted @ 2021-03-02 17:20 acmloser 阅读(65) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:矩阵快速幂 思路: 入门题,ans = fk = f*fk-1.注意的是不能只保留主对角线的元素,因为主对角线的元素会随同行同列的元素变化 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 usin 阅读全文
posted @ 2021-03-02 16:16 acmloser 阅读(37) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:矩阵快速幂 思路: 题目的递推式是找不到关系矩阵的,由此必须换一个思路.由题目的数据范围发现n小m大,可以考虑由第i列推到第i+1列,我们要由一个1x(n+2)的矩阵*(n+2)x(n+2)的矩阵 = 新的1xn+2的矩阵.从常数项先考虑,我们要从233->2333. 显然 2333 阅读全文
posted @ 2021-03-02 15:45 acmloser 阅读(39) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:线性dp+矩阵快速幂 思路: 将限制条件作为动态规划的维度,某两个数字不能紧连,这只与骰子的上面或下面有关,可以用f[i][j] 表示第i个骰子,其最上面是j.f[i][j] = f[i-1][k]*4,j的对面与k不互斥,骰子可以绕中心旋转.如果互斥常数就是0.时间复杂度n*6*6 阅读全文
posted @ 2021-03-02 09:19 acmloser 阅读(73) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:矩阵快速幂 思路: 矩阵快速幂的入门题,记住模板. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 typed 阅读全文
posted @ 2021-03-01 20:49 acmloser 阅读(50) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:计数dp 错误思路: 以最后一个数来划分...f[i][j]表示选i个数,总能量为j的方案数 f[i][j] +=f[i-1][j-k](0<=k<=j)k表示最后一个数是k. 此思路错在会计重. 正确思路: 按照集合中最小的数是0和>0来划分.f[i][j]表示和为i,数个数为j的 阅读全文
posted @ 2021-03-01 16:26 acmloser 阅读(76) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:IDA* or 状压+背包dp 思路一: n个物品包,每个都可以用二进制表示,f[i][j]表示前i个物品组成j状态最少需要多少包,状态转移方程为 int t = min(f[i-1][j|candy[i]],f[i-1][j]+1); f[i][j|candy[i]] = min( 阅读全文
posted @ 2021-03-01 12:28 acmloser 阅读(55) 评论(0) 推荐(0) 编辑