05 2024 档案
摘要:原题链接 一步一步来 1.假设D为1,你要怎么求? 每个点乘地铁的时间是唯一的,也就是说,如果我一开始先走一段路到A点再坐地铁,等价于我直接坐地铁到A点,下地铁的瞬间再次上车。 所以最优路径一定可以是先从起点乘地铁到某个点,然后再一直走路到终点 因此我们可以遍历 的每个点,求出在该点下车
阅读全文
摘要:原题链接 题解 贪心,我管这种叫做策略贪心,即按照某种顺序或者角度去贪心可以得到最优解 既然题目要求任意两点间最短路最小的同时,价格也最小,那么我们就按长度为第一关键字,花费为第二关键字排序。然后遍历所有边看看这条边能否使用 遍历过程的策略: 如果这条边加入后,这条边两端的节点之间的距离不变。 如果
阅读全文
摘要:原题链接 题解 一句话总结:使得 内的元素为1,且为所在列的唯一一个1,需要翻转哪些行? 在我看来,用了 随机概率异或哈希 code #include<bits/stdc++.h> #define ll long long using namespace std; mt19937
阅读全文
摘要:原题链接 题解 发现一串数字的lcm一定大于等于这一串数字的最大值,所以如果整个数组的lcm大于 ,直接输出n 否则,注意这里的思维,否则,剩余数字组成的lcm一定小于等于 且是 的因子 code #include<bits/s
阅读全文
摘要:原题链接 题解 数组内是否存在两个数,使得数组内所有元素都是它们俩其中之一的倍数 1.最小的元素肯定要选,因为没人是它的倍数 2.把所有能被最小元素整除的元素去掉之后,再选一个最小数 code #include<bits/stdc++.h> #define ll long long using na
阅读全文
摘要:原题链接 题解 和破环成链的过程很像 code #include<bits/stdc++.h> using namespace std; int a[105]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int flag=0; f
阅读全文
摘要:原题链接 开始 敲代码前问问自己:如何证明你的算法的正确性? 启发 我们一开始在节点1,假如有abcd四条边,且我们已知 从每条边出发到达终点的最短距离 且 请问我们要封 节点1 的哪条边? 答案显然是abc 那么好接下来我们走边d,假设到达了节点3,我
阅读全文
摘要:原题链接 题解 由易到难,先不考虑交替的事情,既然要尽量少的涂色,那么我最少要涂几条颜色的边?(由于图不一定联通,这里先考虑连通图的情况) 如果一条边处于一个环内,那么这个边就可以不涂色。 所以只要有环我就可以选择一条边不涂色,那么到最后,涂色的边构成一棵树 接下来考虑这颗树能否实现红蓝交替 要满足
阅读全文
摘要:原题链接 题解 有点像拓扑排序 拓扑排序怎么做来着?首先找老祖节点对不对?老祖节点有什么特性? 入度为零 而在无向图中,我们把叶子节点看成老祖节点,它们有什么特性? 连接的边只有一条 code #include<bits/stdc++.h> using namespace std; vector<i
阅读全文
摘要:原题链接 题解 1.请务必读清题干意思 2.如果以最顶端积木的位置为状态,是可以穷尽所有情况的,则状态为 ,最顶端第 层只在区间 内连续放置积木有几种方法 3.状态转移方程 $dp[i][l][r]=\sum_1^l \sum_r^m
阅读全文
摘要:原题链接 题解 假如最后有 个月购买过幸福,那么这 个月的价格一定是前 小的 code #include<bits/stdc++.h> #define ll long long using namespace std; int main() { ios::sync
阅读全文
摘要:原题链接 题解 我一开始想着二位前缀和+模拟,但是看到ab发现空间不够 观察到nm的数据范围限制 也就是点和查询的数量限制,考虑用优先队列把各个方向的点存起来以表示各个点的使用顺序,再用map嵌套表示各个点的使用情况 空间复杂度 时间复杂度 \(O(T(mlogn+nlogn))\
阅读全文
摘要:原题链接 题解 code #include<bits/stdc++.h> using namespace std; #define ll long long const ll mod=1e9+7; ll a[7][7]={0},e[7]={0}; void cf1() { ll tem[7]={0}
阅读全文
摘要:原题链接 题解 由于选择每一条路径的概率是一样的,所以我们统计出所有路径的条数,和长度之和,然后除一下就行了,除法求模等价于乘模数下的逆元 code #include<bits/stdc++.h> using namespace std; #define ll long long const ll
阅读全文
摘要:原题链接 题解 一句话总结:第 头奶牛继承场上 头奶牛里结束时间最短的 code #include<bits/stdc++.h> using namespace std; int n,t; int d[100005]; int check(int k) { priority_
阅读全文
摘要:原题链接 题解 反悔贪心 把工作按截至时间排序,每个工作有两个决策。 如果这个工作有时间做,那就做; 如果没时间做,就在已经做过的工作里取消价值最小的工作,换成当前工作(这里有一个前提,那就是每个工作需要的时间是一样的,而且当前工作的价值大于已经做过工作里价值最小的) code #include<b
阅读全文
摘要:原题链接 题解 注意数据范围 1.我们不知道要在哪些地方建站,所以考虑都遍历一遍 2.如果一个地方 要建站,那么在它前面且离它最近的一个站,一定建在所有右端点大于 的区间中,左端点最大区间里 所以我们令 表示为在 建立一个站,且和 \([1,i
阅读全文
摘要:原题链接 题解 1.每一天只有二种决策,第一是不买,第二是当天买过几天抛 第二种决策等价于当天买入第二天抛,原理如下 对于一只股票,我们在第 天买第 天卖,其效果可以被看为在第 天买,第 天卖 ,当天再买回来,第
阅读全文
摘要:原题链接 题解 题意提醒: 这里的时间段要抽象成点,比如 实际上是相连的!! 1.朴素想法,每头牛要么值班要么不值班, 搜索遍历所有情况 2.稍作修改,如果一头牛值班,那么在它值班结束时间之前值班的牛的数量一定是最优的, 3
阅读全文
摘要:原题链接 题解 1.朴素想法:链表存储+每次遍历一遍找出最小对 缺点:时间复杂度过高 改进措施:每次遍历一遍,只会挑走一对,剩下的会重复遍历,所以我们把所有的对都找出来放进堆里,每次挑出第一个没有被用到过的对 注意审题 code #include<bits/stdc++.h> using names
阅读全文
摘要:原题链接 题解 观察一个二分图会发现 同一组的节点不直接相连 二分图能够建立的最多的边等于 code #include<bits/stdc++.h> using namespace std; #define ll long long vector<ll> G[100005]; ll
阅读全文
摘要:原题链接 题解 真的bt啊 由于m没有限制所有测试用例的总和,所以m可以近似看为1e9,也就是说,除了输入以外,不能有任何对m的处理(常数乘上1e9) 考虑菊花图,任意两点之间最多只有一个陌生点,而且 所以找出那个没有出现过的中间点,作为菊花图的中心 md!!构造题!! cod
阅读全文
摘要:原题链接 题解 很巧妙,把等式移项之后,ab差最大的就是答案 code #include<bits/stdc++.h> using namespace std; #define ll long long struct node { int a,b,df,id; }c[200005]; bool cm
阅读全文
摘要:原题链接 题解 犯了对变量定义不清晰的错误 code #include<bits/stdc++.h> using namespace std; #define ll long long ll a[300005]={0}; vector<int> G[1005]; int dp[1005]={0};/
阅读全文
摘要:原题链接 题解 你怎么能在地图都没有输入完成的情况下判断呢? code #include<bits/stdc++.h> using namespace std; string s[505]; int xx[4]={0,-1,1,0},yy[4]={1,0,0,-1}; int main() { in
阅读全文
摘要:原题链接 题解 思考这类问题之前先考虑完成目标有几种方法,再考虑方法的可行性 code #include<bits/stdc++.h> using namespace std; int a[1005],b[1005]; int main() { int n,m; cin>>n>>m; for(int
阅读全文
摘要:原题链接 题解 1.多根树结构,但是将-1的点设为0的子节点,就变成了单根树 2.仔细读题!!!只要同一链上的就不能在一个组里 code #include<bits/stdc++.h> using namespace std; int depth[2005]={0}; vector<int> G[2
阅读全文
摘要:原题链接 题解 1.已知如果两个点之间有两条边不重合的路径,那么这两个点就在一个边强连通分量里,所以我们可以把处于同一个边强连通分量的点缩起来 在这里,我忘记了怎么求边强连通分量,所以我再提醒一下自己 已知树结构是不存在强连通分量的,它的特性是深度大的节点只有一条回到深度小的节点的边,所以我们深度搜
阅读全文
摘要:原题链接 题解 1.经过样例证明,双方的交换策略一定是自己最小值去换对面最大值 2.双方交换的最大值一定局限在双方各自初始最大值之间,最小值也是 code #include<bits/stdc++.h> #define ll long long using namespace std; int ma
阅读全文
摘要:原题链接 题解 突破口:我要让bob早点没得减,我肯定选最小的那个 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int x; cin
阅读全文
摘要:原题链接 题解 easy.ver::只能朝一个方向走,还剩奇数个格子时先手获胜 medium.ver: 令 为根节点,这样就只能朝子节点的方向走,设 为当以now为根的树,且now节点已经有一颗棋(其子节点均还没有)时,先手必胜1还是必败0,状态转移方程:\(
阅读全文
摘要:原题链接 题解 1.在一次op后,哪些东西发生了变化?哪些东西没变? 2.题目要求当一个u都没有的时候先手输,那么我一次op能减几个u? 3.通过分类讨论发现一次op总是使u的数量加减一个奇数,所以如果alice要赢,那么起始u的数量必须是奇数 code #include<bits/stdc++.h
阅读全文
摘要:原题链接 题解 从小正方形到大正方形,有四个变化方向,分别是左上、右上、右下、左上。 分类讨论模拟即可 code #include<bits/stdc++.h> using namespace std; int main() { int n,x,y; cin>>n>>x>>y; puts("Yes"
阅读全文
摘要:原题链接 题解 1.异或规则为不进位加法,可以看作位运算 2.查找的时间复杂度必不能高, 2.所以,补齐前缀0,这样就能用字典树了 code #include <bits/stdc++.h> using namespace std; #defin
阅读全文
摘要:原题链接 题解 看清楚题目,是三个人都坐在同一辆校车!! code #include<bits/stdc++.h> #define ll long long using namespace std; vector<ll> G[200005]; ll depth[200005]={0}; void d
阅读全文
摘要:原题链接 题解 太巧妙了!!! code #include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; int r=0,b=0,y=0; for(int i=1;i<=n;i++) { string s;
阅读全文
摘要:原题链接 题解 1.如果轮到我时场上有 颗石子,那么在我操作一步之后石子的范围是 2.如果轮到我时,场上有 颗石子,那么轮到对方走的时候,对方一定能走到k 3.记录所有 如果存在一个 \(k_i=n
阅读全文
摘要:原题链接 题解 1.复杂问题简单化,把字符用数字代替 2.每次替换都会减少一个字符,到最后一定是由两个字符合成一个字符,并且这两个字符的来源区间不相交 3.相同区间不同的合并方式,最后生成的字符也不同,所以dp多加一个状态 4.题目只问能否合成对应字符 code #include<bits/stdc
阅读全文
摘要:原题链接 题解 1.常见思路: 为把 内的元素全部消掉留下一个元素的值,然后枚举中间点 但是这样内存不够,观察到 ,我们可以换个思路,由于区间 内全部消掉留下一个元素的值 , 其中 \
阅读全文
摘要:原题链接 题解 关键因素: 与 至少有一位都是一 这是我第一份代码 #include<bits/stdc++.h> using namespace std; int a[100005],dp[100005]={0}; int main() { int n; ci
阅读全文
摘要:原题链接 题解 第 朵花的选择范围为 ,而它一定是由第 朵花的某种选择继承而来的 code #include<bits/stdc++.h> using namespace std; int n,m; int dp[105][105]={0},p
阅读全文
摘要:原题链接 题解 1.考虑到每个牛只有选或不选两种选择,这样暴力搜索的思路便产生了 2.还是上面的思路,怎么优化呢? 想想背包数组,其下标是什么?是体积 其值是是什么?是价值 是在体积相同的情况下选择价值最高的,本题也是,最优解一定是相同智商里情商最高的 3.价值和体积都是负数,怎么解决? code
阅读全文
摘要:原题链接 题解 1.把字符串倒过来,记作 其最大公共子串是回文串,所以这部分可以不用求,字符串长度减去最大公共子串的长度就是答案 2.怎么求最大公共子串的长度呢? 假设我们已经知道字符串a和字符串b及其所有子串的lbs,此时往字符串b末尾添加一个字符c变成字符串b1,而字符串a中以最
阅读全文
摘要:原题链接 题解 细节很多,看代码 code #include<bits/stdc++.h> using namespace std; string s; int num; int vis[55][100005]={0}; int ans[55][100005]={0}; int sou(int po
阅读全文
摘要:原题链接 题解 分解n的质因子,如果为奇数就补一个 由于大于 的质因子最多不超过一个,所以我们筛小于 的质数 code #include<bits/stdc++.h> #define ll long long using namespace std; vec
阅读全文
摘要:原题链接 题解 1.相当于把n个数的因子重新组合,使得组合为一体的数是强合数,经过试验发现,最少两个相同质因子就能合成一个强合数,最少三个不同质因子就能合成一个强合数,所以我们统计所有数的所有质因子个数 2.统计质因子用到了递归的方法,我们先筛合数,标记合数的最小质因子,然后逐层递归 code #i
阅读全文
摘要:原题链接 题解 1.数组最大能开到1e8 2.vector比数组容易mle 3.筛素数的时间复杂度是O(n) 4.由于一个数最多有 个因子,我们标记每一个合数的最小质因子,然后直接除就行(递归思想?) code #include<bits/stdc++.h> #define
阅读全文
摘要:原题链接 题解 关键因素:任何合数都可以分为最小质数乘上另外一个数 code #include<bits/stdc++.h> using namespace std; vector<int> ans; int main() { ios::sync_with_stdio(false); cin.tie
阅读全文
摘要:原题链接 题解 如果最小整除的数不是质数,那么把第一个数中的因子分出去,它就不是最小数 code #include<bits/stdc++.h> #define ll long long using namespace std; map<ll,ll> vis; int main() { int n;
阅读全文
摘要:原题链接 题解 如果第一个出场的是 那么,接下来只能用 和大于零的数 如果第一个出场的是 那么,接下来只能用 和大于零的数 如果第一个出场的是大于零的数,那么接下来的 可以补全其左边的空, 可以补全其右边的空 code
阅读全文
摘要:原题链接 题解 有一个隐含逻辑,n个程序员会齐心协力地使保留的算法不止一个 当 时,每个程序员各投一个,这样保留了n个算法 当 时,如果想要不止保留一个算法,那么最后保留的算法一定能被n整除,也就是说,n一定有一个因子小于m code #includ
阅读全文
摘要:原题链接 题解 1.二分查找前缀出现次数,用 优化查找算法 code #include<bits/stdc++.h> using namespace std; char s[200005]; int pre[200005]={0},occ[200005]={0}; int n,x;
阅读全文
摘要:原题链接 题解 1.如果能分成偶数个区间,那么一定能分为两个区间 2.如果能分为奇数个区间,那么一定能分为三个区间 3.能分为两个区间,说明区间异或和为 4.能分为三个区间,这三个区间分别为区间 ,则 区间异或和为零, 区间异或和为零 co
阅读全文
摘要:原题链接 题解 集合内元素最大不超过 ,最小不小于 如果按对角线排列,则可以得到所有偶数,把其中一颗棋子往旁边移,可以得到所有奇数 code #include<bits/stdc++.h> using namespace std; int main() { int t;
阅读全文