
贪心、思维、构造
文章平均质量分 59
贪心、思维、构造
Selvaggia
这个作者很懒,什么都没留下…
展开
-
疫情防控【并查集,离线查询,依次删除节点逆向转化为逐渐添上节点】
【代码】疫情防控【并查集,离线查询,依次删除节点逆向转化为逐渐添上节点】原创 2023-07-15 12:34:25 · 808 阅读 · 0 评论 -
3705. 子集mex值【模拟】
很显然,数据x不会超过100,那么数据范围已经暗示你用cnt数组记录每个数出现的次数,记录的好处不止在于不用遍历来计算某个数重复出现了多少次,还可以直接从0开始,按顺序得到每个数出现的次数,而不是排序之后傻傻模拟。从0开始的每个数x,大于等于2就没事,一旦不存在x,那么res为x*2。如果只有一个x,其中一个集合的mex是x。原创 2023-05-21 09:26:57 · 196 阅读 · 0 评论 -
3732. 矩阵复原【思维⭐从元素出发记录唯一的元素对应的唯一的坐标,如果不用map可以先记录行号,确定列号的时候直接装入数组】
可能出于给的样例比较简单,只有两行,可以很直接通过肉眼模拟,针对每行的第一个元素,可以找到这列元素的排列,根据这列元素的排列对行进行排序,但是些许复杂,做法有。,唯一的位置对应着唯一的数,可以不从坐标主观出发而是从元素数值出发,记录唯一的数值对应的坐标,当然可以通过map容器,,在确定列号 j 的时候,直接将这个元素装入数组。,但也可以只记录其中一个行号。原创 2023-05-16 16:53:45 · 137 阅读 · 0 评论 -
3697. 回文子序列【思维而非dp,子序列而非子串,哈希表记录下元素出现的位置】
长度大于等于3的回文子序列 等价于 两个相等的元素位置之差大于等于2。想对子串写dp清移步。原创 2023-05-16 16:16:17 · 105 阅读 · 0 评论 -
3679. 素数矩阵(构造)
输入样例:输出样例:构造方式二原创 2023-05-16 14:12:31 · 259 阅读 · 0 评论 -
3672. 数组重排【构造i-a[i]!=j-a[j],ij严格递增,只要使得-a[i],-a[j]递增不等式两侧就是严格递增的关系】
递增序列(由大到小排序好的元素a[i] 的相反数 -a[i])+严格递增序列(下标)==>严格递增序列。原创 2023-05-15 22:21:42 · 89 阅读 · 0 评论 -
3664. 数组补全(根据中位数补全数组,先统计好已有元素小于中位数的个数sm和大于等于中位数的个数lg)
不用考虑p,因为p肯定大于y,为了满足总和不超过x,最小补1最大补y。混淆中位数的概念,中位数当然是。原创 2023-05-15 16:21:39 · 102 阅读 · 0 评论 -
3646. 分水果【二进制枚举⭐暴力枚举判断是否满足条件,而不是受条件约束去枚举】
首先,所有三元组(x,y,z)互不相同且不可以(0,0,0),这样的三元组至多7个,至多分给7个小朋友。每一种枚举方案映射到一个**7位的二进制数,**看这个7位二进制数每一位是0是1代表该种方案是否取。在其中组合里面选取若干种的方式一共有1<<7种。接下来考虑七种情况可能取几种。原创 2023-05-14 16:38:36 · 99 阅读 · 0 评论 -
3636. 数组延伸(逐个遍历元素,能被x整除就把,x个得到的商添加在数组末尾,不能被x整除就停止遍历)【模拟,找规律,题意】
不能整除的时候要停止遍历,我这样就没有停止, 而且不用计算分解出来多少个数,分解出来的数相加就是a[i]逐个遍历元素,能被x整除就把,x个得到的商添加在数组末尾,不能被x整除就停止遍历。不能整除的时候要停止遍历,我这样就没有停止。原创 2023-05-14 10:41:46 · 123 阅读 · 0 评论 -
3624. 三值字符串(同时包含字符 1,2,3的s的最短子串的长度)【双指针】
的操作要放在后面,其次 只要管 l指向的值有没有重复,不需要看i。其实双指针就这一句,为什么要搞幺蛾子TT。原创 2023-05-13 19:36:00 · 116 阅读 · 0 评论 -
子矩形计数(多少个面积为k的全1子矩阵)【思维,两个一维数组相乘得到矩阵,计算一维数组中长度为x的全1子段】
真的把矩阵计算出来,在矩阵里面找子矩阵必然超时。原创 2023-05-13 19:06:12 · 147 阅读 · 0 评论 -
3583. 整数分组(选数最多分成k组,最多能选几个数dp+双指针)
基础上,如果最多分为k个符合条件的分组,最多可以选出几个数(k个分组由多少数构成)原创 2023-05-13 18:00:11 · 109 阅读 · 0 评论 -
3580.整数配对(使得两两相等要操作多少次)
简答粗暴看图贪心(图来自acwing题解)原创 2023-05-13 11:31:17 · 86 阅读 · 0 评论 -
一列数到中位数的总距离最小
多个村庄分布在一排不同的位置,要在某个村庄设置一个邮局使得所有村庄到达这一个邮局的总距离最小,邮局应该设置在村庄坐标的中位数位置处(同一个坐标可能有多个村庄)二进制数进行计算并且输出结果,当然是转化为十进制直接运算再将结果转化为二进制数,脑子秀逗了才会去在二进制的世界按照二进制的规矩一位一位地相加。这里相似,一列数,不一定各不相同,要使得所有数相等的操作数最少,最后所有数的值应该等于原先中位数的值。设平均数是avg 平均数的答案是(下面的不等式是三角绝对值不等式)所以中位数的答案小于平均数。原创 2023-05-08 18:58:11 · 620 阅读 · 0 评论 -
1659.社交距离I(二分⭐假设牛栏之间的最小距离为x,看添加的牛的数量是否可以大于等于2)
求添加两头牛之后 牛栏之间的最小距离 最小,就假设牛栏之间的最小距离为x,看添加的牛的数量是否可以大于等于2。二分+判断 比条件分析要OK得多,后者很容易一团糨糊。尝试条件判断分类讨论,非常凌乱+过不了。也可以用一个数组记录每头奶牛的位置,原创 2023-05-08 18:52:12 · 97 阅读 · 0 评论 -
3574. 乘积数量(连乘乘积为负数的区间个数,前缀和)
【代码】3574. 乘积数量(连乘乘积为负数的区间个数,前缀和)原创 2023-05-03 16:25:20 · 147 阅读 · 0 评论 -
日志统计(双指针,滑动窗口找合格的子区间)
3、最后的输出, 关于超时,用cout输出即使加上。相差为d也是不可以的,所以要取等号。2、时间段相差最大值是 d-1。照样超时,用printf最好!1、对数组排序的规则,其实。第一个评测,bitch!原创 2023-04-05 16:37:06 · 390 阅读 · 0 评论 -
1050.鸣人的影分身(dp同n苹果放m个盘子,dfs控制搜索结果不重复⭐)
,但即使存储在map容器中,map ,int> 也需要先对vector数组排序,太过麻烦,但也同时意识到,dfs搜索不同路径,只能避免这条路的组成序列整体不同,但是对于(2,2,3)和(2,3,2),会算作两条不同的路径,为了避免两个相同的组合,试想过记录每个搜索的路径,判断两条路径的组成元素是否相同,(要想省去多组输入的初始化dp数组,应该让对dp元素赋值的语句在前。,重复的序列在排序后都归于这一种情况,于是可以避免重复。于是限制dfs,爆搜路径时,只搜索。原创 2023-04-04 16:43:28 · 474 阅读 · 0 评论 -
蓝桥杯之贪心
将股票价格的变动抽象成折线图,将每个上升阶段累加起来(每次的累加并不一定代表真实的一次买卖交易,比如两段连续上升的折线,只进行了一次买卖,但对两段上升折线分别累加的收益结果是一致的)假设货舱建的位置,左边有 k 家商店,右边有 n-k 家商店,假设 货舱向左移动 x 的距离,那么此时总共的路程为。我们设在仓库左边的所有点,到仓库的距离之和为p,右边的距离之和则为q,那么我们就必须让p+q的值尽量小。原创 2023-03-31 22:44:36 · 2615 阅读 · 0 评论 -
超级胶水(石子合并,数组中每两个数相乘的和==每个a[i]乘上前i-1个数的前缀和sum[i-1]的总和
之后两个石子堆合成一个石子堆。我们往下继续思考,可以发现,两个小石子(不管在什么位置)合并操作就是一次乘法操作,每个小石子之间都会合并一次,所以最终的结果就是每个不同石子重量乘的和。若干堆石头,每两堆相乘的乘积 的和 的计算方法(引申为数组中每两个数相乘的和):每个。之后的数乘以的前缀和中包括了。个数的前缀和,这样可以保证。和别的每个数都乘一遍(原创 2023-03-22 21:36:54 · 77 阅读 · 0 评论 -
整数拼接(思维枚举,两变量满足某条件-->通过其中一变量根据条件推断另一变量
6很多需要双重循环两个值,暴力判断组合在一起是否满足某个条件(比如等式是否成立),其实可以换个角度,遍历其中一个值,另一个间接推到Ai,Aj的搭配组合,无非就是需要满足=>双重循环暴力肯定不行, 考虑到Ai<=1e9,那么可以遍历每个Ai,等式右边可以得到,等式左边还需要找到数组中其他元素Aj(可能存在多个Aj使得等式成立噢)并且注意不是要得到具体的Aj们,只需要得到有多少个Aj能使得等式成立再去遍历一遍必然是不可,但是可以一开始对数组a中每个元素 进行一项初始化初始化。原创 2023-03-22 21:20:59 · 361 阅读 · 0 评论 -
最少砝码(思维+找规律)
a[i]表示用i个砝码 能够构成的 最大可测量重量(此时的范围自然也对应着0~a[i])然后可以根据这个max[i+1] = 3*max[i]+1。k+1 可以用(2k+1) - (k-0) 表示。k+2 可以用(2k+1) - (k-1) 表示。2k+1 可以用(2k+1) - (0) 表示。2k+2 可以用(2k+1) + (1) 表示。3k+1 可以用(2k+1) + (k) 表示。第n+1个和前n个放两边 可测得x-k;这样n+1个砝码可以表示出0~3k+1。第n+1个为x(x>k);原创 2023-03-22 20:08:20 · 725 阅读 · 0 评论 -
Crazy Binary String( 0、1出现次数相等的最长子串(前缀和d[i]==0或者d[j]==d[i])
3、res初始化应该为0,不是-1,假使找不到以上两种情况中的任何一种,不进入对res的值的改变,那res就一直为-1了,没有机会纠正到0。首先明白子串和子序列的区别,子串要求是原字符串中一段连续的元素,子序列是原字符串中若干个保持原来相对次序的元素。记得之前做过一道dp题,求 元素累加和等于k的倍数的子串还是啥的,具体可能记错了,反正有两种情况,一种是。2、类似前缀和的思想,判断一段子串【l,r】中01的个数是否相等。,求01数量相等的子串,也有两种情况 ,一是。这次遗漏的是情况一,要么初始化。原创 2023-03-17 16:28:32 · 662 阅读 · 0 评论 -
滑动窗口or双指针——力扣篇
判断的是以i为左端点的区间,由于遍历前缀和数组搜索满足条件的右端点。,故可以二分搜索右端点。看错题惨过打输架,是。原创 2023-03-16 20:35:28 · 211 阅读 · 0 评论 -
子序列个数(不要求连续子序列、重复的子序列不重复计算【dp+双指针】)
比如当前要取的数为a[i],且a[i]最近一次在之前的j位置出现过了。那么有dp[i]=dp[i-1]*2-dp[j-1]。所以我们利用一个数组mark记录下a[i]出现的位置就好了,没有出现过为0。要时刻谨记,不是序列中不含重复元素,而是序列不能重复,即两个相同元素不要出现在序列中同一位置,却当作两种结果。如果不存在重复的数,那么dp[i]=dp[i-1]*2(含空集的情况)。如果不存在重复的元素,当然不存在以上情况 直接一个公式就能输出结果。比如 a[j]==a[i],举个例子更好理解题意。原创 2023-03-16 11:21:08 · 810 阅读 · 0 评论 -
双指针基础题(最长不含重复元素子序列的长度)
延续了上一篇的做法,借助map容器,双指针中左指针指向 上一段满足条件的区间的最后一个元素。另一种做法,指针滑动,更能体现双指针、滑动窗口的思想。一个注意点,当给定序列下标从0开始,用。原创 2023-03-15 19:46:21 · 79 阅读 · 0 评论 -
Unique Values 满足条件的区间数(双指针)
以下思路是对的,但是求(last,r]这段的子区间数量 方式不对,也不知道为啥不对,给的两个样例也都通过了。因为显然[l,r]不能包含在满足要求的矩阵中(太大了),要缩小,摒弃掉l列以左的所有。这里要求是区间中不含重复元素,当出现重复元素(此时出现在下标i,上一次。感觉双指针的主要思想就是就是摒弃显然已经被排除的一段。要摒弃掉mp[a[i]]以左的元素,有个注意点,不过双指针求区间数量的常见做法都是。双指针分别是区间左右端点。原创 2023-03-15 18:41:01 · 396 阅读 · 0 评论 -
贪心——力扣篇
动态规划会超时,为什么不用dp,大概能感觉到,注意nums[i]是在位置i上的最大跳跃距离而非固定跳跃距离,因此跳跃距离是不确定的,与dp的推导不太合适(容易进行不必要的计算推导而导致超时)对于当前遍历到的位置 x,如果它在 最远可以到达的位置 的范围内,那么我们就可以从起点通过若干次跳跃到达该位置。根据题目的描述,只要存在一个位置 x,它本身可以到达,并且它跳跃的最大长度为。这样以来,我们依次遍历数组中的每一个位置,并。,那么位置 y 也可以到达。,这个值大于等于 y,即。原创 2023-03-15 08:51:23 · 150 阅读 · 0 评论 -
Package Delivery(贪心)
注意now在不断更新,首先取先到达的截至日期,再到达的物品的r来更新now(这个我不太能想到)now从队列中的a[i].r取(r小的拍前),在别的商品的截止日期时取完的从队列中删去。将各个快递按到达的时间排序,依次与now相比,在now之前到达的收入队列。若一次性把队列中的全部取完,就继续遍历后面进来的物品。贪心思想,尽量晚取,在a[i].r上取。最少几次取走所有快递。......原创 2022-07-27 16:12:11 · 361 阅读 · 0 评论 -
B. K-th Beautiful String(找规律)
LINK好家伙,一顿敲完才发现并不是按照二进制递增的这个规律,因为二进制递增无法保证一直有两个进制位为1,因此想到分开观察两个b的规律,发现第一个b,在倒数第2个位置出现1次,在倒数第3个位置出现2次,在倒数第4个位置出现3次,……而第二个b,配合着第一个b,第一个b位置固定时,第二个b从倒数第一个位置逐渐前移注意i∗(i+1)/2i*(i+1)/2i∗(i+1)/2 爆 intintint !!!#include <iostream>#include <algorithm原创 2022-05-10 17:39:30 · 197 阅读 · 0 评论 -
D. Subarray Sorting9(思维+线段树)
D. Subarray Sorting题目分析线段树4个小小函数,找bug找到吐血题目D. Subarray Sorting分析这道题不该盯着排序,盯着怎么排序,只需要思考序列需要满足怎么样的条件才能使得 a,b数组通过排序能一一匹配成功从左到右依次考虑a[i]==b[i]首先要找到b[i]在a数组当中的位置,如果不存在肯定直接NOb[i]在a数组当中出现的位置可能有多个,用队列记录下来,找到b[i]在a种第一次出现的位置x,看b[i]?=min{1,x}如果b[i]不是最小的,对这段进原创 2022-04-26 22:51:30 · 347 阅读 · 0 评论 -
抽屉(鸽巢)原理
这里写目录标题抽屉原理Modulo_Sum选数XOR-gun抽屉原理Modulo_Sum抽屉原理优化n个数可以产生n个前缀和,这n个前缀和分别对m求余,得到n个0~m-1范围内的数,若存在前缀和%m==0,必然满足若不存在,那么n个数落在1~m-1这m-1个数范围中,相当于n个物品放在m-1个抽屉里,至少有一个抽屉放了两件物品至少有两个数取了相同的值,那么两个前缀和之间的数可以被m整除那么,只要n>m,就必然有满足题意的解#include <bits/stdc++.h>原创 2022-04-26 12:01:10 · 407 阅读 · 0 评论 -
E. Palindrome-less Arrays(思维dp、拆分序列、回文)
题目:传送门分析:给出一个长度为n的数组,其中有若干个-1,需要用1~k中的数去替换所有的-1,使得数组序列中不存在长度为奇数(>3)的回文序列2 3 2, 2 2 2,…1 2 3 2 1…,观察可发现,不存在长度为奇数的回文序列等价于a[i]!=a[i+2],a[i]与a[i+1]a[i]!=a[i+2],a[i]与a[i+1]a[i]!=a[i+2],a[i]与a[i+1]没有限制关系,这样一来可以把序列拆成奇数下标和偶数下标对应元素分别组成的两个子序列最后的方案数=奇序列填补方式∗奇原创 2022-04-25 17:40:04 · 356 阅读 · 1 评论 -
7-14 还原文件 (35 分)
@[TOC](7-14 还原文件 (35 分))输入样例:1795 70 80 97 97 68 58 58 80 72 88 81 81 68 68 60 8064 68 58 58 803 81 68 683 95 70 803 68 60 805 80 72 88 81 814 80 97 97 68输出样例:3 6 1 5 2 4思维点本来看到碎片的高度都是不超过100的非负整数,想着把vector<vector >(size1,vector(size原创 2022-04-20 15:22:47 · 515 阅读 · 0 评论 -
(无向)树上的逃和追 ,(有向)树才有所谓深度,(无向)树只有距离最远的节点
(无向)树上的逃和追本来想先找到距离x最远的节点y,再用Dijkstra求1,y的最短距离∗2本来想先找到距离x最远的节点y,再用Dijkstra求1,y的最短距离*2本来想先找到距离x最远的节点y,再用Dijkstra求1,y的最短距离∗2真的是昏了头,树中两个已知节点之间只有一条路,距离是固定的,又不是图真的是昏了头,树中两个已知节点之间只有一条路,距离是固定的,又不是图真的是昏了头,树中两个已知节点之间只有一条路,距离是固定的,又不是图关于非根节点的节点的深度(错误预警)距离x最远的叶子节点,原创 2022-04-12 17:49:51 · 395 阅读 · 0 评论 -
Codeforces Global Round 6
传送门这里写目录标题A 能被2整除且被3整除就能被6整除(6是2和3的最小公倍数)TLE,还是要与题目非暴力沟通B(骰子两对立面之和是7)A 能被2整除且被3整除就能被6整除(6是2和3的最小公倍数)#include <bits/stdc++.h>using namespace std;signed main(){ ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; string str; whi原创 2022-04-11 16:37:35 · 351 阅读 · 0 评论 -
B. Code For 1(思维,模拟二叉树中序遍历特征)
B. Code For 1题意:给定一个数n, 如果这个数大于1,把这个数拆分成3个数成为一个序列,对于序列中大于1 的数 进行以上操作,直到序列中只有0和1,问区间【l,r】内有多少个1n的数据范围不超过2502^{50}250,int数据范围是2322^{32}2321125899906842623 1 100001这个魔鬼样例,超出题目说的范围了,恰好2502^{50}250这张图片好看,节点内的数值是中序遍历的序号#include <iostream>#includ原创 2022-03-31 20:12:28 · 1067 阅读 · 0 评论 -
小于O(n)找出首尾差值最大的非降序子序列(指针偏移?)
小于O(n)O(n)O(n)时间复杂度内找出首尾差值最大的非降序子序列#include <iostream>#define int long long using namespace std;const int N=1e5+5;int a[N];signed main(){ int t; cin>>t; int n; while(t--){//要找一个非降序序列,并找出哪个字串的首尾差值更大//由于非降序,对于以l为起点的序列,序列越长首尾差值越大//有点像原创 2022-03-30 16:11:42 · 335 阅读 · 0 评论 -
蓝桥杯刷题
这里写目录标题数字三角形(有意思,锁定终点)跳跃十进制转十六进制冒泡排序数字三角形(有意思,锁定终点)向左下走的次数与向右下走的次数相差不能超过 1,直接锁定终点!#include <iostream>using namespace std;const int N=105;int a[N][N];int dp[N][N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<原创 2022-03-29 16:53:08 · 805 阅读 · 0 评论 -
每日思维风暴(子串分值、子串分值和)
每晚思维[#552. 循环子串](http://oj.daimayuan.top/problem/552)[#80. 锦标赛,思维风暴](http://oj.daimayuan.top/problem/80)[#605. 蒟蒻(map容器的删除操作)](http://oj.daimayuan.top/problem/605)子串分值#552. 循环子串遇到字符串循环时,也就是需要首尾相连时#include <iostream>#include <algorithm>#inc原创 2022-03-28 20:28:09 · 1265 阅读 · 0 评论