07 2024 档案
摘要:原题链接 题解 对于硬币数变为零的点,由于既不能穿越,也不能选取,所以等于删掉了 所以操作就变成了,选取一个点,删除以其为根的树的所有叶子节点 先将树退化成链,考虑链上操作的情况,如果选取链上端点,总节点数只减一,否则减二 因此对于树上任意一条链,每次选取会导致要么减一要么减二,因此只考虑最长链的长
阅读全文
摘要:原题链接 题解 朴素做法: 每次询问,二分最小边,然后bfs遍历查看是否能到达,时间复杂度 优化: 如果答案里的最小边是 ,那么代表所有边权不小于 的边都可以使用,因此可以直接从大到小加入边,直至起点与终点连接 时间复杂度
阅读全文
摘要:原题链接 题解 易得当区间异或和不为完全平方数的时候合法 朴素做法: 遍历所有区间,看看异或和是不是完全平方数 优化: 异或是可以交换运算顺序的,如果区间 异或和为完全平方数,那么代表 其中k为完全平方数 也就是说,\(
阅读全文
摘要:原题链接 题解 如果一个 ,其前面没有出现过 ,那么回合数+1,我们令这样的数叫做断点 因此交换两个数 不会影响 内的断点 code #include<bits/stdc++.h> #define ll long l
阅读全文
摘要:原题链接 题解 设 为指向当前无法到达的最小值的指针,初始为1 1.如果有面值为1的硬币,那么p变成2,否则答案为零 如果有面值为1的硬币,那么p变成2 如果有面值为2的硬币,那么p变成3 以此类推,如果此时p为n,且有一枚面值不大于n的硬币k,那么p此时变成 n+k 因为p为n的意思是
阅读全文
摘要:原题链接 题解 考虑从左到右第一个在游客范围里的公寓,显然把这个公寓分给范围里最左边的游客最优,因为右边的游客更高概率遇到公寓 code #include<bits/stdc++.h> #define ll long long #define lowbit(x) ((x)&(-x)) using n
阅读全文
摘要:原题链接 题解 任何塔,其顶上要么有竖线,要么没有 假设已知 所有塔情况数,那么可以通过拉伸第 层的方块 或 放置两个 的方块 或 放置一个 的方块得到 层塔 而拉伸分为拉伸左边、拉伸右边和都拉伸,如果能
阅读全文
摘要:原题链接 题解 假设我们已经知道了答案 ,那么 不成立的原因是不管怎么分,能分的数量最小的子数组个数不会小于 据此,我们发现,能分的最少子数组数随着 的减小而增大,因此答案一定是所有分的最少子数组数的sum里最小的那个
阅读全文
摘要:原题链接 题解 解法1:暴力 枚举所有区间,判断是否合法 优化性质1:如果一个区间合法,那么其所有子区间都合法 解法2: 枚举所有点,查看以其为右端点时,最小的左端点(性质一) 优化性质2:这个最小的左端点,随着右端点的递增不会递减 解法3: 枚举所有点,查看以其为右端点时,最小的左端点,但是这个左
阅读全文
摘要:原题链接 题解 一个合法的括号序列,满足 长度为偶数 前缀和处处不小于0 左括号等于右括号数量 code #include<bits/stdc++.h> #define ll long long #define lowbit(x) ((x)&(-x)) using namespace std; co
阅读全文
摘要:原题链接 题解 对于第一个元素,只有两种状态,要么取了,要么没取 如果取了,其能得到最大值的配置是唯一的 没取也是一样
阅读全文
摘要:原题链接 题解 非交叉匹配 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll mod = 1e9+7; ll qpow(ll a, ll b) { ll res = 1; while (b)
阅读全文
摘要:原题链接 题解 只要求最大值和最小值的差尽量小,也就意味着,权值位于最大值和最小值之间的线段可以任意取 也就是说,我们将线段按权值排序,我们只需要取其中一段区间,然后查看是否覆盖了完整的区间,如果是,判断能否更新最小值 这样看起来是两次for循环找区间,对于查看是否完整覆盖区间的部分,看起来是对区间
阅读全文
摘要:原题链接 题解 看到数据范围,想到二进制表示所有已经上去的人的集合的最小乘坐次数,做法为遍历所有子集再遍历所有子集 时间复杂度 太高了 考虑优化,对于同一个集合、同样最小乘坐次数,总有电梯有空位,而空位越大的乘坐配置越优 依照
阅读全文
摘要:原题链接 题解 在日期上设计 无后效性 但是 发现真空点去掉对答案也没有影响,故对所有线段的端点离散化处理,然后再做无后效性处理 code #include<bits/stdc++.h> #define ll long long using namespace std; const
阅读全文
摘要:原题链接 题解 看到“最大值”“曼哈顿距离”,我们不禁想到转换成切比雪夫距离之后求最大值 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll inf=1e8; struct node { ll
阅读全文
摘要:原题链接 题解 暴力:二进制表示所有状态 为了减少重复运算:设计一个数组,代表 为某值的时候最小的 但是还需要知道吃了多少个:再加一层状态不就好了 code #include<bits/stdc++.h> #define ll long long using namespac
阅读全文
摘要:原题链接 题解 when you are asked to find the “k-th whatever-est something,” binary search is often adopted as the first step of the solution 以 为半径的线
阅读全文
摘要:原题链接 题解 把美丽看成 1+有多少相邻的不同的连接块 这样就能贡献来做了 code #include<bits/stdc++.h> #define ll long long using namespace std; ll a[100005]; void solve() { ll n,q; cin
阅读全文
摘要:原题链接 题解 关系具有矢量特性,因此可以带权并查集维护 code #include<bits/stdc++.h> #define ll long long using namespace std; int fa[50006]; int val[50006]; int finds(int now)
阅读全文
摘要:原题链接 题解 暴力方法: 遍历每个节点,遍历每个节点的子节点,遍历每个子节点的子节点,看看子子节点是否是节点的子节点,时间复杂度 优化 考虑无向边建边的时候建成有向边,且两个点建边时,度数小的指向度数大的,如果度数相等,编号小的指向编号大的(其实这一步是为了避免重复计数)(
阅读全文
摘要:原题链接 题解 贪心的每次挑选当前最大的,但是要挑选k次,因此我们没法去遍历挑选的过程,因此我们考虑最终形态,由于每次挑选最大的元素,因此最后所有数一定不超过某个数,二分由此而来 code #include<bits/stdc++.h> #define ll long long using name
阅读全文
摘要:原题链接 题解 采取这么个策略:由于要尽可能多地吃药,所以从左到右贪心地把所有药都吃掉,如果遍历到某个点时,生命值出现负数,那么就把之前吃过的药吐出来 这样是否是最优的呢? 如果存在更优方案,代表可以吐另外一批,但是吐另外一批不会更优 code #include<bits/stdc++.h> #de
阅读全文
摘要:原题链接 题解 性质:取奇数位置相加,取偶数位置不相加 经过若干次实验,可以得到删除第 个数,对 个数的奇偶性不造成影响 因此,我们试着从最末尾开始删 (无后效性) 如果末尾是负数,不用管 如果末尾是正数,如果是奇数位置,直接相加 如果末尾是正数,如果是偶数位置,
阅读全文
摘要:原题链接 题解 真的是无中生有了 从左到右遍历,维护两个颜色的嵌套深度(如果把左括号看成+1,右括号看成-1,那就是维护最大和) 如果遇到右括号,给目前和较大的那个,如果遇到左括号,给较小的那个 code #include<bits/stdc++.h> #define ll long long us
阅读全文
摘要:原题链接 题解 每个点只有喝和不喝两种状态,因此我么可以遍历所有状态,查看合法并cost最小的方案 优化: 考虑什么时候输出-1,当且仅当存在一个 i 点,使得 把 i 前面所有的饮料喝完还是够不到 ,这样的性质引导我们去想:如果存在合法方案,当且仅当对于所有的点,其存在某种喝法使
阅读全文
摘要:原题链接 题解 先看成前缀和,这样就是维护 两点之间的权值 如果是false,代表存在矛盾,且矛盾出现在回路 我们可以把这个回路之前的元素看成一个集合,如果新加入的边使得原先两点间的权值不等便失效 而对于一个集合里的元素,由于相加具有矢量特性,所以我们维护集合
阅读全文
摘要:原题链接 题解 首先对于约束,建边,我们跑最短路,由于 T 非负整数,且图可能不连通,所以我们建立超级源点,并建立指向每一个节点的边 由于差分约束表示的是所有元素的相对大小,所以最后的答案要减去图中最小的节点 无解的情况为出现负权环
阅读全文
摘要:原题链接 题解 减少对方多少,就会扣自己多少,因此判断 即可。 code #include<bits/stdc++.h> #define ll long long using namespace std; void solve() { int n,m; cin>>n>>m; ll s
阅读全文
摘要:原题链接 题解 缩点+差分约束,求最小值故跑最长路 无解的情况:存在正权环,由于是有向图,所以环上的元素在一个强连通分量内,判断强连通分量内存不存在有正权值的边,然后缩点,拓扑跑一圈 缩点时要一个超级源点就可以只dfs一次了 code #include <bits/stdc++.h> using n
阅读全文
摘要:原题链接 题解 一步一步来,当 的时候,怎么分? 当 时,两个点集之间的距离等于两个点集中各取一个点之间的最小距离,我们联想到最小生成树的建立过程,按边权从小到大依次加入,如果两个点所属集合不同便合并 因此,当 的时候,答案是最小生成树的最后一个合并边
阅读全文
摘要:原题链接 题解 首先,考虑如何分配卫星电话使得 最小是比较困难的,所以我们考虑怎样的 D 可以使得卫星电话个数不小于联通块个数 由于 D 越小,联通块个数也就越小,所以具有单调性,考虑二分 优化: 最后的答案,一定是所有连通块内部,距离最长的树边(即失去该边之后,联通块变得不连通),由此
阅读全文
摘要:原题链接 题解 任何数一定可以被二进制表示下最低位的一及以下的二次方数整除 code #include<bits/stdc++.h> #define ll long long #define lowbit(x) ((x)&(-x)) using namespace std; void solve()
阅读全文
摘要:原题链接 题解 假设当前状态下,所有1 的异或值为 x ,0的异或值为 y,对区间 进行翻转之后,对 的改变是 y 同理 进入下一状态,该性质也成立 线段树做法 对于修改的区间,懒标记记录该区间修
阅读全文
摘要:原题链接 题解 首先,考虑接下来往哪颗树飞是很困难的,因为当前的决策会影响之后的决策 但是如果考虑到达当前树从哪里飞过来就比较好了,因为无后效性 接着我们可以暴力做法,遍历每棵树从前 个树飞过来的值,然后取最小的那个,但是这样显然会超时,所以我们优化一下 有哪些值得被优化的地方?--有很
阅读全文
摘要:原题链接 题解 先求出以所有最长回文子串,然后记录以每个点作为回文串的右端点时的最小左端点和作为回文串的左端点时的最大右端点 code #include<bits/stdc++.h> #define ll long long using namespace std; int r[200005],l[
阅读全文
摘要:原题链接 题解 手写栈存放已经匹配过的位置和每个位置匹配的进度,每次匹配成功就回溯,相当于删除子串 code #include<bits/stdc++.h> #define ll long long using namespace std; int con[1000006],pre[1000006]
阅读全文
摘要:原题链接 题解 经典的状压dp code #include<bits/stdc++.h> #define ll long long #define lowbit(x) ((x)&(-x)) using namespace std; int sit[105]; int dp[505][505][4];
阅读全文
摘要:原题链接 题解 如果 k+1 是质数,且 n+1 内没有 k+1 的倍数,那么只需要一天 否则 只需要两天 如果 k+1 不是质数,第一天产生的质数会在第二天布满所有数 如果 k+1 是质数,那么 k+1 ~ 2k+2 之间一定有一个质数,也能布满所有数 实施 首先要判断 k 是不是质数 \(O(\
阅读全文
摘要:原题链接 题解 由于 ,所以全部异或起来 code #include<bits/stdc++.h> #define ll long long using namespace std; void solve() { int n; cin>>n; int a
阅读全文
摘要:原题链接 题解 正难则反 不可能发生越狱的清空: 从左到右,第一个人有m种选择,第二个人为了和前面一个人不一样,有 m-1 种选择。。。 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll m
阅读全文
摘要:原题链接 题解 尽量直观地理解单调队列的作用 首先,对于合法的一段,有如下性质 A 满足: 当前的最高温度大于等于前面的最大的最低温度 该性质对于段内每一个数都满足,所以对于第 天,我们可以找其前面的第一天 的最低温度大于 的最高温度,同时还要满足 \((j,i]
阅读全文
摘要:原题链接 题解 每次move,两人之间的距离要么-2,要么不变,所以如果两人的距离是奇数肯定抓不到 如果两人是偶数,则想要使两人之间的距离不变,必须要往与猎人所在位置相反的方向跑,由于会撞墙,所以经过若干次move之后,两人距离-2是必然发生的,无限次move后,距离一定会为0 code #incl
阅读全文
摘要:原题链接 题解 我们知道奇数无法整除偶数,所以可以构造一个全是奇数的序列 code #include<bits/stdc++.h> #define ll long long using namespace std; void solve() { int n; cin>>n; for(int i=1;
阅读全文
摘要:原题链接 code #include<bits/stdc++.h> #define ll long long using namespace std; void solve() { int n; cin>>n; vector<int> p(n+4); for(int i=1;i<=n;i++) ci
阅读全文
摘要:原题链接 题解 在bob操作之后,alice可以选一个与bob一样的数补充,因此,最后的s为初始s加初始alice添加的元素,所以alice第一次要添加mex初始s code #include<bits/stdc++.h> #define ll long long using namespace s
阅读全文
摘要:原题链接 题解 1.猜想最少需要n个黑格子(一字排开) 反证:如果需要少于n个黑格子,则至少有一行空缺,至少有一列空缺,空行和空列交叉的地方可以证明不成立 猜想要么每一列放一个,要么每一行放一个 反证:如果一行放两个,则一定有一行空缺,且由于不确保没有列不空缺,所以会有空行空列交叉点 3.根据上述总
阅读全文
摘要:原题链接 题解 要让abc不同,我们可以先固定ab取两个较小值,然后看看最大的 c 有没有重复 code #include<bits/stdc++.h> #define ll long long using namespace std; void solve() { int n; cin>>n; i
阅读全文
摘要:原题链接 题意 每次只能对 个数减一,可以减任意次,但是 以内的数相对大小不变 减前 个数可以让第一个小于第二个 2 可以让前第二个小于第三个 4 可以让第四个小于第五个 即 始终能做到 所以要保证非二次方的
阅读全文
摘要:原题链接 题解 假如 1 成立,23 不成立,代表对于 所有相等 的 ,存在 ,但是不存在 所以找出两个不同的、出现次数大于1的数,然后这两组分别附上 12,23,其他数赋值1,因为不会产生任何情况123 实施 首先找出两个数,然后
阅读全文
摘要:原题链接 题解 1.如果初始乘起来小于等于0,由于操作无法使该乘积更小,所以不用再修改 2.否则代表初始值大于零,随便找一个地方改成 0 3.注意由于 a 很大,所以要用统计的方式来判断乘积的性质 code #include<bits/stdc++.h> #define ll long long u
阅读全文
摘要:原题链接 题解 1.首先要解决的问题是,怎样的窗口能包裹住尽可能多的星星? 这里有一个很巧妙的思维点,那就是我们构造一个以星星为左下角的矩形,矩形重叠的部分可以构造一个右上角在其中的窗口,这样这个窗口就能覆盖矩阵重合的星星 2.这样,问题就转换成了求最大并矩阵权值和(表示窗口的右上角在某个矩阵内),
阅读全文
摘要:原题链接 看成区间相交个数,查询右端点大于等于当前左端点的区间个数减左端点大于当前右端点个数
阅读全文
摘要:原题链接 题解 二分图,分为两类,一类是指向,一类是被指向 在这里,只需要建立情人之间的边就行,因为找情人能否成功 code #include<bits/stdc++.h> #define ll long long using namespace std; vector<int> G[10000];
阅读全文
摘要:原题链接 题解 设花为 1 ,花盆为 0,我们先确保花之间有空隙,即 接下来再插入 个花盆进入 1 与 1 之间 则有 种插法(相当于m个黑球,n个白球有几种排列方法) 再乘上 ,即花与
阅读全文
摘要:原题链接 题解 由于模拟会爆 longlong,所以用线段树维护每次操作的值,初始每次操作的值均为1 操作一令对应节点变为 m 操作二令对应节点变为 1 返回整棵树的值(相乘) code #include<bits/stdc++.h> #define ll long long using names
阅读全文
摘要:原题链接 题解 细节 所有字符的回文半径初始化为 1 rmax=1 ans=1 code #include<bits/stdc++.h> #define ll long long using namespace std; void solve() { string s; cin>>s; string
阅读全文
摘要:原题链接 题解 每行有 a 个,所以总共有 个 每列有 b 个,所以总共有 个 所以要满足 想象一下这个场景:每一行,每次往当前列中,最左端的一最少的列的开始连续放置1 code #include<bits/stdc++.h>
阅读全文
摘要:原题链接 题解 细节 1.划分数组时要用原本的代码,而不是排序后的代码 2.更新划分数组时一些参数要更新 code #include<bits/stdc++.h> #define ll long long using namespace std; int a[200005],b[200005]; v
阅读全文
摘要:原题链接 题意 树中任意一条路径上黑色点的数量不超过两个,请问存在多少种树 分析 先随便找一个节点作为根节点,然后分类讨论 假如根到叶子节点的路径上有两个黑色节点,则不能再添加其他点了 如果根到叶子节点的路径上有一个黑色节点,则可以还可以在不在这条路径上的地方放黑色节点 在弄清楚规则后,就可以用dp
阅读全文
摘要:原题链接 题解 dp+多次优先队列 设 为 区间内,前 个最大值(有可能不足k个)(注意 是一个序列) 则 \(dp[i]=\{dp[j][t]+a[j+2][i],j\in[0,i-2],t\in[0,top_j]\} ,\s
阅读全文
摘要:原题链接 题解 矩阵,每行选一个,求前 小的值 等价于 矩阵每行选一个构成的前 小的值任选一个,与第 行 个数任选一个,其和的前 小 无限递推。。。。 变成了两个长度为 的序列,从两个序列
阅读全文
摘要:原题链接 题解 在一个章节更新过后,更新其周围章节的首次阅读时间,如果周围章节在其后面,时间不变,如果在其前面,时间加一 当一个章节的前置章节都更新完之后再更新其周围章节 code #include<bits/stdc++.h> #define ll long long using namespac
阅读全文
摘要:原题链接 题解 假如 该如何添加? 然后逐步推导 code #include<bits/stdc++.h> #define ll long long using namespace std; int a[200005]; bool cmp(int x,int y) { if(x%2!
阅读全文
摘要:原题链接 题解 往内看,一个 n 个节点的多边形,最多能划分 n-2 个三角形(对于 ( k + 1 ) 个顶点的多边形,可以选择任意一个顶点,并引出一条条对角线把它分割成一个三角形和一个剩下的 ( k ) 边形。) 往外看,而在图中,如果两个关键节点的距离==2,ans++ code #inclu
阅读全文
摘要:原题链接 题解 先想算法,再验证 假设最优排列,使得 在 s 的第 i 个位置第一次匹配,那么 i 之前的数都浪费掉了,我们可以将其收起来放到后面用 所以,最优排列一定可以是从第一个位置开始匹配 为了最大化利用数字,每右移若干个位置就要有一次匹配,而对于每一次成功匹配,最少要右移 kmp
阅读全文
摘要:原题链接 题解 假如两个区间经过操作之后得到的字符串一样,说明不规则仅出现在两个区间的重合处 code #include<bits/stdc++.h> #define ll long long using namespace std; int l0[200005]={0}; int r1[20000
阅读全文
摘要:原题链接 题解,看到数学式子要想到转化!!! 前半部分是定值,所以要使 \((\s
阅读全文
摘要:原题链接 题解 想象一条 有 n 个 1 的链,每个 1 之间一条边相连,每次操作最多破坏 k-1 条链 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll N=114514; ll func
阅读全文
摘要:原题链接 题解,先去考虑算法,再去解决时间复杂度的问题 假如一定要选 个,瓶子,那么我一定是选 尽量大(容量大),且 也尽量大的(少搬运),那么对于相同的 选择 更大的 所以三维dp,时间复杂度够 code #i
阅读全文
摘要:原题链接 题意 选择 个数,使得 最大 实施 遍历n个数,每更新一个数,就更新所有的2的因子和5的因子,然后记录每种个数下,最小需要的k 但是会T 1.二维背包dp,使因数 5 和 2 达到某一值的最小选择个数,但是因子数量最多有 3600
阅读全文
摘要:原题链接 题解 背包,但是同一行不同个数的物品放进背包里会导致重合,因此在遍历背包容量的时候一起遍历一行所有的个数,避免了冲突 code #include<bits/stdc++.h> #define ll long long using namespace std; int dp[10005];
阅读全文
摘要:原题链接 题解,没有思路的时候先想想暴力 1.观察观察再观察,对于每个计划而言,所完成的任务是唯一的,所以要完成任务 ,相当于在能完成 的计划集合里,选择若干个计划,使得其总耗时最小,且完成的超过 100 2.这种包含两种属性限制的集合选择,不难想到背包,即相同耗时,记录完成度
阅读全文
摘要:原题链接 题意 挑选一部分书放第一层,另一部分放第二层,要求第二层的宽度不超过第一层的长度, 实施 对于同一长度的第一层,第一层的宽度和越大,第二层宽度和越小,因此以长度为容量,宽度为价值跑背包数组 细节 滚动数组要注意更新的方向!! code #include<bits/stdc++.h> #de
阅读全文
摘要:原题链接 题意简述 在序列中选择若干个数,使得其 且对应代价最小 实施 假设答案里, 是最后一个选的,代表 前面存在某些数的组合的 与 互质 背包+状压 再遍历前面的数 和状态,代表选 时,数 \(
阅读全文
摘要:原题链接 题解 最大值,要么是原本就有,要么是一段向左加一的区间的左端点的值(经过操作之后) 因此,我们可以枚举每一个 能达到的最大值(作为左端点),这样的最大值越大,所需要的 越大,因此我们可以二分该最大值,然后查看能否在给定的 内得到 code #incl
阅读全文
摘要:原题链接 题解 1.如果限定在 天内买完,那么限定在 天内也能买完,二分浮现。 2.如果要买 ,那么一定是在这 天内 价格最低的那天一次买齐,且优先买价格低的 3.优先买 单价x汇率 最低的那个 co
阅读全文
摘要:原题链接 题解 正着来发现很怪,倒着来发现顺多了 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll N=114514; ll tree[8*N]={0}; ll tag[8*N]={0};
阅读全文
摘要:原题链接 真恶心 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll N=114514; ll a[200005],d[200005]; bool solve() { ll n; cin>>n
阅读全文
摘要:原题链接 题解 找出大于对应平均数的部分。。。 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll N=114514; ll a[100006]; void solve() { ll n; c
阅读全文
摘要:原题链接 题解 连续两次对同一位操作等于没操作 连续两次对不同位操作等于交换 奇数次操作会改变01的数量 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll N=114514; const i
阅读全文
摘要:原题链接 题解 给定若干条路径限制,问是否合法 对于树上任意三个点 (不一定直接相连),如果已知 那么 也已知 所以我们可以对限制里相连的节点放到一个集合里,并且统一记录他们到集合头领的路径异或值 由于奇
阅读全文
摘要:原题链接 题解 先随便找一条直径,然后标记这些边,然后看看直径上的点有没有不需要经过标记边的路径,使得其长度等于该点到直径端点的路径长度 code #include<bits/stdc++.h> #define ll long long using namespace std; struct edg
阅读全文
摘要:原题链接 题解 由于树上任意一点 到其他点的最大距离 ,其中 为直径,易得直径中点该值最小(其他点都要经过中点) 所以两棵树合并要使直径最短,一定是中点相连,但是因为我们只查询直径,所以不需要真的去找中点在哪,只需要维
阅读全文
摘要:原题链接 题解 题目要求有多少个点,其到标记点的最远距离不超过 看到这个我们不难想到树的直径:设直径端点 ,树上任意一点 到叶子节点的距离 所以,我们把标记点看成叶子节点,并找出相距最远的一对标记点 \(a
阅读全文
摘要:原题链接 题解 仍然是见微知著,假设已知当前数组及其所有子数组的最小删除个数,这时往数组的前面添加一个元素,则这个数要么被删掉,要么作为领头 code #include<bits/stdc++.h> #define ll long long using namespace std; int a[20
阅读全文
摘要:原题链接 题解 1.假设有一个以标记点 为根的子树,且子树内没有其他标记点,易得该子树内所有点的 ,所以我们可以把该子树内的非标记点全部删掉 2.完成步骤1之后,图就变成了所有叶子节点均为标记点的树 3.题目等价于求该树内,最小的点到边界的最大值,也就是求树的
阅读全文
摘要:原题链接 题解 1.易得当 为奇数时,答案肯定为 2.当 为偶数时,经过 条边返回原点的最短路径可以看成从原点出发经过 条边之后的最短路径(这样一来也没有了终点的限制) 3.这里用到了见微知著的思维,即假设已知某点经过
阅读全文
摘要:原题链接 题解 code #include<bits/stdc++.h> #define ll long long using namespace std; ll dp[1000005] = {0}; void solve() { ll n, ans = 0; cin >> n; string s;
阅读全文
摘要:原题链接 题解 对于这种无序点对统计问题,我们可以遍历每一个点,然后计算其与之前遍历过的点的配对 遍历,设 代表遍历到当前节点时,有多少可与当前节点配对的、节点颜色为 的、且 序小于当前节点(即之前遍历过的)的节点 维护方法:每往子节
阅读全文
摘要:原题链接 题解 固定一个点作为树的根,易得任意一条链,都可以以某个点作为最高点,且链的两端到最高点之和为 那么不难想到遍历每个点作为最高点 那么接下来就变成了在子树里选两个端点,使得到该点的距离之和为 这种无序点对统计,我们可以顺序遍历,然后对于每一个遍历到的点,计算之前与遍
阅读全文
摘要:原题链接 题解 暴力:遍历所有点为根节点的情况,然后遍历子节点,统计众数,时间复杂度 优化:上面的算法时间复杂度之所以为 是因为算父节点时,子节点又重新算了一遍,所以我们可以在算父节点时,保留一个子树的贡献,然后其他子树的贡献暴力遍历一遍 运用重链剖分,每
阅读全文
摘要:原题链接 题解,构造太难想了 当 在二进制表示下,只有一个1时,肯定不行 如果有两个1呢? 在这种情况下,如果 最大的一位,位于 最大的一和第二大的一之间,一定失败 为什么? 分类讨论即可 反之是否成立? 设 最大的一位 ,第二大的位 \(b
阅读全文
摘要:原题链接 题解 考,纯纯找规律,对于区间 ,其元素一定能全部变成 遍历所有区间优先修改覆盖之后能增加 且区间大小更小的区间 code #include<bits/stdc++.h> #define ll long long using names
阅读全文
摘要:原题链接 题解 观察样例解释,不难想到在四个角上询问 对左上和右下询问会得到一条或者两条平行斜线,命名为 再对左下角询问,会得到一条与的斜线垂直的斜线 ,这条斜线一定与 某条线相交,且交点是其中一个井 如何查找交点?设交点为 ,假设与左上角询
阅读全文
摘要:原题链接 题解 由于答案之和最小的两个数有关,所以我们可以把数组排序 然后遍历数组,对于第 个数,遍历其所有因子 ,统计 前面有多少数与 的 实施 预处理所有数的因子,然后从大到小遍历,时间复杂度
阅读全文
摘要:原题链接 题解 我们知道,三角形成立的条件是任意两边之和都要大于第三边,因为这里已经明确了三条边的大小关系,即 所以,该三角形成立的条件是 看到 我们不难想到遍历其中某条边的长度 这里我遍历的是 遍历 ,找
阅读全文
摘要:原题链接 题解 对于数 来说,如果其当前位置到最终位置上,有 个数不在最终位置,那么数 至少要走 次 如果这 个数里,有 个在数 回到最终位置时,提前回到了最终位置,那么数 要走 次 具象
阅读全文
摘要:原题链接 题解 每次操作都会是排序后的元素差值减一,所以答案为初始序列最大值加上最大差值 用STL的multiset维护差值和序列值 注意特判n=1时没有差值 code #include<bits/stdc++.h> #define ll long long using namespace std;
阅读全文
摘要:原题链接 题解 仔细研究样例,发现扣除的娱乐值与看多少电影无关,只与看的最后一部电影是什么时候看的有关 code #include<bits/stdc++.h> #define ll long long using namespace std; ll solve() { ll n,m,d; cin>
阅读全文
摘要:原题链接 题解 1.一定是一部分怪物被水属性咒语打死,另一部分被火属性咒语打死 2.遍历所有“部分”,然后看各部分被水属性咒语打死需要累积多少秒的水咒语 这里用到了背包数组,(1e6·100)也可以? code #include<bits/stdc++.h> #define ll long long
阅读全文
摘要:原题链接 题解 不要犯复制黏贴的错误 code #include<bits/stdc++.h> #define ll long long using namespace std; struct op { ll id,len; }; ll a[105][105]; ll dp[105][105][15
阅读全文
摘要:原题链接 题解 1.如果两个障碍物之间的助跑距离不足,那么这两个障碍物只能一次跳过去 2.由于可以自由选择跳跃距离,所以我们可以在第一个障碍物之前起跳,最后一个障碍物之后落地,这样留给助跑的距离就会多 3.小细节注意一下 code #include<bits/stdc++.h> #define ll
阅读全文
摘要:原题链接 题解 任意交换两个数,会使序列的逆序对数加减一个奇数。(不懂的,请打开线性代数紫本第七版第五页) 所以如果两个序列,初始逆序对数的奇偶性不同,肯定无法兑换成功 那么,如果两个序列,初始逆序对数的奇偶性相同,是否一定能对换成功? 答案是一定可以的,我们做相邻对换,由于相邻对换总是可以操控逆序
阅读全文
摘要:原题链接 题解 由于数位很大,所以要朝着数位方向想,对于从左到右数第 位,其贡献为 位组成的数字*10 + ,等于 区间放到了答案的 code #include<bits/stdc++.h> using
阅读全文
摘要:原题链接 题解 alice只有两种决策 一个也不选 选 个以上 如果选 个以上,bob肯定会使其中 最大的 个免费,所以我们干脆把 降序排序,然后遍历第 小的 ,由于这 个数无论怎么选都是赔,所以我们我
阅读全文
摘要:原题链接 题解 笛卡尔树的定义如下:任意一颗子树都代表一段连续的区间,且子树的根节点是该区间的最大值,根的左边的元素下标均比根小(二叉搜索树性质),子节点均比父节点大(堆的性质) 我们讲如何实现的 设即将要插入的元素为 栈内的元素为前 个元素构成的笛卡尔树从根一直走右
阅读全文
摘要:原题链接 题解 1.当10个数不一致时,无论怎样都不成立 2.当01个数一致时,是否一定存在某种方法使得成立呢? 3.对于长度为 的字符串 ,若不合法,那我在旁边添加一个01,则我们可以连续删除两边的配对数字,且至少能删除一对,且经过若干轮的删除一定能使字符串长度减小 总的来说
阅读全文
摘要:原题链接 题解 分类讨论 1.需不需要插入? 2.能不能插入? code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; string
阅读全文
摘要:原题链接 题解 1.alice的策略一定是从小到大一个一个拿 2.为了让alice拿不到某特定值的蛋糕,bob需要在alice拿它之前把它拿完 3.在最优策略中,bob一定可以从小拿到大 4.设此时bob要拿完第 类蛋糕,该类蛋糕个数为 则拿完这个蛋糕bob还有 \(i-k-
阅读全文