02 2024 档案

摘要:原题链接 题解 如果一开始就把所有数乘起来,结果会太大,所以我们把逆着来,先找到最后一个元素,然后乘法求模 code #include<bits/stdc++.h> using namespace std; long long a[200005]={0},ans[200005]={0}; int m 阅读全文
posted @ 2024-02-28 19:20 纯粹的 阅读(26) 评论(0) 推荐(0)
摘要:原题链接 题解 对于一个数,我们将其转换成二进制,然后补零到31位 我们发现,能和数x配对的数只有一个,那就是 按位翻转后的x,即x和 \(2^{31}-1\) 异或的值 所以我们要找有没有能互相配对的值,以及组数,配对用map? code #include<bits/stdc++.h> using 阅读全文
posted @ 2024-02-28 19:13 纯粹的 阅读(39) 评论(0) 推荐(0)
摘要:原题链接 题解 将序列排序后,设最小值为k,那么 \(2~n\) 的每个元素都可以表示为 \(nk+b,b\in[0,k-1]\) 如果 \(2~n\) 的元素中存在 \(k\) 且 \(b\) 均为零,一定失败 code #include<bits/stdc++.h> using namespac 阅读全文
posted @ 2024-02-28 18:49 纯粹的 阅读(61) 评论(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 纯粹的 阅读(57) 评论(0) 推荐(0)
摘要:原题链接 题解 对于任何一个粘液块s而言,要么是从左边被吞并,要么是从右边被吞并,根据对称性,两边的决策是一样的,因此先考虑右边 对于被右边吞并而言,有以下几个特征 1.起始粘液一定是吞掉了s右边一整块连续的粘液 2.右边区间一定存在大小不同的相邻粘液,这样才能发动吞并 3.由一二猜想,只要存在不同 阅读全文
posted @ 2024-02-28 17:48 纯粹的 阅读(78) 评论(0) 推荐(0)
摘要:原题链接 题解 给定数组c,和若干查询区间,请问能否改变区间中的每一个值且区间和还不变? 对于任意一个数,不是加就是减,而对于整个数组而言,加了多少就要减多少 而对于等于1的元素而言,只能加,因此我们令元素为1的为待加元素,其他元素均为待减元素 找出所有大于1的元素把他们变成一,然后差值累加到一个变 阅读全文
posted @ 2024-02-28 17:12 纯粹的 阅读(55) 评论(0) 推荐(0)
摘要:原题链接 题解 什么时候会输? 首先我们要贪心一次性把离自己最近的怪物消灭掉,但是一回合内消灭掉了一个怪物之后还有剩余,我么就把剩余的扣在第二个离自己最近的怪物上 如果我当前回合没有消灭怪物,并且怪物下一回合就到零点,那我就输了 我们可以想象成这样的动画:我们每回合一次性往怪物身上丢出所有的手雷,手 阅读全文
posted @ 2024-02-28 16:54 纯粹的 阅读(48) 评论(0) 推荐(0)
摘要:原题链接 题意简述 把1移到移到左边最近的0的位置,请问形成一片连续的一需要移多少次? 题解 像坦克的履带,对于两群不相连的1,右边想和左边相连至少要走中间的0的数量的步数,这下就可以遇到零才执行收获操作了 code #include<bits/stdc++.h> using namespace s 阅读全文
posted @ 2024-02-28 16:17 纯粹的 阅读(70) 评论(0) 推荐(0)
摘要:原题链接 题解 既然是按位异或,那么我们尝试在二进制视角下考虑问题 我们发现,当两个数的同一位置上都有1的时候,这个1消与不消对结果没有影响,而这个位置上其中一个有一,另一个没有一时,我们可以通过x来转移一 所以在ab俩个数出现第一个10情况不同的位置之后,我们要尽可能地把剩余的一尽可能地移到较小的 阅读全文
posted @ 2024-02-28 16:12 纯粹的 阅读(61) 评论(0) 推荐(0)
摘要:原题链接 题解 逆序对数最小的排列是严格升序的排列,因此我猜想有一个严格升序的排列最优的 证明; 冒泡排序,我们把排列a中最大的元素不断地往右作相邻对换,这样一来,序列a的逆序对数必定减少一,序列b的逆序对数可能减少一,可能不变,可能加一,但是两个排列的总逆序对数不可能增加。 然后再逆着想验证了这种 阅读全文
posted @ 2024-02-28 16:03 纯粹的 阅读(32) 评论(0) 推荐(0)
摘要:cf比赛里赛时做出来的思维题没有赛后总结,错失了一些很宝贵的思维 过于追求难题 洛谷刷不动了,可以刷刷cf 很多题其实 都能做出来,但是写的太慢了 阅读全文
posted @ 2024-02-28 14:20 纯粹的 阅读(30) 评论(0) 推荐(0)
摘要:原题链接 题解 要让水平块尽可能多,垂直块尽可能少 垂直块最少为零,也就是说,一行里全部都是水平块,可不可能?答案是可能的,一定存在某种组合使得水平块刚好塞满一行 那么这种方块数最多的组合是多少?每个方块长度都为2,如果 \(m\) 为奇数,最后一个方块长度为 3 题解 #include<bits/ 阅读全文
posted @ 2024-02-28 14:17 纯粹的 阅读(25) 评论(0) 推荐(0)
摘要:原题链接 题解 非常抽象的缩点 大概思路:搜索缩点成有向图,求该点的入度和出度,最后答案一定是 \(max(in,out)\) 总之很抽象 code #define ll long long #include<bits/stdc++.h> using namespace std; inline vo 阅读全文
posted @ 2024-02-26 22:50 纯粹的 阅读(49) 评论(0) 推荐(0)
摘要:原题链接 题解 单点修改线段树,向上更新,再注意下转移方程就行了 code #include<bits/stdc++.h> using namespace std; int tree[800005]={0}; int len[800005][2][2]={0};//代表第几个节点,0/1在左/右边的 阅读全文
posted @ 2024-02-26 16:06 纯粹的 阅读(58) 评论(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 纯粹的 阅读(29) 评论(0) 推荐(0)
摘要:原题链接 题解 设前半部分对两个集合贡献的差为a,后半部分贡献为b 若 \(a==b\) 则 差为a的组合数(被选上,和在哪个集合无关)sa 与b的组合数的sb 此时对答案的贡献为 \(sa·sb\) 所以穷举所有差的组合,然后累加 设差为集合A-集合B 每个元素对差的贡献有三种可能,要么加要么减要 阅读全文
posted @ 2024-02-26 03:31 纯粹的 阅读(75) 评论(0) 推荐(0)
摘要:原题链接 题解 首先,题目确保这是一个图 那么我们进行缩点,把边双连通分量的点缩点,然后统计叶子节点,也就是连接数为1的节点 要注意有重边的存在,那么我是怎么处理的呢?把两点之间的直接边只能出现一次,那我就作二维数组统计 code #include<bits/stdc++.h> using name 阅读全文
posted @ 2024-02-25 20:23 纯粹的 阅读(92) 评论(0) 推荐(0)
摘要:原题链接 题解 和点双连通分量不同在于 点双联通分量:分量内任意两点之间至少有两条独立路径可走,两条路径所经过的点除了起点和终点都不同 边双连通分量:分量内任意两点之间至少有两条独立路径可走,两条路径所经过的边都不同(包括重边) 用这个图依然可以解释 code #include<bits/stdc+ 阅读全文
posted @ 2024-02-25 17:55 纯粹的 阅读(55) 评论(0) 推荐(0)
摘要:原题链接 题解 唯一能解释的图片,黄色代表会执行入栈操作的点 code #include<bits/stdc++.h> using namespace std; int vis[500005]={0}; int low[500005]={0}; stack<int> q; vector<int> a 阅读全文
posted @ 2024-02-25 17:13 纯粹的 阅读(290) 评论(0) 推荐(0)
摘要:原题链接 题解 先说结论 对单个图做深度搜索树,对于树的根节点,它要能是割点当且仅当她有至少两个不互通的儿子节点 对于树的非叶子非根节点,它要能是割点当且仅当存在儿子节点能去的时间戳最小的节点不小于当前节点的深度搜索序 对于叶子节点, 不可能成为割点 code #include<bits/stdc+ 阅读全文
posted @ 2024-02-24 22:54 纯粹的 阅读(29) 评论(0) 推荐(0)
摘要:原题链接 题解,请看题解区第一篇,看一遍就会了 code #include<bits/stdc++.h> using namespace std; int fa[400005]={0}; int finds(int now) { return fa[now]=(fa[now]==now?now:fi 阅读全文
posted @ 2024-02-24 18:27 纯粹的 阅读(31) 评论(0) 推荐(0)
摘要:原题链接 题解 好抽象啊!!! 大概思路就是把强连通分量看作一个点,然后在此基础上找入度为零的点 code #include<bits/stdc++.h> using namespace std; vector<int> G[205]; int in[205]={0};//代表强连通分量的入度 in 阅读全文
posted @ 2024-02-24 17:28 纯粹的 阅读(31) 评论(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 纯粹的 阅读(24) 评论(0) 推荐(0)
摘要:原题链接 题解 对于原序列而言,如果第一个元素是最大值或最小值,那么l肯定不能落在这,由于r也不可能落在这,所以相当于这个元素被剔除了 那么对于区间 \([1,n]\) 的研究就等价于对 \([2,n]\) 的研究 由此可以推出之后的做法 code #include<bits/stdc++.h> u 阅读全文
posted @ 2024-02-24 01:46 纯粹的 阅读(35) 评论(0) 推荐(0)
摘要:原题链接 题解 由于执行收获操作后所有数组清零,清零后的数组最快捷的加分方法是加一收获一,所以就是第一次加多少次 然后第一次加完最多收获 \(n\) 分,相当于清零后执行总共 \(2n\) 次 所以只需要判断第一次加 &[0,2n-1]& 次加后收获时能收获多少就行了 code,注意细节 #incl 阅读全文
posted @ 2024-02-23 16:05 纯粹的 阅读(24) 评论(0) 推荐(0)
摘要:原题链接 题解 1.暴力模拟 对每条边枚举(枚举之前先对边排序),然后对除去枚举边之外的边做并查集 code1: #include<bits/stdc++.h> using namespace std; struct unit { int x,y; }edge[5005]; bool cmp(uni 阅读全文
posted @ 2024-02-22 18:58 纯粹的 阅读(41) 评论(0) 推荐(0)
摘要:原题链接 题解 一只青蛙 \(x\) 天来回跳 $\to $ 一只青蛙从左往右跳 \(2x\) 次 \(\to\) \(2x\) 只青蛙从左往右跳一次 规律:对于任意长度为 \(y\) 的区间,其区间和一定不小于 \(2x\) 证明过程请看题解区,非常优雅 upd: 如果想从起点跳到石头上,那么前y 阅读全文
posted @ 2024-02-21 01:44 纯粹的 阅读(128) 评论(0) 推荐(0)
摘要:原题链接 题解 标准的线段树加上一点点题意转化,注意细节 code #define ll long long #include<bits/stdc++.h> using namespace std; ll tree[810000]; ll wait[810000]; inline void read 阅读全文
posted @ 2024-02-20 23:44 纯粹的 阅读(33) 评论(0) 推荐(0)
摘要:原题链接 题解 区间修改+单点查询 对于一个点,查询的时候翻转的次数如果是奇数,是1,如果是偶数,是0 所以题目转变成对区间上的点加一,然后求单点的奇偶性 树状数组 对一串序列加1,相当于对其差分序列的 \([l]++,[r+1]--\) code #include<bits/stdc++.h> u 阅读全文
posted @ 2024-02-20 22:44 纯粹的 阅读(35) 评论(0) 推荐(0)
摘要:原题链接 题解 多次单点修改加上多次区间查询 线段树 code #include<bits/stdc++.h> using namespace std; int tree[800005]={0}; int a[200005]={0}; void build(int node,int l,int r) 阅读全文
posted @ 2024-02-20 21:20 纯粹的 阅读(28) 评论(0) 推荐(0)
摘要:原题链接 code #define ll long long #include<bits/stdc++.h> using namespace std; ll tree[410000]={0}; ll wait_mul[410000]={0}; ll wait_add[410000]={0}; ll 阅读全文
posted @ 2024-02-20 20:25 纯粹的 阅读(30) 评论(0) 推荐(0)
摘要:原题链接 题解 一开始我想的是每个节点要么建,要么不建,可是这样一来不好转移,因为有如下情况(黑色代表建站) 于是我们换一个角度思考,我们发现一个点要能通网,有三种情况: 1.自己建站 2.儿子建站 3.父亲建站 Code #define ll long long #include<bits/std 阅读全文
posted @ 2024-02-20 17:15 纯粹的 阅读(44) 评论(0) 推荐(0)
摘要:原题链接 题解 细节很多的树形dp,请看代码 code #define ll long long #include<bits/stdc++.h> using namespace std; ll sit[100005]={0}; ll f[100005]={0}; vector<ll> G[10000 阅读全文
posted @ 2024-02-20 14:22 纯粹的 阅读(25) 评论(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 纯粹的 阅读(44) 评论(0) 推荐(0)
摘要:原题链接 题解 我们令 a出现在b前面 \(\to\) 建立一条a到b的有向边 如果有强连通分量,那么no 每张截图除了第一个人,其余人均按相对位置排序 这道题就变成了给定若干个相对位置,求是否存在可能的绝对位置 我们可以建图,作拓扑排序,一个节点能被遍历到当且仅当其所有的父节点都被遍历到 当且仅当 阅读全文
posted @ 2024-02-19 21:12 纯粹的 阅读(48) 评论(0) 推荐(0)
摘要:原题链接 题解 游戏规则总结一句话: 安娜要尽可能删掉后导零(翻转),萨沙要尽可能保护后导零(连接),问剩余数字的位数能否达到 \(m+1\) 位 直接模拟即可,统计每个数后导零的长度, 然后按照安娜先手的规则求出能保留多少位后导零,最后判断长度 code #include<bits/stdc++. 阅读全文
posted @ 2024-02-19 19:26 纯粹的 阅读(49) 评论(0) 推荐(0)
摘要:原题链接 题解 如果 \((a_i+a_j)\ mod\ x==0\) 那么 \((a_i\ mod\ x+a_j\ mod\ x)\ mod\ x==0\) 如果 \((a_i-a_j)\ mod\ y==0\) 那么 \(a_i\ mod\ y==a_j\ mod\ y\) 所以我们可以把每个 阅读全文
posted @ 2024-02-19 18:44 纯粹的 阅读(66) 评论(0) 推荐(0)
摘要:原题链接 题解 本题中,每一位数字的每一次变化都会对答案贡献1,所以对于第 \(i\) 位数字而言,它的贡献为从最左边到现在的数,设为 \(f[i]\) 所以答案为 \(\sum_{i=1}^{n}f[i]\),可以用高精度加法解决 然而这样一来时间复杂度就超了 \(O(t·n^2)\) 所以我们尝 阅读全文
posted @ 2024-02-18 22:53 纯粹的 阅读(83) 评论(0) 推荐(0)
摘要:前景导入 当 \(t\in [1,2]\) 时,本题如何求解? 答:树形dp 设 \(f[i]\) 为以 \(i\) 为根的树,根节点的晶蝶已消散且儿子节点的晶蝶还未被惊动,能获得的最大晶蝶数。 则有状态转移方程 \(f[i]=(\sum f[u])+max(a[u])\) ,其中 \(u\) 为 阅读全文
posted @ 2024-02-18 16:49 纯粹的 阅读(45) 评论(0) 推荐(0)
摘要:原题链接 题解 千万要仔细读题呀! 解释一下为什么要和右边的植物来回走来长高: 对于第一个植物,肯定是往右边,对于第二棵植物,左边的植物已经达到高度了,右边可能达到了高度,也可能没有,往右边肯定是更优解 code #define ll long long #include<bits/stdc++.h 阅读全文
posted @ 2024-02-17 21:40 纯粹的 阅读(31) 评论(0) 推荐(0)
摘要:原题链接 题解,好多细节。。 1.构建st表时的细节 2.数越多,按位与的结果越小,所以对于 \(f(l,i)\) 存在 \(r_{max}\) 使得 \(i>r_{max}\) 时 \(f(l,i)<k\) 小于等于时相反,故具有单调性 但是,在倍增结构上二分你玩原神玩多了? 向右遍历即可,直到 阅读全文
posted @ 2024-02-17 16:45 纯粹的 阅读(51) 评论(0) 推荐(0)
摘要:原题链接 题解,请看题解区 ————能不能利用已经算过的值来减少后续计算量呢? 如果你too long on line 2:n为一的时候只输出零 code #include<bits/stdc++.h> using namespace std; int a[5005]={0}; int f[5005 阅读全文
posted @ 2024-02-17 15:15 纯粹的 阅读(141) 评论(0) 推荐(0)
摘要:原题链接 太妙了,请移步题解区,有用数学归纳法做的,也有用找规律做的 L型积木一定是成对出现的 code #include<bits/stdc++.h> using namespace std; const int mod=1e9+7; long long dp[10000005]={0}; int 阅读全文
posted @ 2024-02-17 14:26 纯粹的 阅读(156) 评论(0) 推荐(0)
摘要:原题链接 题解请移步题解区,相当详细 code #include<bits/stdc++.h> using namespace std; #define ll long long inline void read(ll &x) { x = 0; ll flag = 1; char c = getch 阅读全文
posted @ 2024-02-17 01:11 纯粹的 阅读(26) 评论(0) 推荐(0)
摘要:原题链接 题解 细节颇多看代码 code #include<bits/stdc++.h> using namespace std; struct unit { int s,e; }milk[5005]; bool cmp(unit a,unit b) { return a.s<b.s; } int 阅读全文
posted @ 2024-02-16 17:33 纯粹的 阅读(36) 评论(0) 推荐(0)
摘要:原题链接 题解1:单调栈+并查集? 单调栈特性:栈内元素大小和序号由栈底到栈顶具有单调性,本题大小单调减,序号单调增 维护:新元素入栈时,栈内剩余的所有小于该元素的元素出栈,并视新元素为集合首领,然后新元素入栈 查询:查询集合首领即可 code1 #define ll long long #incl 阅读全文
posted @ 2024-02-16 15:00 纯粹的 阅读(14) 评论(0) 推荐(0)
摘要:原题链接 题解 code #include<bits/stdc++.h> using namespace std; int fa[1005]; int finds(int now) { return fa[now]=(now==fa[now]?now:finds(fa[now])); } vecto 阅读全文
posted @ 2024-02-16 02:31 纯粹的 阅读(17) 评论(0) 推荐(0)
摘要:原题链接 题解 1.对于没有固定颜色的节点来说,每个节点只会有三种颜色,而这又是一棵树,树形dp由此而来 2.由相邻节点不同确定转移方程 3.即使有求模也可能要开long long code #include<bits/stdc++.h> using namespace std; #define l 阅读全文
posted @ 2024-02-15 22:13 纯粹的 阅读(66) 评论(0) 推荐(0)
摘要:原题链接 思路 并查集 然后看看是否存在上表面联通的洞与下表面联通的洞位于同一集合 code #include<bits/stdc++.h> using namespace std; double n,h,r; int fa[1005]; vector<int> up,down; struct { 阅读全文
posted @ 2024-02-15 21:12 纯粹的 阅读(40) 评论(0) 推荐(0)
摘要:原题链接 题解 1.总共有t秒,每一秒不是上升就是下降 2.要在救援队赶来之前把体力全部花光 code #include<bits/stdc++.h> using namespace std; int dp[3005][1505]={0};//代表第i秒使用j点体力的方案数 int main() { 阅读全文
posted @ 2024-02-15 20:02 纯粹的 阅读(32) 评论(0) 推荐(0)
摘要:原题链接 题解 存在某种问问题顺序使得答案最小,可是我们不知道排序的规律,遂试探 给定一种排序,交换任意相邻同学问问题顺序,对答案的改变如下: code #include<bits/stdc++.h> using namespace std; struct unit { int s,a,e,sum; 阅读全文
posted @ 2024-02-15 19:09 纯粹的 阅读(80) 评论(0) 推荐(0)
摘要:原题链接 题解,我觉得讲的足够好了 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n,m,i; cin>>n>>m; for(i=2;i<=m;i++) { 阅读全文
posted @ 2024-02-15 18:49 纯粹的 阅读(35) 评论(0) 推荐(0)
摘要:原题链接 题解 根据样例,观察到李白总共走 \(n+m\) 次,每一次不是遇到酒馆就是遇到花 故我们可以设 \(dp[i][0/1]\) 代表第 \(i\) 次遇到酒馆或花的方案数 但是我们发现这样的状态不好转移 故我们可以设 \(dp[i][0/1][k]\) 代表第 \(i\) 次遇到酒馆或花, 阅读全文
posted @ 2024-02-15 18:43 纯粹的 阅读(108) 评论(0) 推荐(0)
摘要:原题链接 题解 1.当存在某个矩阵符合题意时,所有小于该矩阵的矩阵都符合题意 这是我们就可以想到用双指针 code #include<bits/stdc++.h> using namespace std; int a[505][505]={0},sum[505][505]={0}; int n,m, 阅读全文
posted @ 2024-02-15 12:10 纯粹的 阅读(94) 评论(0) 推荐(0)
摘要:原题链接 题解 1.如何取出位于序列结尾的连续特征子串:给结尾添加一个断点,位于序列开头的同理 2.对于所有感染牛群(即连续 \(1\) 子序列),无论最初感染牛有几头,位于哪里,感染牛群形成的时间是一样的 3.初始感染牛越少,同一感染牛群形成的时间就越长 4.对于任意不位于边界的感染牛群而言,最晚 阅读全文
posted @ 2024-02-15 01:22 纯粹的 阅读(238) 评论(0) 推荐(0)
摘要:原题链接 思路 1.任意一轮出牌,只有三种选择 2.每一轮的得分只与当前一轮出的牌和上一轮出的牌相关 由此我们可以设 \(dp[i][j]\) 为第 \(i\) 轮,出牌 \(j\) 的得分 3.由于扣分机制,扣的分数与扣的次数有关,所以我们再加一层 \(dp\) 代表扣的次数 code,注意细节 阅读全文
posted @ 2024-02-14 23:37 纯粹的 阅读(233) 评论(0) 推荐(0)
摘要:原题链接 题解 一道思维题 由于闹钟是圆的,所以从任意一个分钟数调到另外任意一个分钟数最多要按多少次相当于从点0调到1~n-1任意一点最多要按多少次 可以把1~n看成一个一个点,就相当于单源最短路了 md,好巧妙 code #include<bits/stdc++.h> using namespac 阅读全文
posted @ 2024-02-12 18:15 纯粹的 阅读(51) 评论(0) 推荐(0)
摘要:原题链接 题解 再结合代码应该就能看得懂了吧。。。 至于赛时怎么想出来的。我是观察样例得出来的 时间复杂度 \(O(2·t·\sqrt{n})\) code #include<bits/stdc++.h> #define ll long long using namespace std; inlin 阅读全文
posted @ 2024-02-12 17:46 纯粹的 阅读(92) 评论(0) 推荐(0)
摘要:原题链接 题解 1.对于任意一点,只有被河蟹选中和没选中两种状态,变成了染色问题 对于任意一个染了白色的点,其周围的点必须是黑色 对于任意一个染了黑色的点,其周围的点必须是白色 所以初始点染黑色还是染白色答案都是一样的 2.任意两点之间不是绝对联通的,可能有多个图 code #include<bit 阅读全文
posted @ 2024-02-12 17:39 纯粹的 阅读(48) 评论(0) 推荐(0)
摘要:原题链接 题解 1.添加几条边,使得对于任意节点,都有环存在,且所在最小环的大小皆大于3 2.看成有中心点的散发图,最优添加情况为叶子节点相连 3.如果两个叶子节点的父节点为lca,那么这两个叶子节点不能直接相连 4.看成若干个菊花,每朵菊花的花瓣都是叶子节点,同一朵花上的花瓣不能直接相连,所有叶子 阅读全文
posted @ 2024-02-12 16:45 纯粹的 阅读(77) 评论(0) 推荐(0)
摘要:原题链接 题解 1.把分数中的除法用乘以逆元表示,在求模运算里的除法都可以用乘以逆元代替(如果除法的结果为整数),但是这里规定了可以用其表示,那就用其表示 2.读题 code #include<bits/stdc++.h> int mod=1e9+7; // 确保 mod 是一个整数 using n 阅读全文
posted @ 2024-02-12 15:08 纯粹的 阅读(30) 评论(0) 推荐(0)
摘要:原题链接 题解 由于时间限制过于严苛,遂采用线性递推方式 \(p=k·i+b\) , \((1\leqslant b <r<p)\) \(k·i+b=0\) \((mod\ p)\) 同时乘上 \(i^{-1}\ b^{-1}\) \(k·b^{-1}+i^{-1}=0\ (mod\ p)\) \( 阅读全文
posted @ 2024-02-12 12:19 纯粹的 阅读(34) 评论(0) 推荐(0)
摘要:原题链接 学习链接 题解 \(ax\ ≡\ 1\ (mod\ b) \implies ax\ =\ by+1 \implies ax-by\ =\ 1\ (y\in Z)\) 若 \(ax+by=c\) 有整数解,令 \(gcd(a,b)=e\) ,则有 \(a_1=\frac{a}{e}\) ,\ 阅读全文
posted @ 2024-02-11 00:24 纯粹的 阅读(39) 评论(0) 推荐(0)
摘要:原题链接 题解 对于任意剩余塔,都可以表示为以某个塔结尾的等差数列 code #include<bits/stdc++.h> using namespace std; int h[1005]={0}; int dp[1005][40005]={0};//代表以塔i结尾,等差为j的种类 int hax 阅读全文
posted @ 2024-02-10 22:34 纯粹的 阅读(24) 评论(0) 推荐(0)
摘要:原题链接 经过若干组数据发现贪心可行性后试图证明 请移步 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n,ans=0; cin>>n; int x=2e9 阅读全文
posted @ 2024-02-10 18:42 纯粹的 阅读(30) 评论(0) 推荐(0)
摘要:原题链接 题解 1.如果前 \(7\) 头牛能全部能拿到礼物,但是这前 \(7\) 头牛里有 \(4\) 头牛更新在前 \(4\) 的位置,请问第 \(8\) 头牛能否得到礼物? 答案是不行,因为前 \(4\) 头牛会在前 \(4\) 的位置形成循环 2.假如恰好第 \(x\) 头牛没有礼物,那么牛 阅读全文
posted @ 2024-02-10 17:52 纯粹的 阅读(35) 评论(0) 推荐(0)
摘要:原题链接 题解 看到使最不开心的一天尽可能的开心,这是要使最小值尽可能的不小,二分思路由此而来,剩余的就是贪心模拟 最坏时间复杂度约为 $ O(d·sum(H)) ≈ 5·10^4 · log2(5·10^{10}) ≈ 1777060.45$ 坑点:剩下的巧克力要在最后一天全部吃完 \(Code\ 阅读全文
posted @ 2024-02-09 20:55 纯粹的 阅读(80) 评论(0) 推荐(0)
摘要:原题链接 题解 本题用形象一点的话来说就是对某个区间内所有的值进行修改, 并且 修改与查询的关系 是 多次修改加最后一次查询 由于 区间内修改的值的斜率一定 所以我们可以这样设 \(k[i]\) 的含义是点 \(i\) 比点 \(i-1\) 多了多少 对 \(k[i]\) 进行加减操作的含义是 代表 阅读全文
posted @ 2024-02-09 18:36 纯粹的 阅读(39) 评论(2) 推荐(1)
摘要:原题链接 核心 设 \(p[i]\) 代表离 \(a[i]\) 左边最近的不同元素的位置 如果 \(p[i]\) 小于 \(l\) 代表区间内元素皆相同 传递规则: 如果 \(a[i-1]!=a[i]\) 那么 \(p[i]=i-1\) 否则 \(a[i]\) 的 \(p\) 就等于 \(a[i-1 阅读全文
posted @ 2024-02-08 23:20 纯粹的 阅读(28) 评论(0) 推荐(0)
摘要:原题链接 差分 分为传递和作用两部分 本题而言,k的传递是线性的 k的作用是前一个点到这个点的斜率 code #include<bits/stdc++.h> using namespace std; int height=0;//每个点的水高/水深 int k[1070000]={0};//会对x点 阅读全文
posted @ 2024-02-08 19:25 纯粹的 阅读(24) 评论(0) 推荐(0)
摘要:原题链接 反思 前缀和处理区间和问题 观察到男女数相同以及输入数据01,有一种互斥相消的感觉,我们可以令0为-1,当某个区间段的和为零,即某两个前缀和相同时,记录其最长距离 code #include<bits/stdc++.h> using namespace std; int main() { 阅读全文
posted @ 2024-02-08 00:01 纯粹的 阅读(78) 评论(0) 推荐(0)
摘要:原题链接 题解 很简单想到暴力,但是 \(O(n^2)\) 显然不行 所以要减少计算量,如何利用已经计算过的值而不是重新算一遍呢? 这道题最好看成有中心点的网状图,而不是树状图 随便取一个点 \(A\) 作为根节点,很容易计算其答案,如何计算以其他点为根节点的答案呢? 对于以根节点的邻边节点 \(B 阅读全文
posted @ 2024-02-07 23:16 纯粹的 阅读(68) 评论(0) 推荐(0)
摘要:原题链接 请直接看code #include<bits/stdc++.h> using namespace std; int n,m; struct edge { int to; int val; }; vector<edge> G[3005]; int son[3005]={0}; int dp[ 阅读全文
posted @ 2024-02-07 22:08 纯粹的 阅读(27) 评论(0) 推荐(0)
摘要:原题链接 总结 1.要学会动态规划这种思维方式,即定义状态和状态之间的转移 2.本题的难点在于如何将抽象的输入数据转换成树状结构处理和定义状态,这个定义状态让我想到了初中添加几何线,可能要多做题才能有感觉吧 3.有一定模拟的部分,这一部分要细心 \(Code\) #include<bits/stdc 阅读全文
posted @ 2024-02-07 19:38 纯粹的 阅读(27) 评论(0) 推荐(0)
摘要:原题链接 悟道 树形图看成线性结构? 抽象的说就是在图里选节点的问题,也是在树里选节点的问题 怎么想到这个方法的? 对于任意一棵树,其根节点要么选,要么不选,当根节点选的时候,其子节点可以选也可以不选,当根节点不选的时候,其子节点必须选 选子节点其实就是以子节点为根节点的树且选子节点的最小值 不选子 阅读全文
posted @ 2024-02-05 18:40 纯粹的 阅读(27) 评论(0) 推荐(0)
摘要:原题链接 前记 我觉得这道题用树形dp解释不太妥当 思路 当一道题无法用直观的模拟来实现的时候,我们要换个思路 1.对于一个有 \(N\) 个节点, \(N-1\) 条边的图,我们可以将其变为 随便抓取一个节点为根节点的树 的问题 2.就此我们发现一个事实,对于任意树而言,其答案最大值一定是某个节点 阅读全文
posted @ 2024-02-05 14:31 纯粹的 阅读(22) 评论(0) 推荐(0)