自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 2021牛客寒假算法基础集训营4 D 二分枚举答案 双指针维护区间

题目题解思路因为亲密度是第一键值,所以所有亲密关系,可以根据亲密度的情况来分类,并且每个亲密度下的关系有序(编号从小到大)。即存在一个亲密度,它的亲密关系 + 之前更小的亲密度的关系 刚好 大于等于 K。这里就有点分界点的意思了,所以我们尝试二分亲密度,看看能不能在On级别处理出这个亲密度以及一下的所有关系总数。枚举出P为此时的亲密度。这里双指针也太顶了,我们可以先处理出两个指针之间大小为P的区间的数的情况,即用哈希表统计每个数的情况。再用一个cnt来记录这个区间内和首指针不同的数的个数。首

2021-11-30 20:14:28 402

原创 2021牛客寒假算法基础集训营4 F 并查集 贪心 思维建边

题目题解思路贪心能拿提升能力大就必须拿,先不考虑给谁。当相同关系的武器但提升能力少的时候,肯定是拿大的。思维建图将武器的分配看成一种关系,即 将两个人连接的桥梁(单人的时候自环即可)。利用并查集让两个人组成一个连通块。即装备可以在这两个人之间选择。当有新装备加入的时候,将连通块扩大,即N-1个装备,肯定在这N个人中选择N-1个人拿装备。有1个人将拿不到装备。当并查集出的两个人已经在同一个连通块中时,即N个人都有装备了,在连通图中表现为自环连通块。当有其他连通块与自环的连通的时候,其他连通

2021-11-30 17:08:09 511

原创 Codeforces Round #756 (Div. 3) e1 + e2 通过前序后序遍历 处理 树的多源最短路

题目W要邀请他的K个朋友去他家玩捉迷藏,他家里有N个房间标号为1…N。房间之间有N-1条通道,保证所有房间都是可以直接或者间接互通的。一开始W在1号房间。所有人,每个时间T都可以移动一个房间,也可以不移动。当W走到只有一条通道的房间并且不是1号房间的时候,W赢,如果朋友能在他走到那个房间时间碰到他,朋友获胜。双方都有最优的方案。e1问W是否能获胜e2问朋友在保证W失败的前提下至少需要动多少个人。否则输出-1。题解思路只有一条通道并且不是根节点的房间就是叶子节点。最粗暴的思路就是处

2021-11-30 11:48:28 507

原创 Codeforces Round #756 div3 D 有根树的权值分配 贪心 模拟

题目给你N个节点的父节点Ai,当父节点和自己相同的时候就是根节点。再你一个权值数组,要求节点到根的路的所有边加起来的权值dist,按权值数组的要求的大小关系存在。当 P = 3,1,2,5,4 时 ,要求3节点最小,1节点第二小…以此类推。要你提供一种合法的权值分配方案。即给每个节点到父节点的边赋值。没有合法方案输出-1.题解思路树的题写的太少了,也挺怕这种题的。一开始就想什么dfs。结果可以暴力的,我们按顺序给节点从小到大赋值即可。儿子节点的值肯定比父节点大。所以他的顺序也必须在父节点后

2021-11-29 21:53:01 284

原创 Deltix Round, Autumn 2021 ( Div. 1 + Div. 2) C 双指针 模拟 余数块问题

题目给你一个长度为N的数组A给你 一个 数 K 。让你确定有几个 ( i , e ) 组合 使得这个K连续的乘积为一个素数。题解思路第二次碰到这种问题,其实按乘积连续,其实就是用他对K的模数继续分块。这样能保证每个点只进一次。先筛出素数。要组成素数,肯定是前面一堆1加一个素数加后面一堆1。这里堆也可能是0个。所以对每个素数,我们处理出他前面有几个1,后面有几个1。然后进行组合就行。利用双指针来处理。记得开longlong,因为,这里是有相乘的运算,所以很可能会爆。AC代码#in

2021-11-29 15:22:08 210

原创 AtCoder Beginner Contest 229 E 并查集 逆向思维建边

题目给你N点M边的完全图,每次按点的编号不断删除点(从1到n)。问你每次删除后有几个连通图。题解思路不妨从结果往前考虑。最终状态肯定是一个点都没有,0个连通图。我们从N往前加边加点。然后将可以连接的点并查起来即可。这样我们只需建小到大的单项边即可。大到小的时候,小的点被删除了。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<in

2021-11-28 13:16:05 409

原创 Codeforces Round #756 (Div. 3) F 类滑动窗口的双指针 模拟 尺取法

题目有N个人在AMT机前,ATM机内有S元,每个人会存Ai元或者取-Ai元,取决于Ai的正负号。当ATM机钱不够下个人的时候就会关闭。请你选择一个连续的区间,使得ATM机能服务最多的人。题解思路很明显,找一个最长的连续区间使得区间和 sum + S >= 0 。利用双指针来维护区间,时间复杂度是On的。将每个头指针都延展到能延展的最大长度即可。记尾指针。更新答案,并且将这个头指针往前,并将头指针值弹出。再用记忆了的尾指针继续往后探。这样每个点最多被访问2次。上次写过类似的,这次

2021-11-27 11:46:44 628

原创 Codeforces Round #757 div.2 C 位运算 计算贡献 子序列异或之和公式

题目定义一个非负整数序列的舒适度为其所有子序列上元素的异或之和。让你知道原序列长度为N,并且给你一些连续片段的位或值。让你求原序列的异或之和。题解思路参考博客考虑每一位对答案的贡献。位d的子序列肯定得选奇数个1才能得出这个值2^d。但是肯定是N个01组成的。我们从1中选奇数个,0中的任意选择不会影响答案。再由参考博客中大佬的证明所以这个位的贡献就是2^d * 2 ^n-1 次方。(只有2的n-1次方的组成能得出他的值)前提是有1这样我们积累有1的每一位即可。大佬用了位或运算来积

2021-11-27 10:34:11 430

原创 2021牛客寒假算法基础集训营4 字符串哈希成数字 二分枚举可行长度

题目题解思路因为字符串hash是从第一位往第N位乘 进制所以第一位会被乘N次。当我们要去 i 到 j 的hash值的时候让hash[j]减去hash[i-1]*(j-i+1)*进制相当与吧hash[i-1]加了(j-i+1)个 0 。这样一减就是 i 到 j 的hash值的实值了。有点难理解和普通数字的进制有点相反,多模拟几遍。枚举每个相同的前缀,这样就可以直接二分可以延展的最大的长度了。根据可行性二分枚举。最大长度减了一点还是可以拼接成他的子串。属实巧妙AC代码#inc

2021-11-26 21:35:20 127

原创 2021牛客寒假算法基础集训营4 H 边化成运算符 计算每个节点到根节点的表达式值 DFS 待定形参

题目题解思路一开始想着先dfs一遍处理乘法除法的值。第二次dfs的时候标记特判。Wa了。其实不用这么麻烦,我们只需从头扫到根节点,将有潜力变成乘法或者除法里的数分开进行。当运算到加减法的时候可以将之前的有潜力的就一定不可能再变成乘除法了,将加减的数变成新的有潜力的数。乘除法类似。除法记得逆元这样属实巧妙。还是说我写太少树的题了。还是太菜了。AC代码#include <bits/stdc++.h>//#include <unordered_map>//p

2021-11-25 16:46:05 695

原创 2021牛客寒假算法基础集训营4 G 暴力模拟 离线逆向处理 标记指针

题目题解思路(突破点)通过性质 后面填的会把前面填的覆盖了所以,我们逆向处理 。从后面往前填,并且在填过的点放上前向指针和后向指针,这样可以保证每个点只被处理一次,这样复杂度就是够的。这里每个点加的数要处理好。这题也能开2000个线段树来维护这个情况。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#defi

2021-11-25 10:19:20 383

原创 2021牛客寒假算法基础集训营4 J 数论 gcd 求 大幂次 序列 的gcd 质因数分解

题目题解思路将每个底数质因数分解 ,取每个质因数的最低幂次(乘之前的幂次)即可。最后gcd出底数序列的最大公约数。再将最大公约数分解质因数。通过预处理的每个质因子的幂次运用快速幂相乘即可。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing namespac

2021-11-24 21:23:17 91

原创 Codeforces Global Round 17 B 双指针 模拟

题目给你一个序列A要求只删除一个值(删除他的一部分或者全部或者不删)使得原序列为回文序列4 2 1 2 41 2 1特别的单个值也是回文序列1题解思路第二次碰到这种题目了,还是Wa了一发。直接两个指针一头一尾。碰到不同的时候就是不是你死就是我亡。肯定是选择删除两个种的一个。枚举即可。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII p

2021-11-24 18:01:54 296

原创 Codeforces Global Round 17 C 二分枚举答案 二分可行不可行

题目有N个人可以去你家聚会,每个人有的钱是 1 2 3 … N另外每个人还有一些要求比他有钱的人至多为ai个 比他穷的人至多为bi个如果没满足要求,他就会不开心。你想邀请最多的人,让他们都开心。求最大的人数。题解思路一开始没看到at most,至多,以为是恰好那么多人。假设存在一个答案为X人我们从这个最优答案中从后面抽走一个人,也是可行。因为要求是至多,而小一个人并不影响至多的情况。所以,我们可以推出 0 到 X 直接的都是可行解。当答案大于X就是不可行的。这样我们二分答案

2021-11-24 17:54:07 335

原创 2021牛客寒假算法基础集训营3 E 线段树 查询区间中是否有相同的数 处理链表结构 预处理

题目题解思路预处理出每个相同数之前的点和后继节点。类似链表的结构。如果我们将首节点的前节点设置为0后继节点设置为n+1来保证数据合法性。将每个节点的后继节点导入线段树,再让线段树处理区间最小值。这样我们就可以完成查询操作了。根据查询出来的值是否合法即可。删除操作就类似链表删除某个节点。将合法的前节点直接指向后继节点。并且在线段树上修改即可。这里用链表处理属实巧妙AC代码#include <bits/stdc++.h>#define PII pair<int,

2021-11-23 19:22:02 377

原创 2021牛客寒假算法基础集训营3 B 尺取法 双指针 维护双指针 模拟 贪心

题目题解思路我们可以将所有人的5个等级的分数弄在一起从小到大排序,因为A等是有限的,在同分数的时候我们贪心的将A等往后面放。例子当尺取缺一个人的时候这个人的B类分和A类相同但是区间已经用了K个a了,此时用B来才能取出正解。我们的代码只在开头删除cnta,所以我们必须要让结尾最优。尺取的时候 我们维护取到的区间满足有N个人的分数。并且必须选择A的人小于等于K个,此时就可以更新答案。当加入一个分数的时候将这个分数的人有多少个分数在集合++这个分数的人没加过 cntstu++这个分数为A类

2021-11-23 17:08:43 539

原创 AtCoder Beginner Contest 227 D 二分枚举答案

题目题解思路肯定是每次拿最大的K个数,优先队列T了。我们枚举二分能操作的次数为P具体证明看下面题解参考题解参考题解AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing namespace std;const int INF = 0x3f3f3f3

2021-11-21 17:10:23 485

原创 4078. 01串 状态机DP 动态规划

题目题解思路集合定义dp [ i ] [ 2 ]考虑长度为i的合法串中以1或者0结尾的字符串数量考虑的两种状态即连着N*K个1并且以1结尾,或者以0结尾。初始条件dp[ 0 ] [ 0 ] = 1dp[ k ] [ 1 ] = 1转移0的情况可以从前一个合法情况中以1 0 结尾转移而1的情况可以从i-k的以1为结尾的情况加K个1,或者在以0结尾的情况加K个1。转移完了求个前缀和输出即可。注意减法取模的影响。AC代码#include <bits/stdc++

2021-11-21 11:54:49 100

原创 2021牛客寒假算法基础集训营3 I 贪心 + 最大不相交区间数 好题 线性DP 动态规划

题目题解思路一开始其实是想dp的,想了挺久的递推明明推对了又自我否定了。然后想到了我们最后的序列肯定是类似两个两个相同的连接起来,我们要是把所有两个相同的两个端点变成一个区间。那这题岂不是队最大不相交区间数的问题了,直接排序贪心取即可。动态规划也行的。定义dp[i]为前i 个 数组成的合法子序列中 美观度的最大值转移方程dp[ i ] = max( dp[ i-1 ] , dp[ last[i] ] +1)即可以从之前选择的这个数的最优情况来更新此时的最优AC代码贪心 + 最大

2021-11-20 14:41:53 394

原创 华东交通大学2021年ACM“双基”程序设计竞赛 I 括号 栈+模拟

题目题解思路连续的两个数字组成的每对合法的括号对(())的贡献等于 合法匹配对的个数 + 和之前的连续合法对的组合(即加上之前的数量)(())() 第2对个的贡献是 1 + 1()()() 第3对个的贡献是 1 + 2()(()) 第2个对的贡献是 2 + 1还有一些不等的对的情况()((())())((())这种不匹配的时候要将它之后的连续贡献取成1,但是在它和之后多的右括号合并之后又有可能连上之前的连续括号对,然后连续贡献又边大了。所以这里用到了两个栈。一个栈存多的右括号另

2021-11-20 10:31:09 342

原创 华东交通大学2021年ACM“双基”程序设计竞赛 F 线段树 二分出合法区间

题目题解思路看的出是线段树,一开始想用线段树的操作来模拟操作一,但是好像弄不出。这里就有个性质了,当你要修改某段为1的时候你查询它的总和不为它的长度时,只需将总和改成长度然后pd一下就行了。但是这个从哪里开始哪里结束要怎么返回呢?利用前缀和的单调性就能得到这段有几个被填上了的。所以我们可以进行二分,二分出那个没被填上的第一个点,以及二分出填的时候结束的位置(这里利用上面的性质,我们只需知道两个端点将他们的sum改成长度然后pd即可)这里的二分属实巧妙啊 int ans

2021-11-19 17:38:31 929

原创 2021牛客寒假算法基础集训营2 G 差分前缀和的离散化 扫描线思想

题目题解思路一开始想直接差分然后直接前缀和,但是1e9开不了。但是题目只有1e5个,这就是这道题的突破口。将答题每个区间分成两个端点一个是从那个位置开始加,一个是加到的终点,分别赋值1,-1。这里和普通差分差不多,应该好理解。然后根据端点从左到右排序。根据扫描线来处理出答对某个题目数的人数。其中伴随了一个前缀和变量,记录扫描线跑到现在答对的题目数,并且每走一步更新人数(利用前后两个端点差即区间差)。这一步属实巧妙。后面处理人数应该不难。大佬题解AC代码#include <b

2021-11-17 21:49:23 70

原创 2021牛客寒假算法基础集训营2 E 双指针建图 BFS 思维

题目题解思路很容易看出这题就是裸的BFS,但是怎么建图呢?这里用到了双指针。用桶装每个高度,再将桶内的跷跷板从左到右排序。从最低高度开始从左往右从下到上建边。从左到右建图的话直接看是否满足题目条件即可。从下到上就有讲究了。你得先看看上面有没有点,其次要贪心的试探,上一层的这个位置点是否能建边,小了就往前跑,跑到可以建为止,并且建的时候也需要往前跑,跑到不能建的时候记得回溯(即从左到右的下一个点可能可以和前一个点的最后一个位置建边。)这样每个点最多只会被跑2次,时间复杂度是On的。建完了

2021-11-17 11:09:04 225

原创 2021牛客寒假算法基础集训营2 gcd + 贪心

题目题解思路根据题目规律,找出要相同的子串的长度。这里他们一眼出gcd(),我倒是看了很久,还是太菜了。当2*K < N的时候就是另一种情况,因为这个长度他不能拉伸。所以这时候重叠的子串长度就只有N - k 。当知道了重复的区间,我们要让修改的字母数最小,就枚举每个子串的每个位置的众数即可。这是小贪心。参考题解AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#

2021-11-16 21:07:27 95

原创 AtCoder Beginner Contest 226 E 图论 连通块中DFS判单环 思维

题目给你一个N个点M条无向边的图。没有自环和重边。确定每条边的方向,要求让每个点的出度为1。确定边的方向有几种情况。对998244353取模。题解思路当连通块N点M边。当N==M的时候就一定有一个自环。(满足连通就需要N-1条边)当N < M的时候就可能有多个环了。这样某点出度必然为2。小于时有某个点就出度为0了。所以,要让每个点出度为1那这个连通块必然就是环了。这样图里的连通块只能是环并且只有一个单环。这里在连通块里dfs判环也感觉有点陌生。贴大佬的话大佬的题解AC

2021-11-16 18:19:06 367

原创 AtCoder Beginner Contest 226 C dfs序 逆拓扑序

题目一个武术高手,可以学T种武术,但他只想学第T个武术,学每个武术有需要花费的时间和前置武术条件(即要先学会前置的武术)。求他学会第T个武术需要的最少时间。题解思路一开始想并查集什么的,没想太明白。如果从图论想的话,这题就可以解决了。如果正向建图的话,不容易得出答案的。因为起点难确定。而如果反向建图的话,从T点出发往回跑,跑到每个武术的最基础武术点(即无需前置武术的那种)。并且每个点只跑一次。记录出来的就是答案。帖大佬的一句话我们反向跑的时候当这个点以及被学过了,那就没必要再跑一遍了。

2021-11-16 15:57:43 703

原创 AtCoder Beginner Contest 226 B set 小技巧 筛重复序列

题目给你N个序列每个序列长度为S每个序列中有a1 a2 …as要求不重复的序列有多少个。题解思路一开始还想hash来着,但是这样不如直接走一遍判断。实在想不出用什么log级别的方法去重,看了题解发现居然是set。去重建议先想想set,比较内置的红黑树是真的顶。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>

2021-11-16 11:46:14 956 2

原创 2021牛客寒假算法基础集训营2 整除分块的性质 数论

题目题解思路特判出情况即可。先插个眼。参考文章参考文章AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing namespace std;const int INF = 0x3f3f3f3f;int main(){ ios::sync

2021-11-15 22:04:17 474

原创 2021牛客寒假算法基础集训营2双端队列的运用+模拟

题目题解思路性质(突破点):由于翻转一次后只能翻转左端点之后的点,所以这个翻转的左端点必然要让它等于i,如果这样不能相等那么之后一定翻转不到它。这样就形不成这个序列了。那么如果模拟这个过程呢?直接数组reverse?那肯定超时的。大佬们提供了一种思路利用双端队列来两头判断数。当这段区间翻转后从后头加数,前头先将翻转区间导入。当相等就将前头的数pop不等的时候肯定是需要翻转或者操作不到了。再翻转后就前头加数,后头先将翻转区间导入。以此类推。表示好这两种状态即可。当数加完的时候,要判

2021-11-15 20:39:17 264

原创 4075. 染色 并查集的运用 并查集运用的小细节

题目题解思路这题思路还是比较明显的,将颜色需要相同的气球全部并查起来,在搜索集合中颜色最多的颜色,将其他的也染成这个。这样贪心就能保证使用的染色最少。时间复杂度为On,看起来这样复杂很高,实际上每个点之会属于一个集合,所以每个点只走了一次。两端代码的不同让我找了好久的bug。 if ( a[i] == i ) { vector <int> pk ; vis[i] = cnt ; p

2021-11-15 14:41:34 412

原创 Codeforces Round #755 (Div. 2)D 交互题 二分 找规律 思维

题目一开始有一个有序序列1 2 3 4 5 …n因为一次操作,它有两个部分被反转了。i 到 j-1 j到k这样使得它产生了一些逆序数。你可以询问l r 内有多少逆序数。你可以至多进行40次 询问,要求在询问后判断有原序列的 i j k 是什么值。3<=n<=1e9题解思路因为1e9内要二分n需要至多30次,所以我们只有剩下的几次来发现答案。我们可以先二分出i 或者 k 。这两个点的性质肯定是逆序数总和刚好改变的点。所以我们需要先求逆序数的总和。就可以确定 i

2021-11-15 09:26:39 443

原创 力扣677. 键值映射 DFS字典树 遍历unordered_map哈希表

题目题解思路字典树板子都不太熟悉复习一下这种数据结果,有点链表的感觉,带着一个指针指向后继的节点。直接用字典树板子,计算总和的时候,在这个节点的后面节点全dfs一遍即可。还可以遍历<unordered_map>来求解答案。这个操作我第一次看到,记录一下。AC代码字典树做法class MapSum {public: int son[5101][50] ; int cnt[5101] ; int index = 0 ; MapSum() {

2021-11-14 20:25:20 474

原创 021牛客寒假算法基础集训营2 J 构造 斐波那契数列的运用 判断三角形成立的条件

题目题解思路首先 三角形成立的条件就是 任意两边之 和 大于第三边 我们取最坏的情况。最小的两边小于等于第三边。这样是不是有点斐波那契数列的感觉了。刚好就是等于前两项之和。看看行不行。这样我们需要让第一层循环在不少于进入log2n(40左右)的情况下,斐波那契数列在int范围内有46个左右。这样我们取前40个符合条件的数放入答案数组前面,后面取1即可。AC代码#include <bits/stdc++.h>//#include <unordered_map>

2021-11-13 17:32:35 141

原创 Codeforces Round #732 (Div. 2) C 思维 结论 找规律

题目给你一个数组Aai代表每个元素的值,并且他们还具有方向,一开始都是朝右。我们可以将相邻的数进行交换,但是每交换一次他们的方向会改变一次。要求在任意次操作的情况下,能否让数组变成非递减并且方向一致朝右的情况。题解思路性质(突破点) : 要使方向不变必然要让这个数被交换偶数次。要让这个数被交换偶数次。只能交换奇偶性质相同的点。那中间的数的方向是否能保证?例如3 2 1 交换 3 12 3 1 2 32 1 3 3 11 2 3 2 1中间的数也只会被交换偶数次。即这

2021-11-13 10:41:39 60

原创 Codeforces Round #613 (Div. 2) C 结论 爆搜 思维

题目给你一个数X , 求出两个数a b 使得lcm(a,b) == X 且 max(a,b) 最小 。题解思路首先 a b 肯定要互质 才能不含多的质因子来构成X,即相乘构成。这样我们直接用试除法 , 对X的所有质因子筛出,然后判断两边是否互质,因为试除法是根号级别的而且试除法中i在不断变大并且只到根号X,这样另一边就是不断变小的。所以符合条件的最后一个数就是答案。如果我们不知道这个结论就只能弄出所有质因子,将他们组合成答案。质因子不会很多,不超过50个。所以可以进行爆搜出最小的组合方式。

2021-11-12 19:38:57 384

原创 力扣375. 猜数字大小 II 记忆化搜索 区间DP 最小化最大值

题目样例1 160<= n <= 200题解思路一般这样最小化最大值都是二分来解决的,这题貌似用不了二分。数据量小直接爆搜(记忆化)枚举两个区间中选择的每一个点,取两种分支的最大值,加上费用后取最小值更新答案。即在每个最大分支中取最小值状态表示 dp[ i ] [ j ] i 到 j 的序列中 选择的花费的最小的最大值。状态转移和记忆化搜索一样。按照区间dp的套路初始化好搞好边界就能AAC代码记忆化搜索const int INF = 0x3f3f3f3f;

2021-11-12 17:35:26 66

原创 Codeforces Round #613 (Div. 2) B 任意区间做法 + 多种做法 STL二分要注意的细节

题目给你一个序列A请你判断是否有一个子区间使得大于等于整个区间的总和。如果有返回NO否则YES题解思路根据之前任意区间的思想,我们可以先处理出前缀和,然后排序,二分判断两个区间差是否大于等于区间总和SP即可。定住一边为s[i] +sp 然后利用lower_bound()判断之后的区间s[k]是否存在大于等于它的。这里需要特判两个都是端点的情况(即s[i]为0,s[k]为sp),当前缀和中不存在等于0和s[k]的数的时候这些判定出答案就是非法的,因为这样就是取整个区间了。这里用lower_

2021-11-12 10:08:26 395

原创 力扣629. K个逆序对数组 斜率优化 省去前缀计算 动态规划

题目题解思路状态表示前i个数中逆序对为j个的情况数状态转移第i个数有可以放的位置为( 1 , i ) , 设放的位置为K ,则会产生 (i - k )个逆序对,这样i-1只需提供j-(i-k)个节点,对K的所有位置进行求和就是转移到i j的所有情况了。这样转移方程就是还可以进行优化,这样就可以就不用前缀和了。AC代码const int mod = 1e9 + 7 ; long long dp[1010][1010] ; class Solution {public:

2021-11-11 21:40:05 92

原创 2021牛客寒假算法基础集训营2 I 筛法 dp 思维

题目题解思路肯定是要用前面的数的结果来递推后面的数的。因为欧拉筛是用最小质数来筛出每个合数的,所以一开始想着用最小的质数来放到数的最前面。但是后面的数可能会非常大而导致取模后无法判断长度。这样就会Wa。这样的话,不如将每个数最大的质数放到数的后面,这样的乘法过程就不会影响取模的正确性了。利用埃筛就可以实现的,埃筛就是按顺序把合数的质数从小到大来筛他的,这样就可以利用之前情况来递推后面的结果了。利用log10(来取出质数的位数-1。这样可以知道前面的数应该前进多少位。从而得出答案。AC代码

2021-11-11 19:06:39 89

原创 2021牛客寒假算法基础集训营1 D 并查集 逆元 组合数学 二维网格转一维注意事项

题目题解思路首先探讨二维转一维的思路。将每个点转成横坐标乘N+纵坐标。看起来可以实现,但是这题需要四周的点,这样3 4 就被隐式连接了。所以会Wa。当我们先将N自增1的时候,每个能用上的XY就不会出现上面那种隐式连接了。(小技巧)然后回到这题,当一个1变成0的时候,四周的1也会变成0,即连锁反应。所以我们可以将每个有这种关系的点连通成块。想将所有1变成0必然是按每个连通块中的一个就行。假设有N个连通块,每个连通块有a1 a2…an个点。这样选择的情况就是N!a1a2*a3…*an

2021-11-11 09:44:54 305

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除