12 2020 档案
摘要:A题 签到 #include<bits/stdc++.h> using namespace std; int main() { int n,rw=0,t=0; cin>>n; for(int i=1;i<=n;i++) { int r; cin>>r; if(r>rw) rw=r; if(i>=rw
阅读全文
摘要:A题 计算每组最后出现的那个取min #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,int> plll; const int
阅读全文
摘要:A题 签到模拟题 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; int g[55][55]; int col[55]; int row[55]; int main(){ int t; cin>>t; while(t-
阅读全文
摘要:A题 先除再计算即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,int> plll; const int N=3e5+1
阅读全文
摘要:A题 枚举每一位,如果是偶数就加上i #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; int main(){ ios::
阅读全文
摘要:A题 遍历找到第一个不覆盖它的答案 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; struct node{ int l
阅读全文
摘要:A题 排序输出答案即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e5+10; const int inf=1e9; int a
阅读全文
摘要:A题 通过平移线段可以发现其实就是缺少的那一块的大小 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=5e5+10; int main(
阅读全文
摘要:A题 贪心思路,注意到他们每个是每个排列进行比较,因此只要判断两个字符串对应位置的大小,谁多就谁赢 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const
阅读全文
摘要:A题 直接奇偶输出即可 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; int a[N]; int main(){ ios::sync_with_stdio(false);
阅读全文
摘要:A题 如果是0大于一半,无解,否则取多的一边即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=5e5+10; int a[N]; i
阅读全文
摘要:A题 题意比较难懂,其实就是查一下他给的k个哪些不是学校的最大值 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e5+10; str
阅读全文
摘要:经典套路,首先发现只有两个边,这种情况下,很容易想到使用枚举的方法,枚举第一条边,然后计算对应的第二边最优,之后对于所有情况取max 这里只有y有用并且每个矩形其实就是一条线段 对于这题,一个需要考虑的问题是,如何当我们枚举一条边的时候,计算第二边答案的时候不会计算进第一条已经穿过的矩形。 那么其实
阅读全文
摘要:A题 做法很明显,就是隔壁连续1和连续2取min,虽然写的比较复杂 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; int a[N]; queue<int> q1,q2; i
阅读全文
摘要:A题 首先)(其实相当于1个即可 所以如果1和4相等并且大于等于1即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=5e5+10;
阅读全文
摘要:A题 用scanf读入更加方便,之后只要计算差值即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef map<string,int> st; const int N=5e5+10; int main
阅读全文
摘要:计算二维前缀和,更新一下归并的板子 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=5e5+10; struct node{ int x,y,z,p,id,sign; ll sum; boo
阅读全文
摘要:根据数据是区间,也是时间,应该可以想到时间线段树分治 问题就是如何查询二分图。 一般判定二分图就是判断是否存在奇数环。 那么奇数环就是当我们加入一条边,如果他们本身是联通的并且距离为偶数,这样就是奇数,并且一旦找到奇数环,下面的时间永远是奇数环 因此我们可以用带权并查集来维护距离信息,这是经典套路,
阅读全文
摘要:这题的图非常特殊,首先他没有交点,其次他每条路径的长度都是相等的,也就是每一条边都是对应的。 根据常规的贪心思路,因为他的最大流是全部路径中的流量和,并且你将一个边-1,必有另一个边+1,最大流的答案就是总容量/路径上的边数 那么其实可以想出做法了,我们已经知道的最大流是多少,所以我们将路径按权值排
阅读全文
摘要:floyd好题,这个题加深了floyd真实原理的理解。学了floyd之后,一般都是用滚动数组优化过的式子去用,很多时候都忘记了floyd的本质 本题暴力dij最坏复杂度在2e9左右,跑不过时限,显然出题人肯定是设计了数据,因为他的本意是考察floyd 其实我们刚看到n的数据的时候,就会去思考floy
阅读全文
摘要:这题要看出dp更新的方法,因为我们有很多字符串,而最后的串可以随意组装而来 因此dp状态设计为f[i]到i的最小代价,这也一直往下跳,更新的时候更新fail链上的所有答案,因为这些是可以成为他的后缀更新过来的,这也就枚举到了所有的情况 #include<bits/stdc++.h> using na
阅读全文
摘要:首先猜想一个事情,这题求树,其实是使得最多的点在一个集合,并不用考虑环的问题,在不考虑二元环的情况下,本题没有环 举三个数的例子,如果a^b<a^c,那么ab连边,如果b^c<a^c,bc连边,那么ca不能连边,因为不等式已经约束了 因此就要考虑如何成为连通块。对于异或的题目,很多都和字典树在一起,
阅读全文
摘要:这是基于时间的离线线段树分治法,时间分治是一种经典套路,一般来说,离线算法比在线算法容易实现。 因此在本题,我们用双端队列维护信息,弹出来的时候,在时间线段树上区间修改,表示他在哪段时间可见,这样我们查询的时候,在所需要查询的时间,那里就是合法的信息 #include<bits/stdc++.h>
阅读全文
摘要:根据题意x^2x=3x 异或和普通加法的关系其实就是异或是不进位加法,我们把3x看作x+2x 这样其实求的就是异或中x和2x每一位异或都是0的答案,也就是x中没有相邻1,因为2x就是x左移而来 对于第二问,一看数据范围就知道是个数学规律题,因为普通做法不可做,观察可得,这是斐波那契数列的n+2项,因
阅读全文
摘要:这题的题意告诉你,每次询问不超过10,说明我们只需要维护前10个即可,这样的话维护的大小就不多 因此可以直接树链剖分+线段树来做,但是还有个问题,不能直接套一个含log的数据结构进去,因为这样复杂度会多一个log,我之前用的set超时了 因此还是使用使用vector直接归并数组来做 #include
阅读全文
摘要:套路题,维护前面的奇偶性和长度 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e5+10; int s[N]; ll f[30][2
阅读全文
摘要:用二维差分维护哪些点没被覆盖掉,那么最后一个需要覆盖掉这些点 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; const
阅读全文
摘要:一看数据范围,显然是平方算法,这题的题意是,总共有n种情况,每次给你首字母,你可以任意选择一个位置看更改后的字符是多少,问能猜测出答案的最大个数 因为给定了首字母再猜,那么显然对于首字母不同的情况他们是不干扰的,因此对首字母分类讨论。 那么对于每种情况,我们可以直接枚举选的位置,计算最大的答案取即可
阅读全文
摘要:第一步,可以贪心的发现,在子树中,如果有多个儿子,那么先走深的儿子,因为最后要跳到上面父亲去,因此最后所在的地方约浅越好 但是对于根来说,如果他有多个子树,那么先走浅的好,因为我最后一步不需要跳到别的子树,只需要跳回根就行,如果先走最深的子树,那么要跳到别的子树,就不是最优的 因为他最深 #incl
阅读全文
摘要:我们发现要求的答案是depth[u]-min(depth[u]+k,mx)之间的属于他子树的最小值,mx是最深的深度 在线算法,不难想到用主席树对深度建树,这样就可以求取区间深度的信息,区间min没有可减性,但是并不影响本题做法 因为我们只需要查找指定dfs序区间中的答案即可,这样才是他子树中的答案
阅读全文
摘要:这题是dp其实比较好看出来,问题是状态如何设计。 观察题目信息,一看W,X,B,大的吓人,显然不可能作为方程,那么题目中就没几个可以作为状态的了 那么显然将获取几个作为状态比较合理,进一步思考,我们要求的肯定是获取越多越好,并且获取相同的数量还剩下的魔法越多越好 这样状态就呼之欲出了,之后就是类似背
阅读全文
摘要:这题其实求的是x的倍数个数是否大于1,大于1肯定不行,否则可以 另外一点,如果区间gcd不能整除x,那么必有至少一个数不是x的倍数,不然gcd会更大 因此我们只要暴力维护并且在发现不止一个的时候及时退出,这样复杂度就可以 #include<bits/stdc++.h> using namespace
阅读全文
摘要:这题比较套路,首先我们发现,区间变成约数个数是不可能用区间维护的,因此这题显然有个trick 既然只能暴力修改单点,但是我们又要要求修改次数不能太多,因此可以联想到,是不是我约数个数求几次就变成一个常数了 继续观察,果然是这样,因此我们发现修改次数不会太多 #include<bits/stdc++.
阅读全文
摘要:初一看,sb题,上去一个并查集,很快啊,返回一个MLE,定睛一看,系统开的内存很小,但是这个算法复杂度又是这么正确 因此考虑优化内存,这样用滚动数组优化即可 这里注意一个问题,平常并查集从那边指那边都是对的,但是滚动数组就不一样了,对于上一层的,一定要指向下一层,因为如果指向上一层,那么在做的时候,
阅读全文
摘要:数据范围不大,但是直接dfs显然复杂度不正确,因此只能使用状压 用位运算表示前i位的数更新即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const in
阅读全文
摘要:首先观察到答案具有单调性 其次,考虑如何check,一个朴素的想法就是枚举区间,之后判断覆盖这段区间的plan有几个,再取个min 这样做复杂度较高,考虑一下优化。 我们可以枚举右端点,之后把符合条件的左端点用树状数组维护,之后用一个指针去不断往前找到最远的符合覆盖大于二分值的点。 注意,这个指针不
阅读全文
摘要:这道题刚开始想到贪心去了,首先所有点都要取到,其次觉得一个点肯定是要跟最大的旁边点相连 但是这里有个问题,就是总是有一个点是原点,也就是这样直接贪心会存在环的情况,这种情况是不允许的,这意味着存在一个点即是出发点也是被遍历点 那么既要消除环的情况,又要连接所有的点,并且要求权值最大,基本上可以想到树
阅读全文
摘要:求最大值最小,这种题目一般来说就是先猜一个二分 那我们发现,本题确实具有单调性,只要check出来能够小于等于k即可,因为这样一定能划分成k种 有人担心会不会二分的答案不能划分成k种,其实不可能,因为能划分成比k小的,就一定能划分成k种 之后就是dfs,用优先队列,如果一棵子树大了,就把他子树中的贪
阅读全文
摘要:如果枚举三维会超时,但是暴力做法却很有道理,根据数据范围,容易看出这是个n^2的题目,并且第三个点是一个区间中的答案 因此考虑用st表查询区间最值优化 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; struct no
阅读全文
摘要:这道题明显就是告诉你就是树链剖分+线段树维护三次方和,那么显然就是拆项后发现维护一次方和,二次方和和三次方和 这里涉及到两个操作,一个是add一个是mul 因此我们要考虑优先级,这是洛谷的线段树模板2,要先mul再add,因为这样可以解决先加后乘的问题 #include<bits/stdc++.h>
阅读全文
摘要:要求每个节点的答案,启发式合并没跑了,但是注意不要每次都遍历set 只需要计算贡献即可,因为插入的只有头部尾部和中间三种情况 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int
阅读全文

浙公网安备 33010602011771号