01 2023 档案
摘要:LightOJ - 1162 Min Max Roads 题解:在线倍增LCA和模拟ST表 让我们求从$u->v$最短路径上的边权最大值和边权最小值,那么我们可以利用倍增思想,类似其$fa[u][i]$数组代表从$u$往上跳$2^i$步的点这一思想,我们可以建立两个二维数组$dmax[u][i],d
阅读全文
摘要:POJ - 1094 Sorting It All Out 题解:Floyd传递闭包 A<B A<C B<C C<D B<D A<B 首先他给你这些关系,比如说:A<B,B<C我们很容易就能推出啊A<C,显然满足传递性,所以我们利用传递闭包求解,题目表示如果中途发现顺序混乱或者中途发现顺序确定,就可
阅读全文
摘要:POJ - 1797 Heavy Transportation 题解:Dij最短路变形 题意:让你求从起点1到起点n的每条路径权重最小值的最大值,显然可以二分答案,但是我们这边考虑利用dij求解。 首先来一个样例: 1 2 3 1 3 4 2 3 5 2 4 5 3 4 3 我们会发现题目想要表达的
阅读全文
摘要:OpenJ_Bailian - 1088 题解:DFS记忆化搜索 记忆化搜索也可以说是动态规划,最后的答案也是从一个个子问题推导而来 #include <bits/stdc++.h> #define Zeoy std::ios::sync_with_stdio(false), std::cin.ti
阅读全文
摘要:POJ - 3687 Labeling Balls 题解:反向建边+拓扑排序 先来简单讲一下题意:我们把重量1-N的小球贴上标签,题目给出的输出a->b,就代表贴着标签a的小球必须比贴着标签b的小球轻,最后按照标签1-N输出每个小球的权重,同时如果答案多组,我们要输出权重字典序最小的答案 直接看第一
阅读全文
摘要:CodeForces - 510C Fox And Names 题解:建图+拓扑排序 首先题目想让你按照给定的字符串修改字母表的字母序,我们很容易想到拓扑排序,但是这怎么建图?实际上对于两个输入的字符串,s1,s2,s1在s2的上面,如果他们某个位置的字符不相同,那么我们需要建一条从s1[i]-->
阅读全文
摘要:Gym - 103427J Luggage Lock 题解:BFS预处理+偏移 首先我们考虑暴力做法,对于每次查询我们都去找出$a_0a_1a_2a_3$到$b_0b_1b_2b_3$的最小步骤,如果给你0000->9999,我们需要遍历1e4中状态,所以1e5次查询,显然数量级为1e9>1e8 所
阅读全文
摘要:POJ - 1321 棋盘问题 题解:DFS搜索 #include <bits/stdc++.h> #define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0) #define all(x) (x).
阅读全文
摘要:拓扑排序 在一个有向无环图(DAG)中,我们将节点按照线性方式进行排序,使得对于任何的顶点u到v的有向边(u,v),都可以有u在v的前面。我们定义如果i到j有边,则认为j依赖于i,拓扑排序目标就是对节点进行排序,使得排在前面的节点不会依赖于后面的节点 Kahn算法:$O(E+V)$ int n, m
阅读全文
摘要:CodeForces - 1213G Path Queries 题解:并查集+思维 现在给你由许多边组成的树,离线询问路径最大权重不超过$w^i$的路径数量 我们不一定要在树上找,我们可以通过他询问的$w^i$,去一步步构建树,先按照边权排序,比如说w=1,我们就把所有权值为1的边构建出来,然后路径
阅读全文
摘要:Gym - 102770I 题解:并查集+离散化+map 首先题目确保每双袜子都是成对的,我们很容易发现袜子之间存在限制条件比如 1 2 2 3 1 3 所以我们往建图方面想,这样每一个关系都代表了一个连通块,我们只要找到哪个连通块里面点数最多不就好了,点数我们可以用map,或者szp数组来求,但是
阅读全文
摘要:POJ - 1182 食物链 题解:种族并查集 引理:对于普通的并查集,我们总是用来查找和维护每个元素之间的同类关系,而种族并查集总是用来解决一些存在对立关系,而且对象的关系存在传递性和循环性,比如食物链:A->B,B->C,C->A,或者说敌人的敌人是朋友,朋友的朋友是朋友这些关系,我们可以开多个
阅读全文
摘要:OpenJ_Bailian - 1751 题解:最小生成树问题,Kruskal算法 已经帮你建好的边就不用再建了,直接合并,当然我们这一题需要将给的坐标转化成边的,然后我们如何输出建哪几条路呢?我们知道我们合并的时候其实就是建路的过程,所有我们可以修改一下merge函数,增加一维参数op,代表是否输
阅读全文
摘要:并查集 初始化$O(n)$ int fa[N], szp[N], sze[N], loop[N]; //fa根节点,szp点的数量,sze边的数量,loop自环的数量 int n, m; //n代表点数,m代表边数 void init() //初始化 { for (int i = 1; i <= n
阅读全文
摘要:CodeForces - 835C Star sky 题解:二维前缀和 二维平面上给你点和坐标,让你求总亮度,很容易想到二维前缀和,但是题目很抽象,又给了你一个时间,就是说,每过一个单位时间,它的亮度会有改变,这该怎么办? 实际上,我们观察发现,一开始初始亮度一样的点,在经历时间t后亮度还是保持一样
阅读全文
摘要:CodeForces - 1303D Fill the bag 题解:二进制+思维 首先我们发现这肯定与二进制有关,n的二进制形式肯定有1,所以我们去从低位到高位遍历n的二进制的时候,加入现在这一位是1,那我们肯定想要知道现在有没有这么大的盒子,如果没有这么大的盒子,那我们需要拆更大的盒子,所以我们
阅读全文
摘要:CodeForces - 1225C p-binary 题解:二进制 + 思维 由题意得: 让我们求出K的最小值使得$\sum_{i=1}^{k}2^{a^i}+p=n$成立,将式子改变一下形式得到$n-kp=\sum_{i=1}^{k}2^{a^i}$,所以我们可以知道$n-kp$可以由K个$2^
阅读全文
摘要:CodeForces - 1698D Fixed Point Guessing 题解:二分+交互题 题目给出询问次数为15次,而$3<=n<10^4$,很明显是二分 题目想要我们找出在数组长度n为奇数的情况下,交换$\frac{n-1}{2}$对互不干扰的元素,让我们找出哪一个元素没有被交换 直接看
阅读全文
摘要:CodeForces - 1701C Schedule Management 题解:二分答案 很显然如果你给的时间越长,所有工作就越容易被完成,所以时间存在二分性,我们直接二分时间 但是我们现在需要解决一个问题: 1.check函数怎么写,也就是如何判断一个答案的合法性:首先我们肯定是让所有人去做他
阅读全文
摘要:CodeForces - 1730B Meeting on the Line 题解:思维,找货舱位置/二分答案 首先直接来引理,假设现在一个数轴上有许多点,那么一个点到这些点距离最短之和的点肯定在数轴最左端点和最右端点的中间$(x_{max}+x_{min})/2$ 知道引理后我们直接来看题目,但是
阅读全文
摘要:CodeForces - 1760F Quests 题解:二分答案 首先我们来分析一题目,如果说K越大,我们在d天里很有可能得不到C个硬币,所以K的最大值一定在合法答案和不合法答案的临界点,并且这些答案是单调的,所以我们直接考虑二分答案; 1.考虑不可能的情况:当K=0时,那么我们D天每天都去做获得
阅读全文
摘要:二分 整数域上的二分 int l = 1, r = 1e9; while (l <= r) { int mid = l + r >> 1; if (check(mid)) l = mid + 1; //l始终代表合法答案的上一个 else r = mid - 1; //r始终代表不合法答案的下一个
阅读全文
摘要:Radar Installation 题解:区间选点问题 为什么是区间选点呢?关键是我们反着来看,如果将岛屿看成圆心,我们以雷达照射范围d为半径,我们可以X轴上找到一段区间,这段区间都可以放雷达使得该岛屿能被照射到,所以一个个雷达就产生了一个个区间,让雷达数最少覆盖所有区间,不就是区间选点嘛 #in
阅读全文
摘要:Buy Low Sell High 题解:反悔贪心 买股票,一天要么买进,要么卖出,要么什么也不干,求最大利润,首先我们很显然知道了这是一道反悔贪心的题目,我们选择全部买入,但是关键点在于我们怎么反悔 9 10 5 4 7 9 12 6 2 10 比如说这个样例,明显从5买入,12卖出优于从5买入,
阅读全文
摘要:Stas and the Queue at the Buffet 题解:贪心+思维 我们看到公式$ai⋅(j−1)+bi⋅(n−j)$,直接进行化简得到 $$ (a[i]-b[i])j+nb[i]-a[i] $$ 我们就知道$n*b[i]-a[i]$是个定值,所以我们把差值最大的放在前面,把最小的放
阅读全文
摘要:Crossing River 题解:贪心 经典过河问题:先对过河的人速度降序排序,我们要知道想要使时间最短,有两个地方可以贪心 1.去的时候减少时间浪费,就是说让两个速度慢的人一起过河 2.回来的时候减少时间浪费,就是说让速度最快的回来 然后我们直接模拟分析 当n==1时,直接过河 ans += a
阅读全文
摘要:Bread 题解:哈夫曼树模型 该题目是给出根节点,求出其WPL,但是我们要仔细阅读,题目说面包是可以被剩余的,所以我们只要将剩余的面包当成子节点放进队列即可 #include <bits/stdc++.h> #define Zeoy std::ios::sync_with_stdio(false)
阅读全文
摘要:Destroyer Takahashi 题解:区间选点问题 这里面他又给出了D,D其实可以代表他从右端点还可以往外延申D-1 的长度,实际上每次的$now=a[i].r+D-1$ #include <bits/stdc++.h> #define Zeoy std::ios::sync_with_st
阅读全文
摘要:[Painting the Array I](贪心入门 - Virtual Judge (vjudge.net)) 题解: 要使得数组a分成的两个数组长度之和最长,我们设$a^{(0)}$数组末尾元素为$ed0$,$a^{(1)}$数组末尾元素为$ed1$,一开始两个数组都为空,所以ed0=ed1=
阅读全文
摘要:[洛谷P2949 Work Scheduling G]([P2949 USACO09OPEN]Work Scheduling G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)) [USACO09OPEN]Work Scheduling G 题面翻译 约翰有太多的工作要做。为了让农
阅读全文
摘要:计蒜客 - T2144 拼数 题解:把所有数字看成字符串,但是难道直接降序排就结束了嘛,不是的,我们来看一个反例:31 312 虽然312>31但是明显31312 > 31231,所以我们不能简单的排序,我们需要比较两个字符串x,y 如果x+y>y+x就将x排到前面,否则将y排到前面 #includ
阅读全文
摘要:贪心入门 贪心模型一:选择最大的不相交区间 题目一般都是活动安排类,想要参加更多的活动,要求参加的活动时间不能冲突 HDU - 2037 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。 作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看
阅读全文
摘要:七的意志 方法1:前缀和+map $O(nlogn)$ 题解:我们先进行前缀和,利用map记录每个前缀和出现的次数,要想区间和为7777,我们只要让$ans+=mp[pre[i]-7777]$即可,因为$pre[j]+7777==pre[i]$就能说明$[j+1,i]$这个区间和为7777 #inc
阅读全文
摘要:前缀和 一维前缀和 for (int i = 1; i <= n; ++i) { pre[i] = pre[i - 1] + a[i]; } 二维前缀和 for (int i=1;i<=n;++i) { for (int j=1;j<=m;++j) { pre[i][j] = g[i][j]+pre
阅读全文
摘要:2023.01.03 HZNU Winter Trainning STL 补题 CodeForces - 4C 题意:给你n个字符串,如果某个字符串出现过,则在这个字符串后面加上1,2,3,4....以此类推 题解:利用map记录某个字符串出现次数,然后利用to_string函数即可 #includ
阅读全文
摘要:题目传送门:https://www.luogu.com.cn/problem/P1223 题目: Description: 有 nn 个人在一个水龙头前排队接水,假如每个人接水的时间为 Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。 Input: 第一行为一个整数n; 第二行
阅读全文
摘要:CodeForces - 1353D Constructing the Array 题目传送门:https://vjudge.net/contest/536385#problem/D 题意:给你一个全是0的数组,用1-n的数将这个数组填满,规则是从左至右筛选出0最多的子序列,然后如果子序列长度是奇数
阅读全文