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