合集-思维题

摘要:原题链接 小记 在一位高人的帮助下通过这题 主要是二分+双指针(聚焦型双指针?) 时间复杂度为O(tnlogn) 题解 二分这个k对应的值,对于每个二分出来的值,找出共有几个和小于它,核心如下: 如果恰好有a[l1]+a[r1]<x , 那么\(a[l_1]-a[i]<x,( 阅读全文
posted @ 2024-01-16 18:33 纯粹的 阅读(52) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 本题中,每一位数字的每一次变化都会对答案贡献1,所以对于第 i 位数字而言,它的贡献为从最左边到现在的数,设为 f[i] 所以答案为 i=1nf[i],可以用高精度加法解决 然而这样一来时间复杂度就超了 O(t·n2) 所以我们尝 阅读全文
posted @ 2024-02-18 22:53 纯粹的 阅读(56) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 如果 (ai+aj) mod x==0 那么 (ai mod x+aj mod x) mod x==0 如果 (aiaj) mod y==0 那么 ai mod y==aj mod y 所以我们可以把每个 阅读全文
posted @ 2024-02-19 18:44 纯粹的 阅读(35) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 我们令 a出现在b前面 建立一条a到b的有向边 如果有强连通分量,那么no 每张截图除了第一个人,其余人均按相对位置排序 这道题就变成了给定若干个相对位置,求是否存在可能的绝对位置 我们可以建图,作拓扑排序,一个节点能被遍历到当且仅当其所有的父节点都被遍历到 当且仅当 阅读全文
posted @ 2024-02-19 21:12 纯粹的 阅读(35) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解,请看这里 细节 有除法的求模要求逆元 code #include<bits/stdc++.h> #define mod 998244353 #define ll long long using namespace std; inline void read(ll &x) { x = 阅读全文
posted @ 2024-02-20 05:21 纯粹的 阅读(25) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 一只青蛙 x 天来回跳 一只青蛙从左往右跳 2x 2x 只青蛙从左往右跳一次 规律:对于任意长度为 y 的区间,其区间和一定不小于 2x 证明过程请看题解区,非常优雅 upd: 如果想从起点跳到石头上,那么前y 阅读全文
posted @ 2024-02-21 01:44 纯粹的 阅读(74) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 由于执行收获操作后所有数组清零,清零后的数组最快捷的加分方法是加一收获一,所以就是第一次加多少次 然后第一次加完最多收获 n 分,相当于清零后执行总共 2n 次 所以只需要判断第一次加 &[0,2n-1]& 次加后收获时能收获多少就行了 code,注意细节 #incl 阅读全文
posted @ 2024-02-23 16:05 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 对于原序列而言,如果第一个元素是最大值或最小值,那么l肯定不能落在这,由于r也不可能落在这,所以相当于这个元素被剔除了 那么对于区间 [1,n] 的研究就等价于对 [2,n] 的研究 由此可以推出之后的做法 code #include<bits/stdc++.h> u 阅读全文
posted @ 2024-02-24 01:46 纯粹的 阅读(19) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 一个节点的答案一定是最大父节点+1 code #include<bits/stdc++.h> using namespace std; int ans[100005]={0}; int in[100005]={0}; vector<int> G[100005]; struct uni 阅读全文
posted @ 2024-02-24 13:09 纯粹的 阅读(16) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 设前半部分对两个集合贡献的差为a,后半部分贡献为b 若 a==b 则 差为a的组合数(被选上,和在哪个集合无关)sa 与b的组合数的sb 此时对答案的贡献为 sa·sb 所以穷举所有差的组合,然后累加 设差为集合A-集合B 每个元素对差的贡献有三种可能,要么加要么减要 阅读全文
posted @ 2024-02-26 03:31 纯粹的 阅读(38) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 折半搜索 前半部分的所有组合(二进制表示)存起来,然后遍历后半部分的组合,找到第一个加起来不大于M的 = code #define ll long long #include<bits/stdc++.h> using namespace std; inline void read(l 阅读全文
posted @ 2024-02-26 13:54 纯粹的 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 要让水平块尽可能多,垂直块尽可能少 垂直块最少为零,也就是说,一行里全部都是水平块,可不可能?答案是可能的,一定存在某种组合使得水平块刚好塞满一行 那么这种方块数最多的组合是多少?每个方块长度都为2,如果 m 为奇数,最后一个方块长度为 3 题解 #include<bits/ 阅读全文
posted @ 2024-02-28 14:17 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 逆序对数最小的排列是严格升序的排列,因此我猜想有一个严格升序的排列最优的 证明; 冒泡排序,我们把排列a中最大的元素不断地往右作相邻对换,这样一来,序列a的逆序对数必定减少一,序列b的逆序对数可能减少一,可能不变,可能加一,但是两个排列的总逆序对数不可能增加。 然后再逆着想验证了这种 阅读全文
posted @ 2024-02-28 16:03 纯粹的 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 既然是按位异或,那么我们尝试在二进制视角下考虑问题 我们发现,当两个数的同一位置上都有1的时候,这个1消与不消对结果没有影响,而这个位置上其中一个有一,另一个没有一时,我们可以通过x来转移一 所以在ab俩个数出现第一个10情况不同的位置之后,我们要尽可能地把剩余的一尽可能地移到较小的 阅读全文
posted @ 2024-02-28 16:12 纯粹的 阅读(42) 评论(0) 推荐(0) 编辑
摘要:原题链接 题意简述 把1移到移到左边最近的0的位置,请问形成一片连续的一需要移多少次? 题解 像坦克的履带,对于两群不相连的1,右边想和左边相连至少要走中间的0的数量的步数,这下就可以遇到零才执行收获操作了 code #include<bits/stdc++.h> using namespace s 阅读全文
posted @ 2024-02-28 16:17 纯粹的 阅读(43) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 什么时候会输? 首先我们要贪心一次性把离自己最近的怪物消灭掉,但是一回合内消灭掉了一个怪物之后还有剩余,我么就把剩余的扣在第二个离自己最近的怪物上 如果我当前回合没有消灭怪物,并且怪物下一回合就到零点,那我就输了 我们可以想象成这样的动画:我们每回合一次性往怪物身上丢出所有的手雷,手 阅读全文
posted @ 2024-02-28 16:54 纯粹的 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 给定数组c,和若干查询区间,请问能否改变区间中的每一个值且区间和还不变? 对于任意一个数,不是加就是减,而对于整个数组而言,加了多少就要减多少 而对于等于1的元素而言,只能加,因此我们令元素为1的为待加元素,其他元素均为待减元素 找出所有大于1的元素把他们变成一,然后差值累加到一个变 阅读全文
posted @ 2024-02-28 17:12 纯粹的 阅读(31) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 对于任何一个粘液块s而言,要么是从左边被吞并,要么是从右边被吞并,根据对称性,两边的决策是一样的,因此先考虑右边 对于被右边吞并而言,有以下几个特征 1.起始粘液一定是吞掉了s右边一整块连续的粘液 2.右边区间一定存在大小不同的相邻粘液,这样才能发动吞并 3.由一二猜想,只要存在不同 阅读全文
posted @ 2024-02-28 17:48 纯粹的 阅读(40) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 暴力可不可以关键看时间复杂度 x从1遍历到 log2(1e6) ,y同理 时间复杂度约为 O(20·20) 草 code #include<bits/stdc++.h> #define ll long long using namespace std; int main() 阅读全文
posted @ 2024-02-28 18:01 纯粹的 阅读(45) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 将序列排序后,设最小值为k,那么 2 n 的每个元素都可以表示为 nk+b,b[0,k1] 如果 2 n 的元素中存在 kb 均为零,一定失败 code #include<bits/stdc++.h> using namespac 阅读全文
posted @ 2024-02-28 18:49 纯粹的 阅读(42) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示