合集-洛谷
摘要:原题链接 我曾经写题时有个疑惑,那就是会不会算力恢复之后大于最大算力? 其实不会,把消耗的算力想象成占领,恢复算力想象成撤离,不管怎么恢复,领地都是那个领地。 #include<bits/stdc++.h> using namespace std; int power[200005]={0}; st
阅读全文
摘要:1. 利用map实现速查,优点是代码简洁,缺点是速度慢,内存大 #include<bits/stdc++.h> using namespace std; int a[200005]={0}; int main() { int n,c; scanf("%d%d",&n,&c); map<int,int
阅读全文
摘要:原题链接 题解 每次从所有果子堆中选重量最小的两堆并累加,观察到只需要找出 最小 因此考虑用堆,而当你对于堆的理解足够深之后,可以用c++ 的 priority_queue 代码 #include<bits/stdc++.h> using namespace std; int pile[10005]
阅读全文
摘要:原题链接 非常详细的题解见洛谷,个人见解见代码 方法一:倍增法 #include<bits/stdc++.h> using namespace std; #define N 500005 vector<int> G[N];//链树,以链上的元素为根节点的树 void add(int x,int y)
阅读全文
摘要:原文链接 枚举即可 #include<bits/stdc++.h> #define ll long long using namespace std; int s[14]={0}; int main() { ll n; scanf("%lld",&n); for(int i=1;i<=9;i++)s
阅读全文
摘要:原题链接 详解见题解区,个人见解见代码,蒟蒻真的折服于dalao的思路 #include<bits/stdc++.h> #define ll long long using namespace std; ll dp[20][210][1026]={0}; ll counts(int now) { l
阅读全文
摘要:不能用dijkstra算法 的原因(个人拙见): 题解 1.思想导论 对于没有负环的图中能到达的任意一个节点,从1出发的最短路径,途中经过的点至少有2个,最多为n个(包括两端)。 设经过的点数为路径的长度 2.思想落实 设cnt[i]为到达i的最短路径的最大长度,每更新一次长度,就更新一次cnt[i
阅读全文
摘要:原题链接 1.审题 1.使得转账后 B 收到 100 元。 2.互相转账 3. z%的手续费(z<100) 2.思路 1.dijkstra算法(很讨厌这种算法名字):把已探访过的点的下一个点中“ ‘还没探访过的点’的更新”放进堆里,堆里弹出未探访点的第一个更新便是该点的最值 2.准备工作,把所有的边
阅读全文
摘要:原题链接 点拨: 运用动态规划的思路 对于一给定的字符串,其未来和现在有什么关系? 假如其过去已知,其现在和过去有什么? 细节 当两端相等时,继承不一定比从中间合起来要小 代码 #include<bits/stdc++.h> using namespace std; int main() { int
阅读全文
摘要:原题链接 导入 1.对于一个给定的序列,最后一个加进来的元素不是最左端就是最右端,如果是最左端,那么代表去掉最左端的序列中最后一个加进来的元素比最左端小,最右端同理。 2.对于一个给定的序列,可能的排序结果无非两类,一类是以最左端的元素结尾的,一类是以最右端的元素结尾的。因此设\(sum[i][j]
阅读全文
摘要:原题链接 导入 1.假如你是老头,你每次关灯最多有两个选择: 一.关最左边的灯 二.关最右边的灯 而你的目的是:使总耗电量最小 Q:那我能不能每次选去关功率大的那个灯呢? A:不行,因为耗电量还与时间有关 Q:那我能不能每次选去关 路程(时间)\(*\)功率 较大的灯(即贪心)呢? A:不行,假设这
阅读全文
摘要:前言 翻遍洛谷题解,看到大家都在套模板,却很少有人讲出为什么,使我十分崇拜天赋哥。 原题链接 关于这题的一些事实性证据 事实1.来自 事实2.来自 事实3.来自 事实4.来自 整理上述事实 1.每一次”最短“最优涂色,要么在其他颜色的基础上涂,这称之为融入一个整体;要么另辟蹊径单独找一块地涂,这称为
阅读全文
摘要:原题链接 前情提要 题目不难看懂,即求a->b过程中的所有点的延迟和。显然可以暴力遍历一遍完成,但是时间复杂度太高了。 改进算法 想象这个图是由点和线组成的,把其中一个点提起来,这样就变成了一个树(n叉树),任意两点(a,b)间的延迟和等于a->lca->b,其中lca为ab两点的最近公共祖先 这样
阅读全文
摘要:原题链接 洛谷题解很详细,自己写了些理解在代码注释里 代码 #include<bits/stdc++.h> using namespace std; int atch[50005]={0}; int vis[50005]={0}; vector<int> G[505]; int weiy(int n
阅读全文
摘要:原题链接 题解说的很详细,我来讲讲我对为什么要用异或判断的想法 异或为零是先手必败状态的一个属性,我们通过属性来判断类别。 代码 #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) {
阅读全文
摘要:原题链接 总结 1.搜索其实就是全部遍历一遍,只不过可以把遍历过的,以及接下来一看就知道不用遍历的不去遍历,也就是剪枝 2.一定要明确自己所设的搜索函数各个变量的含义!! 代码 #include<bits/stdc++.h> using namespace std; int n,k; int a[3
阅读全文
摘要:原题链接 思路 找到所有入度为零的点,然后消除其子节点的入度,再把入度为零的点塞入队列中 为什么可以这么做呢? 一个点能弹出队列,其父节点一定比他先入队,以此类推。。 代码 #include<bits/stdc++.h> using namespace std; vector<int> G[1000
阅读全文
摘要:原题链接 题解 1.在处理最短路的时候,我们采用优先队列的方法,即第一个出现的点一定是最小的,之后出现的点都是在其他点的基础上叠加的值,肯定不小于第一个。那么依然是这个思路,第二个出现的点一定是次短的。 代码 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:原题链接 首次尝试用chatgpt帮我写注释 code #include<bits/stdc++.h> using namespace std; int main() { int n; // 声明整数变量 n,用于存储输入序列的长度 cin >> n; // 读入序列长度 // 定义两个优先队列,q
阅读全文
摘要:原题链接 方法1: 有点像剪枝。 \(i\)从\(1\)~\(n\)循环,\(j\)同理,如果\(a[i]+b[j]\)放不进去,那么\(a[i]+b[j+1]\)也放不进去 code #include<bits/stdc++.h> using namespace std; int a[100005
阅读全文
摘要:原题链接 题后感 码量也太大了吧 小记 题解网上有,但是有关这个lazytag我要提一嘴,我建议不要记它,你只需知道修改的区间没有整体破坏时,其内部的元素内容暂不做修改 code 码量真大 #include<bits/stdc++.h> #define ll long long using name
阅读全文
摘要:原题链接 题解 dp的核心在于,增加一颗根节点时,以其为根节点的$ ans = max( \sum_{}^{}子节点不选 + r[new],max(\sum_{}^{}子节点选 , \sum_{}^{}子节点不选) ) $ code #include<bits/stdc++.h> using nam
阅读全文
摘要:原题链接 题解 好抽象啊,类背包问题,在增加一个根节点时,其最大值是由若干个子节点保留若干个树枝形成的 最关键的在于设二维数组把树枝的根数算在内,可能是因为以该节点为根节点的树保留q根树枝的最大值具有无后效性吧 而且答案需要用到其子节点保留q1,q2...(太抽象了) code #include<b
阅读全文
摘要:原题链接 一道经典树形dp,你会了二叉苹果树那么这个也会了 细节已写在代码里,一定要清楚设的变量和函数的含义 code #include<bits/stdc++.h> using namespace std; int s[305]={0}; vector<int> son[305]; int ans
阅读全文
摘要:原题链接 题目重点 1.有向图 2.跑的 路径 最少能被分割为几段长度为\(2^k\),因为每段路长度为\(1km\) 3.有自边 算法设计思考 1.在无背景、k=0的情况下,这题就是一个普通的dp(即floyd) 2.加上了约束条件,当某两个点的距离为\(2^k\)时,可以在1s内到达 3.相当于
阅读全文
摘要:原题链接 题解,\(O(1)\)做法 简述 先从两个骰子入手,得出\([b+1,a+1]\)内的数出现次数最多 然后再加一个骰子相当于把分布图向右平移c个单位的过程中,每平移一个单位的长度累加和,也就是以c为宽的矩形方框的截面积 然后分类讨论,一定是把方框放在中间偏左位置是最优解 code #inc
阅读全文
摘要:原题链接 前情提要,如果对期望的概念不清晰,请点击这里 我犯的错误:因为每条路只走一遍,而错误地判断每条路的概率相同 题解 1.对于任何一个节点来说,设其出边有\(len\)条,其子节点的期望长度为\(sum[j]\) 则该节点的期望长度为\(\frac{\sum sum[j]}{len}\),根据
阅读全文
摘要:原题链接 题记 就是线段树,不过树和延迟标记有点绕 code #include<bits/stdc++.h> using namespace std; struct SegmentTree { vector<int> tree, lazy;//tree代表这个节点开着灯的数量,lazy代表这个节点是
阅读全文
摘要:原题链接 code #include<bits/stdc++.h> using namespace std; #define ll long long ll a[100005]={0}; ll lazyadd[400005]={0}; ll lazymul[400005]={0}; ll tree[
阅读全文
摘要:原题链接 题解1,种30棵树,每棵树代表每种颜色,树的每个节点代表这个颜色在对应区间上是否存在 code #include<bits/stdc++.h> using namespace std; int st[32][400005]={0}; int lazy[32][400005]={0}; vo
阅读全文
摘要:原题链接 反思,debug不出来就赶紧看题解把! 题解 双指针,双指针有好几种,这个是像弹簧(窗口)一样的双指针,右指针一直往右走,当成立时,左指针一直往左走直到不成立 code #include<bits/stdc++.h> using namespace std; int a[1000006]=
阅读全文
摘要:原题链接 前记 1.环的问题可以转换成遍历以所有元素开头的链 2.对于某一条链,其最大值等于中间某两段最大值的乘积,这样就把大问题转换成了小问题 细节请看代码 #include<bits/stdc++.h> #define ll long long using namespace std; ll p
阅读全文
摘要:原题链接 方法一 看到区间和,自然想到前缀和 用双指针维护 code #include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; vector<int> pres(n+5); pres[0]=0; for(int
阅读全文
摘要:原题链接 题解 1.拆环成链 2.最后一颗留下来的珠子一定是的头标记一定是某个原珠子\(A\)的头标记,尾标记一定是珠子\(A\)右边n个单位的珠子的尾标记 3.对任意最大值而言,最后一颗一定是某两个珠子的合并后产生的,所以我们可以在区间内断点遍历 \(Code\) #include<bits/st
阅读全文
摘要:原题链接 题解 最近做的题目有点多,感觉没什么好讲的,某个最大值一定是由连续区间上的节点操作后得来的 \(Code\) #include<bits/stdc++.h> using namespace std; int f[105][105][2]; int main() { memset(f,-0x
阅读全文
摘要:原题链接 前记 我觉得这道题用树形dp解释不太妥当 思路 当一道题无法用直观的模拟来实现的时候,我们要换个思路 1.对于一个有 \(N\) 个节点, \(N-1\) 条边的图,我们可以将其变为 随便抓取一个节点为根节点的树 的问题 2.就此我们发现一个事实,对于任意树而言,其答案最大值一定是某个节点
阅读全文
摘要:原题链接 悟道 树形图看成线性结构? 抽象的说就是在图里选节点的问题,也是在树里选节点的问题 怎么想到这个方法的? 对于任意一棵树,其根节点要么选,要么不选,当根节点选的时候,其子节点可以选也可以不选,当根节点不选的时候,其子节点必须选 选子节点其实就是以子节点为根节点的树且选子节点的最小值 不选子
阅读全文
摘要:原题链接 总结 1.要学会动态规划这种思维方式,即定义状态和状态之间的转移 2.本题的难点在于如何将抽象的输入数据转换成树状结构处理和定义状态,这个定义状态让我想到了初中添加几何线,可能要多做题才能有感觉吧 3.有一定模拟的部分,这一部分要细心 \(Code\) #include<bits/stdc
阅读全文
摘要:原题链接 请直接看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[
阅读全文
摘要:原题链接 题解 很简单想到暴力,但是 \(O(n^2)\) 显然不行 所以要减少计算量,如何利用已经计算过的值而不是重新算一遍呢? 这道题最好看成有中心点的网状图,而不是树状图 随便取一个点 \(A\) 作为根节点,很容易计算其答案,如何计算以其他点为根节点的答案呢? 对于以根节点的邻边节点 \(B
阅读全文
摘要:原题链接 反思 前缀和处理区间和问题 观察到男女数相同以及输入数据01,有一种互斥相消的感觉,我们可以令0为-1,当某个区间段的和为零,即某两个前缀和相同时,记录其最长距离 code #include<bits/stdc++.h> using namespace std; int main() {
阅读全文
摘要:原题链接 差分 分为传递和作用两部分 本题而言,k的传递是线性的 k的作用是前一个点到这个点的斜率 code #include<bits/stdc++.h> using namespace std; int height=0;//每个点的水高/水深 int k[1070000]={0};//会对x点
阅读全文
摘要:原题链接 题解 本题用形象一点的话来说就是对某个区间内所有的值进行修改, 并且 修改与查询的关系 是 多次修改加最后一次查询 由于 区间内修改的值的斜率一定 所以我们可以这样设 \(k[i]\) 的含义是点 \(i\) 比点 \(i-1\) 多了多少 对 \(k[i]\) 进行加减操作的含义是 代表
阅读全文
摘要:原题链接 题解 看到使最不开心的一天尽可能的开心,这是要使最小值尽可能的不小,二分思路由此而来,剩余的就是贪心模拟 最坏时间复杂度约为 $ O(d·sum(H)) ≈ 5·10^4 · log2(5·10^{10}) ≈ 1777060.45$ 坑点:剩下的巧克力要在最后一天全部吃完 \(Code\
阅读全文
摘要:原题链接 题解 1.如果前 \(7\) 头牛能全部能拿到礼物,但是这前 \(7\) 头牛里有 \(4\) 头牛更新在前 \(4\) 的位置,请问第 \(8\) 头牛能否得到礼物? 答案是不行,因为前 \(4\) 头牛会在前 \(4\) 的位置形成循环 2.假如恰好第 \(x\) 头牛没有礼物,那么牛
阅读全文
摘要:原题链接 题解 对于任意剩余塔,都可以表示为以某个塔结尾的等差数列 code #include<bits/stdc++.h> using namespace std; int h[1005]={0}; int dp[1005][40005]={0};//代表以塔i结尾,等差为j的种类 int hax
阅读全文
摘要:原题链接 学习链接 题解 \(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}\) ,\
阅读全文
摘要:原题链接 题解 由于时间限制过于严苛,遂采用线性递推方式 \(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)\) \(
阅读全文
摘要:原题链接 题解 1.添加几条边,使得对于任意节点,都有环存在,且所在最小环的大小皆大于3 2.看成有中心点的散发图,最优添加情况为叶子节点相连 3.如果两个叶子节点的父节点为lca,那么这两个叶子节点不能直接相连 4.看成若干个菊花,每朵菊花的花瓣都是叶子节点,同一朵花上的花瓣不能直接相连,所有叶子
阅读全文
摘要:原题链接 题解 1.对于任意一点,只有被河蟹选中和没选中两种状态,变成了染色问题 对于任意一个染了白色的点,其周围的点必须是黑色 对于任意一个染了黑色的点,其周围的点必须是白色 所以初始点染黑色还是染白色答案都是一样的 2.任意两点之间不是绝对联通的,可能有多个图 code #include<bit
阅读全文
摘要:原题链接 题解 一道思维题 由于闹钟是圆的,所以从任意一个分钟数调到另外任意一个分钟数最多要按多少次相当于从点0调到1~n-1任意一点最多要按多少次 可以把1~n看成一个一个点,就相当于单源最短路了 md,好巧妙 code #include<bits/stdc++.h> using namespac
阅读全文
摘要:原题链接 思路 1.任意一轮出牌,只有三种选择 2.每一轮的得分只与当前一轮出的牌和上一轮出的牌相关 由此我们可以设 \(dp[i][j]\) 为第 \(i\) 轮,出牌 \(j\) 的得分 3.由于扣分机制,扣的分数与扣的次数有关,所以我们再加一层 \(dp\) 代表扣的次数 code,注意细节
阅读全文
摘要:原题链接 题解 1.如何取出位于序列结尾的连续特征子串:给结尾添加一个断点,位于序列开头的同理 2.对于所有感染牛群(即连续 \(1\) 子序列),无论最初感染牛有几头,位于哪里,感染牛群形成的时间是一样的 3.初始感染牛越少,同一感染牛群形成的时间就越长 4.对于任意不位于边界的感染牛群而言,最晚
阅读全文
摘要:原题链接 题解 1.当存在某个矩阵符合题意时,所有小于该矩阵的矩阵都符合题意 这是我们就可以想到用双指针 code #include<bits/stdc++.h> using namespace std; int a[505][505]={0},sum[505][505]={0}; int n,m,
阅读全文
摘要:原题链接 题解 根据样例,观察到李白总共走 \(n+m\) 次,每一次不是遇到酒馆就是遇到花 故我们可以设 \(dp[i][0/1]\) 代表第 \(i\) 次遇到酒馆或花的方案数 但是我们发现这样的状态不好转移 故我们可以设 \(dp[i][0/1][k]\) 代表第 \(i\) 次遇到酒馆或花,
阅读全文
摘要:原题链接 题解,我觉得讲的足够好了 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++) {
阅读全文
摘要:原题链接 题解 存在某种问问题顺序使得答案最小,可是我们不知道排序的规律,遂试探 给定一种排序,交换任意相邻同学问问题顺序,对答案的改变如下: code #include<bits/stdc++.h> using namespace std; struct unit { int s,a,e,sum;
阅读全文
摘要:原题链接 题解 1.总共有t秒,每一秒不是上升就是下降 2.要在救援队赶来之前把体力全部花光 code #include<bits/stdc++.h> using namespace std; int dp[3005][1505]={0};//代表第i秒使用j点体力的方案数 int main() {
阅读全文
摘要:原题链接 思路 并查集 然后看看是否存在上表面联通的洞与下表面联通的洞位于同一集合 code #include<bits/stdc++.h> using namespace std; double n,h,r; int fa[1005]; vector<int> up,down; struct {
阅读全文
摘要:原题链接 题解 1.对于没有固定颜色的节点来说,每个节点只会有三种颜色,而这又是一棵树,树形dp由此而来 2.由相邻节点不同确定转移方程 3.即使有求模也可能要开long long code #include<bits/stdc++.h> using namespace std; #define l
阅读全文
摘要:原题链接 题解 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
阅读全文
摘要:原题链接 题解1:单调栈+并查集? 单调栈特性:栈内元素大小和序号由栈底到栈顶具有单调性,本题大小单调减,序号单调增 维护:新元素入栈时,栈内剩余的所有小于该元素的元素出栈,并视新元素为集合首领,然后新元素入栈 查询:查询集合首领即可 code1 #define ll long long #incl
阅读全文
摘要:原题链接 题解 细节颇多看代码 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
阅读全文
摘要:原题链接 题解请移步题解区,相当详细 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
阅读全文
摘要:原题链接 太妙了,请移步题解区,有用数学归纳法做的,也有用找规律做的 L型积木一定是成对出现的 code #include<bits/stdc++.h> using namespace std; const int mod=1e9+7; long long dp[10000005]={0}; int
阅读全文
摘要:原题链接 题解,请看题解区 ————能不能利用已经算过的值来减少后续计算量呢? 如果你too long on line 2:n为一的时候只输出零 code #include<bits/stdc++.h> using namespace std; int a[5005]={0}; int f[5005
阅读全文
摘要:原题链接 题解,好多细节。。 1.构建st表时的细节 2.数越多,按位与的结果越小,所以对于 \(f(l,i)\) 存在 \(r_{max}\) 使得 \(i>r_{max}\) 时 \(f(l,i)<k\) 小于等于时相反,故具有单调性 但是,在倍增结构上二分你玩原神玩多了? 向右遍历即可,直到
阅读全文
摘要:原题链接 题解 千万要仔细读题呀! 解释一下为什么要和右边的植物来回走来长高: 对于第一个植物,肯定是往右边,对于第二棵植物,左边的植物已经达到高度了,右边可能达到了高度,也可能没有,往右边肯定是更优解 code #define ll long long #include<bits/stdc++.h
阅读全文
摘要:前景导入 当 \(t\in [1,2]\) 时,本题如何求解? 答:树形dp 设 \(f[i]\) 为以 \(i\) 为根的树,根节点的晶蝶已消散且儿子节点的晶蝶还未被惊动,能获得的最大晶蝶数。 则有状态转移方程 \(f[i]=(\sum f[u])+max(a[u])\) ,其中 \(u\) 为
阅读全文
摘要:原题链接 题解 游戏规则总结一句话: 安娜要尽可能删掉后导零(翻转),萨沙要尽可能保护后导零(连接),问剩余数字的位数能否达到 \(m+1\) 位 直接模拟即可,统计每个数后导零的长度, 然后按照安娜先手的规则求出能保留多少位后导零,最后判断长度 code #include<bits/stdc++.
阅读全文
摘要:原题链接 题解 我们令 a出现在b前面 \(\to\) 建立一条a到b的有向边 如果有强连通分量,那么no 每张截图除了第一个人,其余人均按相对位置排序 这道题就变成了给定若干个相对位置,求是否存在可能的绝对位置 我们可以建图,作拓扑排序,一个节点能被遍历到当且仅当其所有的父节点都被遍历到 当且仅当
阅读全文
摘要:原题链接 题解,请看这里 细节 有除法的求模要求逆元 code #include<bits/stdc++.h> #define mod 998244353 #define ll long long using namespace std; inline void read(ll &x) { x =
阅读全文
摘要:原题链接 题解 一开始我想的是每个节点要么建,要么不建,可是这样一来不好转移,因为有如下情况(黑色代表建站) 于是我们换一个角度思考,我们发现一个点要能通网,有三种情况: 1.自己建站 2.儿子建站 3.父亲建站 Code #define ll long long #include<bits/std
阅读全文
摘要:原题链接 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
阅读全文
摘要:原题链接 题解 多次单点修改加上多次区间查询 线段树 code #include<bits/stdc++.h> using namespace std; int tree[800005]={0}; int a[200005]={0}; void build(int node,int l,int r)
阅读全文
摘要:原题链接 题解 区间修改+单点查询 对于一个点,查询的时候翻转的次数如果是奇数,是1,如果是偶数,是0 所以题目转变成对区间上的点加一,然后求单点的奇偶性 树状数组 对一串序列加1,相当于对其差分序列的 \([l]++,[r+1]--\) code #include<bits/stdc++.h> u
阅读全文
摘要:原题链接 题解 标准的线段树加上一点点题意转化,注意细节 code #define ll long long #include<bits/stdc++.h> using namespace std; ll tree[810000]; ll wait[810000]; inline void read
阅读全文
摘要:原题链接 题解 一只青蛙 \(x\) 天来回跳 $\to $ 一只青蛙从左往右跳 \(2x\) 次 \(\to\) \(2x\) 只青蛙从左往右跳一次 规律:对于任意长度为 \(y\) 的区间,其区间和一定不小于 \(2x\) 证明过程请看题解区,非常优雅 upd: 如果想从起点跳到石头上,那么前y
阅读全文
摘要:原题链接 题解 1.暴力模拟 对每条边枚举(枚举之前先对边排序),然后对除去枚举边之外的边做并查集 code1: #include<bits/stdc++.h> using namespace std; struct unit { int x,y; }edge[5005]; bool cmp(uni
阅读全文
摘要:原题链接 题解 由于执行收获操作后所有数组清零,清零后的数组最快捷的加分方法是加一收获一,所以就是第一次加多少次 然后第一次加完最多收获 \(n\) 分,相当于清零后执行总共 \(2n\) 次 所以只需要判断第一次加 &[0,2n-1]& 次加后收获时能收获多少就行了 code,注意细节 #incl
阅读全文
摘要:原题链接 题解 对于原序列而言,如果第一个元素是最大值或最小值,那么l肯定不能落在这,由于r也不可能落在这,所以相当于这个元素被剔除了 那么对于区间 \([1,n]\) 的研究就等价于对 \([2,n]\) 的研究 由此可以推出之后的做法 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
阅读全文
摘要:原题链接 题解 好抽象啊!!! 大概思路就是把强连通分量看作一个点,然后在此基础上找入度为零的点 code #include<bits/stdc++.h> using namespace std; vector<int> G[205]; int in[205]={0};//代表强连通分量的入度 in
阅读全文
摘要:原题链接 题解,请看题解区第一篇,看一遍就会了 code #include<bits/stdc++.h> using namespace std; int fa[400005]={0}; int finds(int now) { return fa[now]=(fa[now]==now?now:fi
阅读全文
摘要:原题链接 题解 先说结论 对单个图做深度搜索树,对于树的根节点,它要能是割点当且仅当她有至少两个不互通的儿子节点 对于树的非叶子非根节点,它要能是割点当且仅当存在儿子节点能去的时间戳最小的节点不小于当前节点的深度搜索序 对于叶子节点, 不可能成为割点 code #include<bits/stdc+
阅读全文
摘要:原题链接 题解 唯一能解释的图片,黄色代表会执行入栈操作的点 code #include<bits/stdc++.h> using namespace std; int vis[500005]={0}; int low[500005]={0}; stack<int> q; vector<int> a
阅读全文
摘要:原题链接 题解 和点双连通分量不同在于 点双联通分量:分量内任意两点之间至少有两条独立路径可走,两条路径所经过的点除了起点和终点都不同 边双连通分量:分量内任意两点之间至少有两条独立路径可走,两条路径所经过的边都不同(包括重边) 用这个图依然可以解释 code #include<bits/stdc+
阅读全文
摘要:原题链接 题解 首先,题目确保这是一个图 那么我们进行缩点,把边双连通分量的点缩点,然后统计叶子节点,也就是连接数为1的节点 要注意有重边的存在,那么我是怎么处理的呢?把两点之间的直接边只能出现一次,那我就作二维数组统计 code #include<bits/stdc++.h> using name
阅读全文
摘要:原题链接 题解 设前半部分对两个集合贡献的差为a,后半部分贡献为b 若 \(a==b\) 则 差为a的组合数(被选上,和在哪个集合无关)sa 与b的组合数的sb 此时对答案的贡献为 \(sa·sb\) 所以穷举所有差的组合,然后累加 设差为集合A-集合B 每个元素对差的贡献有三种可能,要么加要么减要
阅读全文
摘要:原题链接 题解 折半搜索 前半部分的所有组合(二进制表示)存起来,然后遍历后半部分的组合,找到第一个加起来不大于M的 = code #define ll long long #include<bits/stdc++.h> using namespace std; inline void read(l
阅读全文
摘要:原题链接 题解 单点修改线段树,向上更新,再注意下转移方程就行了 code #include<bits/stdc++.h> using namespace std; int tree[800005]={0}; int len[800005][2][2]={0};//代表第几个节点,0/1在左/右边的
阅读全文
摘要:原题链接 题解 非常抽象的缩点 大概思路:搜索缩点成有向图,求该点的入度和出度,最后答案一定是 \(max(in,out)\) 总之很抽象 code #define ll long long #include<bits/stdc++.h> using namespace std; inline vo
阅读全文
摘要:原题链接 题解 计算分数是搜索 存储前缀注意细节 code #include<bits/stdc++.h> using namespace std; #define ll long long ll sco[35][35]={0}; string pre[35][35]; ll a[35]={0};
阅读全文
摘要:原题链接 题解 巧妙的背包问题 我可以用按顺序遍历城堡,顺便表示出遍历到当前城堡时用掉了多少兵力,这样是可以穷尽所有兵力派送情况的 同时把这个城堡里的敌方兵力升序排序,然后遍历,表示为了消灭所有兵力小于等于ta的敌人所加的分 code #include<bits/stdc++.h> using na
阅读全文
摘要:原题链接 题解 设 \(sum\) 为总能力 则若 \(sum\) 是 \(F\) 的倍数 \(\to\) \(sum\ mod\ F=0\) 根据加法求模的特性,我们可以设 \(dp[i][j]\) 为 加上第 \(i\) 个元素后, 模为 \(j\) 的方案数 转移方程移得 注意一个细节:按照遍
阅读全文
摘要:原题链接 题解 太妙了 如果能出去,那么出去的时间一定为让我出去的那个垃圾掉落的时间,且在此之前我所在的高度能撑到我垃圾掉落 如果出不去,我肯定一直呆在井底不动 所以我们可以以高度为变量 设每个高度能撑到的最久的时间 而每个垃圾在拿到的一瞬间要么吃要么搭,所以我们穷举,两个都要,如果搭,那么搭上去的
阅读全文
摘要:原题链接 题解 遍历主件,和还剩下多少钱的情况下,最多有五种购买决策 1.不买 2.买主件 3.买主件+附件1 4.买主件+附件2 5.买主件+附件1+附件2 如果当前的钱够买,那就买买看,然后加上剩下的钱能买的最大值 code #include<bits/stdc++.h> using names
阅读全文
摘要:原题链接 题解 核心技巧:两次搜索 第一次搜索: 搜索出 \(f[now][i]\) 以 \(now\) 为根节点的子树且距离根节点恰好为 \(i\) 的节点的个数 搜索完了之后,把范围 \(k\) 以内的累加 第二次搜索: 由于整棵树的根节点的 \(f\) 等于整棵树里距离不大于 \(k\) 的节
阅读全文
摘要:原题链接 题解 我们发现,当前的决策会影响未来的结果,因此我们把当前的决策存下来,这样等未来要用的时候就有的转移了,如果未来由多个状态决定,那就现在把那些状态都记录下来 我们发现,一个点如果能被吸收,那么其左边或右边的一个区间的点都肯定被吸收了,所以我们记录 \(f[i][j]\) 表示区间 \([
阅读全文

浙公网安备 33010602011771号