![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
思维
文章平均质量分 51
1
kaka0010
退役ACMer/算法竞赛菜鸡
展开
-
2021 HDU多校 Boring data structure problem 链表模拟
原题链接:https://acm.hdu.edu.cn/showproblem.php?pid=7072目录题意分析Code题意有四个操作在左端插入一个数在右端插入一个数删除值为x的元素(保证唯一)查询第(m+12)(\frac{m+1}{2})(2m+1)个元素的值分析赛中一直被删除操作困扰很久,看了题解之后恍然大悟。思路基本就是维护两个链表,我们控制两个链表的size,使得第m+12\frac{m+1}{2}2m+1个元素正好位于第二个链表的左端,这样第四个操作可以O(1)查原创 2021-08-17 18:37:57 · 205 阅读 · 0 评论 -
2021牛客暑期多校训练营7 J. xay loves Floyd 预处理最短路+bitset
原题链接:https://ac.nowcoder.com/acm/contest/11258/J目录题意分析Code题意正确的弗洛伊德算法是依照枚举k, i, j的顺序,k是转移的中间点,i是出发点,j是到达点。现在按照i,j,k的枚举顺序,问有多少点对之间的最短路仍然是正确的。分析我们分两种情况来考虑u本来就不能到达v,u和v是同一个点。u通过最短路径dis[u,k]到达k,再通过最短路经dis[k,v]到达v,且k是u,v最短路径上的必经点对于第一种情况我们直接统计就可以了,对于第二原创 2021-08-10 19:33:28 · 134 阅读 · 0 评论 -
2021HDU多校第三场 1009 Rise in Price 思维+乱搞
原题链接:https://acm.hdu.edu.cn/showproblem.php?pid=6981目录题意分析Code题意有两个n*n的矩阵a,b分别代表每个格子的钻石数量和提升的单价,我们只能从(1,1)开始走到(n,n),问售卖钻石的最大价值是多少。分析赛中往DP和网络流方向去想了,很明显发现这个状态根本无法全部表示,记录到当前为止拿到的宝石数量和提升的价格是不可能的,因为这是指数提升的状态。根据题解中描述的,我们只需要取最满足条件的前K个状态保存一下,接着进行合并。合并的方法也非常简原创 2021-07-28 15:47:08 · 181 阅读 · 1 评论 -
牛客练习赛54 C.排序 暴力枚举+逆序对
原题链接:https://ac.nowcoder.com/acm/contest/1842/C题意有ATGC四种字符组成的字符串,每次可以交换相邻的一对,问最少多少次可以将同种字符分到一起分析每次交换相邻字符,不就是交换排序的基本操作吗?又有一个性质,交换排序次数和逆序对个数是相同的,因此我们只要算逆序对个数就可以了。然后就是给字符排一下优先级,一共也就24种全排列,全部暴力枚举一下就可以了,复杂度是O(24n)。Code#include <bits/stdc++.h>using原创 2021-05-14 14:46:49 · 150 阅读 · 1 评论 -
牛客练习赛6 B.点权和 思维题
原题链接:https://ac.nowcoder.com/acm/contest/26/B题意分析n个点,m次询问,m的范围是1e7,因此直接暴力的方法直接t飞。其实我们发现一个点的答案,影响他的因素只有三个,他自身的操作数,他父节点的操作数和他子节点的操作数,因此我们只需要设三个a[x], b[x], c[x]分别表示x节点的操作次数和x子节点的操作次数和x孙子节点的操作次数接下来我们每次询问的x,答案的贡献来自x的权值=a[x]+a[fa[x]]+b[x]x的权值 = a[x] + a[f原创 2021-04-30 21:38:43 · 297 阅读 · 1 评论 -
HDU 6602 Longest Subarray 思维+线段树
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602目录题意分析Code题意有一个序列,如果子序列满足∑i=lr[ai=x]=0or∑i=lr[ai=x]>=k\sum_{i=l}^{r}[a_{i}=x]=0or\sum_{i=l}^{r}[a_{i}=x]>=ki=l∑r[ai=x]=0ori=l∑r[ai=x]>=k则称这个子序列是好的子序列,问最长的好的子序列长度是多少分析非常好的一道思维题,首先考虑枚举一个端原创 2021-04-30 14:46:21 · 257 阅读 · 0 评论 -
Codeforces Round #717 (Div. 2) D. Cut 倍增
原题链接:https://codeforces.ml/contest/1516/problem/D目录题意分析Code题意给定一个n个元素的序列,每次询问一个区间[l,r],问区间内最少可以划分成多少块,使得块内的所有数互质分析首先所有数互质可以想到所有的质因子都不能相同,因此我们对每个数进行质因数分解并记录这些质因子最后出现的位置,然后再利用倍增的思想预处理出倍增数组记录每个位置往前跳的位置,这样复杂度可以控制在logn*m。查询的时候就一直暴力往前跳就可以,如果大于左端点,那么答案就加上跳过原创 2021-04-22 20:32:59 · 121 阅读 · 0 评论 -
Codeforces Round #710 (Div. 3) G. Maximize the Remaining String 单调栈
原题链接:https://codeforces.ml/contest/1506/problem/G目录题意分析Code题意有一个字符串,你可以删掉一些字符,要求最开始每个字符都至少剩一个且字典序最大分析首先满足单调性,其次要求每个字符都剩至少一个,可以用单调栈解决,记录后面还剩几个该字符,如果没有,就留下,如果还有,就可以被替换Code#include <iostream>#include <cstdio>#include <cstring>#incl原创 2021-04-15 17:40:16 · 89 阅读 · 0 评论 -
Codeforces Round #714 (Div. 2) D. GCD and MST 并查集+优化kruskal
原题链接:https://codeforces.ml/contest/1513/problem/D目录题意分析Code题意有n个点,每个点都有自己的权值ai两点之间的连边满足以下要求:gcd(ai,ai+1...aj)=min(ai,ai+1...aj)gcd(a_{i},a_{i+1}...a_{j})=min(a_{i},a_{i+1}...a_{j})gcd(ai,ai+1...aj)=min(ai,ai+1...aj) i和j可以连一条权值为min(ai,ai+1...aj)原创 2021-04-12 13:13:23 · 149 阅读 · 0 评论 -
牛客练习赛3 B 贝伦卡斯泰露 折半搜索+hash
原题链接:https://ac.nowcoder.com/acm/contest/13/B目录题意分析Code题意给定一个序列有n个元素,问取出两个子序列长度均为n/2,能否取出完全相同的两个子序列。分析题目范围很小,n只有40,因此考虑二进制枚举。但2402^{40}240复杂度显然不能满足要求,但220∗22^{20}*2220∗2是可以的,所以我们用折半搜索的思想,先处理出前n/2的数据。从题目来看,要使两个子序列完全相同,那么前缀和后缀一定是相同的,因此在枚举的时候就可以把不满足条件的给筛原创 2021-04-11 19:31:18 · 111 阅读 · 0 评论 -
牛客练习赛80 D.分组 tarjan+倍增+二分
原题链接:https://ac.nowcoder.com/acm/contest/11170/D目录题意分析Code题意有n个点,m条边,你可以对边进行分组,每组内边的编号一定是连续的。设每个图的权值是这个图的强连通分量大小的平方和,且每组的权值不得超过k,问最少可以分成多少组。分析因为每组的边编号是连续的,满足单调性所以考虑二分。但如果每次都用二分去确定右边界,时间复杂度是n2lognn^2lognn2logn,显然不符合要求。然后去优化,这里用到倍增的思想,枚举2k2^k2k条边,如果在2k原创 2021-04-10 23:10:19 · 150 阅读 · 1 评论 -
2021 ICPC 昆明 K Riichi!! 暴力+模拟
原题链接:https://ac.nowcoder.com/acm/contest/12548/K目录题意分析Code题意麻将的规则就直接略过了,题目是当前有14张牌,你可以打出一张,然后输出听了哪些牌,询问方案并输出分析直接暴力枚举所有的牌丢弃,然后从牌池中枚举一张牌摸进来,判断是否胡牌。有一些细节需要处理注意在判断胡牌时需要枚举雀头,注意这里可以剪枝(牌数大于2时)。最后注意输出时要按照一定的顺序,本题不是spj最后计算一波时间复杂度 T∗142∗342T * 14 ^ 2原创 2021-04-08 22:34:46 · 469 阅读 · 0 评论 -
牛客练习赛79 D 回文字D 字符串哈希+贪心
原题链接:https://ac.nowcoder.com/acm/contest/11169/D目录题意分析Code题意分析既然对于小于D的字符串都属于D型回文串,我们直接大胆一点,找[i, i+d-1]位置的字符串是否是回文串,如果是,那么可以继续将左端点右移,直到失配为止,然后将左端点的值变成i+d-1。然后就是怎么O(1)判断回文串,我们只需要前后预处理一遍字符串哈希就可以了。Code#include <bits/stdc++.h>#pragma comment(link原创 2021-03-27 20:49:31 · 164 阅读 · 0 评论 -
第十八届浙大城市学院程序设计竞赛 F Palindrome dfs+双指针
原题链接:https://ac.nowcoder.com/acm/contest/12986/F目录题意分析Code题意给一个字符串,问能否消去小于两个字符使得字符串变成回文串分析根据回文串的性质,两端一定相等,因此我们定义两个指针,一个指向开头,一个指向结尾如果当前两个字符相同,那么两个指针都像中间推进一格如果当前两个字符不相同,考虑当前还剩几次删除次数。如果有两个,那么可以选择左端删,或者选择右端,或者两端都删;如果只有一个,那么选择左端删,或者选择右端删;如果没有了,那么直接返回fal原创 2021-03-22 14:06:19 · 89 阅读 · 0 评论 -
Codeforces Round #704 (Div. 2) D - Genius‘s Gambit 思维+构造
原题链接:https://codeforces.ml/contest/1492/problem/D目录题意分析Code题意给出a个0和b个1组成两个二进制串x、y,要求满足:x - y 的二进制中1的个数为k个x大于yx和y都没有前导零分析这题有很多特判的细节,提前说一下。因为是x大于y,因此我们直接把x串设置成111…1000…的形式当a为0或b为1时,k只要不是0就输出NO当k=0时,直接输出YES然后就是构造的技巧,先假设一个串110000。我们先让x和y都设置为11原创 2021-02-23 22:08:45 · 195 阅读 · 0 评论 -
Codeforces Round #704 (Div. 2) C. Maximum width 贪心
原题链接:https://codeforces.ml/contest/1492/problem/C目录题意分析Code题意有s和t两个字符串,有一个序列p1,p2…pm满足spi = ti,现在求pi - pi-1的最大值分析因为一个ti可以对应多个位置,因此考虑贪心最优的策略。但要注意p是上升的序列,所以用双指针保证不减。正着走一遍可以算出每个ti位置可以取到的最小值,然后再倒着走一遍算出可以取到的最大值。那么最大的差值就是当前数的最大值减前一个数的最小值,再走一遍取max即可。Code原创 2021-02-23 20:39:40 · 192 阅读 · 0 评论 -
2021牛客寒假算法基础集训营5 A美丽的路径 二分答案
原题链接:https://ac.nowcoder.com/acm/contest/9985/A目录题意分析Code题意有n个点,m条边,每个点有一个全值。起点是s,终点是t,设美丽路径为s到t路程中第k/2+1小的数,求最大的美丽值是多少。分析刚开始的想法是找到最大的相邻两点中的较小值,最后被证明错了,赛中也有很多人这样过了,后来数据加强了。既然不能贪心,只能用二分去取答案。我们把大于等于mid的权值设为1,小于等于mid为0。因为我们要求k/2+1小的数,即路径中第k/2+1小的数是1。用原创 2021-02-22 22:17:23 · 1155 阅读 · 2 评论 -
Codeforces Round #701 (Div. 2) D. Multiples and Power Differences 构造lcm
目录题意分析code题意给定一个n*m的原矩阵a,要求构造一个矩阵b满足每一位bij都是aij的倍数bij <= 1e6bij与相邻元素之差为k4 (k>=1)分析因为所有的aij都是小于16的,因此完全可以构造一个数满足他是所有aij的倍数用lcm从1处理到16,最后的值也只有720720,满足第二个条件,这样处理完之后,第一个和第二个条件都已经满足了,先用lcm填满整个bij最后考虑第三个差值条件,既要满足倍数关系不能变,又要和周围的值构造出差,只能把自己的值加上当前a原创 2021-02-13 13:33:18 · 2109 阅读 · 1 评论 -
Codeforces Round #701 (Div. 2) C. Floor and Mod 整除分块
目录题意分析Code题意给一个数对(n, m),求出在a∈[1,n],b∈[1,m]中满足⌊\lfloor⌊ab\frac{a}{b}ba⌋\rfloor⌋ = a mod b的数对有多少个分析观察样例发现当a=b+1时肯定满足,然后接着往下推当b=2时a / b = 3 / 2 … 再往后⌊\lfloor⌊ab\frac{a}{b}ba⌋\rfloor⌋ 已经大于2了,因此不可能满足当b=3时a / b = 4 / 3, 8 / 3当b=4时a / b = 5 / 4, 9 / 4原创 2021-02-13 12:44:05 · 2584 阅读 · 5 评论 -
Codeforces Round #699 (Div. 2) D. AB Graph 思维+构造
https://codeforces.com/contest/1481/problem/D目录题意分析Code题意n个点组成的完全图,边权为a和b,你可以走m步,问是否有可能走出回文串分析首先考虑m为奇数的情况,如果两点间的两条边相同,那么肯定是回文串,如果不相同,形如aba也可以构成回文串接着考虑m为偶数,我们知道如果是偶数那么中间两个肯定是相同的,我们只要找到连着相同的两条边就可以。在三个点之间肯定能形成这种情况,可以自己模拟一下试试,因为是完全图,所以当n>=3时肯定可以构造出来的原创 2021-02-06 13:30:40 · 2779 阅读 · 3 评论 -
2021牛客寒假算法基础集训营3 E 买礼物 线段树+链表
https://ac.nowcoder.com/acm/contest/9983/E目录题意分析Code题意有n个礼物,每个礼物都有不同的编号,下面有m次操作x 拿走x位置的礼物x, y 询问[x,y]区间内是否存在两个一样的礼物分析看一眼单点修改区间查询,然后转换一下题意变成找区间出现最多的数咦~这不是分块or莫队轻松解决然后瞄一眼数据范围5e5,优雅暴力 基本是没戏题解给了一种非常巧的解法,用链表链接前后两个编号相同的点,然后在查询区间中是否存在两个相同的编号就可以转化为[l,原创 2021-02-06 10:17:35 · 198 阅读 · 1 评论 -
2021牛客寒假算法基础集训营1 C 红和蓝 二分图判定+构造
https://ac.nowcoder.com/acm/contest/9981/C目录题意分析Code题意有一棵树,每个节点上都有一种颜色,要求每个红色点边上只有一个红色点,每个蓝色点边上只有一个蓝色点,问能否构造,否则输出-1。分析稍微画一下图可以注意到红色和蓝色都是成对出现的,也就是说用相邻的两个点对覆盖整棵树,而且不能重叠。看到点对问题可以想到二分图的染色问题,而这时我们要多处理一步,就是找出点对。在此之前我们通过二分图判定,如果黑色点和白色点个数不相同,那么无法构成n/2个点对。排除原创 2021-02-01 20:04:38 · 758 阅读 · 0 评论 -
Educational Codeforces Round 103 (Rated for Div. 2) D. Journey 并查集
https://codeforces.com/contest/1476/problem/D目录题意分析Code题意有n+1个城市,和n条路,路由L和R表示往左走或者往右走,但路的方向不是固定的,每走一次所有的路就会改变一次方向,问从每个城市出发最多能到达的城市数量。分析数据是3e5,如果反着建边跑dfs肯定会超时,所以我们要思考O(n)的解决方案。我们发现如果要整个联通块都可达,那么LR一定是相间出现的,因此我们从联通块入手,将原字符串分成不同的联通块并计算联通块内的个数,然后分析一下城市两边的不原创 2021-01-30 20:14:01 · 182 阅读 · 1 评论 -
Codeforces Round #698 (Div. 2) D. Nezzar and Board 裴蜀定理
https://codeforces.ml/contest/1478/problem/D目录题意分析Code题意黑板上有n个数,你可以任选两个数x,y,然后将2x-y写到黑板上,问k是否能被写到黑板上分析我们将2x-y拆开来看一下,x+x-y相当于x这个数加上他和y的差值,那么我们可以处理出所有的差值。但数据范围是1e5如果用n2 处理肯定超时,但我们发现如果我们求出了a1,a2和a2,a3的差值也就相当于求出了a3,a1的差值(a3-a2+a2-a1=a3-a1)因此我们只要处理出n-1个差值就原创 2021-01-29 14:57:44 · 1288 阅读 · 1 评论 -
2020 ICPC济南站 J Tree Constructer 构造+二分图染色
原题链接文章目录题意分析Code题意有n个点的图中,满足如果两个点的权值或运算之后等于260 -1,则两点之间可以连边。题中会给n-1条边,问每个点权应该是多少。分析由于n的范围非常小,可以直接考虑每一位上的构造。我们采用如上构造方式,我们先给每个节点编号,但要保证白色为个数少的那个,从而确保60位上可以任意选择。对于白色的点,我们先将最高位置0,在让第id位也置0,这样可以保证所有白色点之间不会有边对于所有黑的的点,我们先将最高位置1,再与它相邻的所有点的第id位置1,从而确保与所有相原创 2020-12-27 21:43:55 · 1003 阅读 · 0 评论 -
AtCoder Beginner Contest 184 F - Programming Contest 进制枚举+思维
原题链接文章目录题意分析题意给定n个物品,m是最大容量,求不超过最大容量的最大容量值。分析n范围是0到40,因此直接用二进制的枚举会超时,会达到240的时间复杂度。其中有一个小技巧,我们将物品分成两堆,然后进行枚举,最后会得到两堆的最优值。接着考虑合并两堆就可以了。Max = max(Max, ai)Max = max(Max, ai + bi)其中bi为可以取到的最优值,我们用二分去找就可以了。#include <iostream>#include <cstring&原创 2020-12-21 21:06:09 · 182 阅读 · 0 评论 -
Acwing 145.超市(二叉堆 & 贪心)
题目链接题目的大意就是每天可以卖一种商品,但每个商品都有自己的保质期,求最大的收益。转换一下,就是每天都尽量选择最大的商品卖,这里有两种解决方法,一种是贪心,一种是是二叉堆。很容易想到这题的贪心解法,先对商品按价格进行排序,然后再选择在第几天卖掉它,因为我们要尽可能卖掉更多的商品,因此要选择尽量靠后的时间卖掉它。下面看代码#include <bits/stdc++.h>using namespace std;const int N = 100010;int vis[N];int原创 2020-05-31 20:19:10 · 197 阅读 · 0 评论