07 2022 档案
摘要:(才了解到根号分治这样的妙方法......) 将每个数当成一种物品,最终要凑成n,这就是一个完全背包问题,复杂度O(n2),可以得80分(在考场上貌似足够了......) 1 #include <bits/stdc++.h> 2 //#define loveGsy 3 #define N 10000
阅读全文
摘要:用线段树维护操作序列,叶子结点存要乘的数,非叶子结点存区间乘积,每次输出tr[1] 就是答案。 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define lson k << 1, l, mid 4 #define rson k << 1 |
阅读全文
摘要:对于特殊性质fi=i-1,原图是一条链,注意到当前节点是‘ (’不会产生贡献,‘)’才会产生,那么思考怎么的计算这个贡献。 ()()():每个位置贡献是0,1,0,2,0,3。答案统计出来就是说0,1,1,3,3,6。 ())():贡献是0,1,0,0,1。答案是0,1,1,1,2。 ()(()):
阅读全文
摘要:观察几个数据,有一种思路:类似于二分,判断每一位应该填1还是0; 1 #include <bits/stdc++.h> 2 //#define loveGsy 3 using namespace std; 4 int n; 5 unsigned long long k, bk; 6 bool fla
阅读全文
摘要:题目描述 在给定的 NN 个整数 A_1,A_2,……,A_NA1,A2,……,AN 中选出两个进行xor运算,得到的结果最大是多少?xor表示二进制的异或(^)运算符号。 输入格式 第一行输入一个整数 NN;第二行输入 N 个整数 A_1~A_NA1~AN。 输出格式 输出一个整数表示答
阅读全文
摘要:题目描述 在同学们的努力下, 高匀感受到了 alb 的快乐。 高勺意犹未尽,找来了一个长度为 nn 的序列 a_1,a_2,….,a_na1,a2,….,an 。 她想要删除这个序列中的 kk 个数,然后将剩下的数按下标从小到大排列成一个长度为 n-kn−k 的序列 b_1,b_2,...,b
阅读全文
摘要:题目描述 我们说一个可重集 AA 比可重集 BB 小,当且仅当对于两个可重集中出现次数不同的最小元素 xx ,元素 xx 在 AA 中出现次数更多。 例如,可重集 {1,2,3}1,2,3 就比可重集 {1,3,3,5}1,3,3,5 小,类似的,{1,1,4,4}1,1,4,4 小于 {1,1,4
阅读全文
摘要:题目描述 高钧在校园中漫步时,经过了一棵树。这时,几个同学突然冒出来控制住了他。 这棵树有 nn 个节点, 每个节点有黑白两种颜色, 为了更好的 alb , 需要把所有节点染成同一种颜色。 为了更好的戏耍高钧,高钧被告知如果他在最短的时间内把这棵树的所有节点染成同一种颜色, 那他就不会被 alb。
阅读全文
摘要:题目的意思就是可以交换差分数组,对答案进行化简:n∑ai2−(∑ai)2 ,再通过手玩分析可得最优解的差分数组一定是单谷(可以感性理解一下),因此我们将差分数组排序,依次加入,每次可以选择加在左边或者右边,转移方程就可以写出来了。 为了将空间优化,可以用滚动数组。 1 #include <bit
阅读全文
摘要:(n<=30,是个多维的DP) v数组就是用来计算权值的,一共有m+1个。将S看做一个二进制数,按照题目S的定义,相当于在S的每一位可以随便+1(满足限制情况下),一共可以加n次。 我们来建立DP的维度,首先第一个i表示对二进制数处理到i位(从低位到高位),j表示使用了几个数(一共n个数可使用),为
阅读全文
摘要:树上的边差分,x++,y++,lca(x,y)-=2. m条边可以看做将树上的一部分边覆盖,就用差分,x=1,表示x与fa(x)之间的边被覆盖一次,m次处理后跑一遍dfs统计子树和,每个节点子树和val=1,说明割去这条边后只有一种方案,val=0,说明割去后随便再割一条都行,有m中方案。 题很简单
阅读全文
摘要:对于一个非叶节点,不管是否要交换子树,其左右子树内部的逆序对数都不会受影响(内部的顺序并不会影响外部产生的逆序对数),受影响的是跨左右子树的情况,所以我们考虑统计这一部分的逆序对数。节点x的左右子树根节点为p,q,u+=size[t[p].rc] * size[t[q].lc],交换后 v+=siz
阅读全文
摘要:相当于是线段树合并的模板题,比(雨天的尾巴)还要板。 唯一注意的是线段树的更新,因为同一子树中可能有多种颜色占主导地位,要输出编号和,比如一颗子树中,1出现3次(最多),3出现3次,那么应该输出4。 1 #include<bits/stdc++.h> 2 #define ll long long 3
阅读全文
摘要:显然的树上差分问题,最后要我们求每个点数量最多的物品,考虑对每个点建议线段树,查询子树时将线段树合并可以得到答案。 用动态开点的方式建立线段树,注意离散化。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 +
阅读全文
摘要:好久没打主席树了,都忘了怎么用了...... 假设我们选了一些数能构成[0,x]范围内的所有值,下一个要加的数是k(k<=x+1),那么可以取到[0,x+k]内的所有取值,所以有一种做法: 对于每个询问区间,先排序,依次加入k,k<=x+1时,取到[0,x+k];k>x+1,则x+1不能取到,就是答
阅读全文
摘要:题目描述 小 B 喜欢玩游戏。 有一天,小 B 在玩一个序列上的游戏,他得到了正整数序列{ai}以及一个常数c 。 游戏规则是,玩家可以对于每一个ai 分别加上一个非负整数x ,代价为 x2,完成所有操作之后,需要额外花费的代价就是所有相邻位置上数之差的绝对值总和再乘上c 。 小 B 觉得这个游戏很
阅读全文
摘要:序列s中的数就是要选的堆的编号,假设要选的有i个石子,这i个染为红色,剩下j个染为蓝色,i+j=x,i=x-j,那么对答案的贡献是|x-2j|。那么只要我们选的有i个石子,贡献就是这么多,所以我们可以求出选取数量为i的方案数有si个,那么答案就是∑ 𝑠𝑖|𝑥 − 2𝑖| (1=<i<=x).
阅读全文
摘要:dfs一遍求出以每个节点为根的子树大小,然后枚举n的约数,对于每个约数i,统计sz[ ]是i的倍数的有多少个(开桶统计),如果有n/i个则答案+1。 这道题也就是个结论题,画图分析一下。复杂度O(n*sqrt(n)) 1 #include<bits/stdc++.h> 2 using namespa
阅读全文
摘要:因为若一个时间限制满足题意,则所有比它大的时间限制一定都满足题意,因此本题答案具有单调性,可以想到二分答案求解。 本题思路不是很难,但细节和代码实现比较复杂。 见牛人博客:https://www.luogu.com.cn/blog/TEoS/p1084-yi-qing-kong-zhi 1 #inc
阅读全文
摘要:对于一条路径,s-t,位于该路径上的观察员能观察到运动员当且仅当以下两种情况成立:(d[ ]表示节点深度) 1.观察员x在s-lca(s,t)上时,满足d[s]=d[x]+w[x]就能观察到,所以我们在这条路径上每个点都放置一个d[s]的物品(差分实现),所有路径处理完后dfs一遍,查询每个节点d[
阅读全文
摘要:好多题解用的扩展KMP(没学过,所以不用这种方法)。 我们按照题目要求记F(s)表示s串的权值,可以预处理出前缀权值(用于A)和后缀权值(用于C),枚举AB的长度i=2~n-1,不需要分开枚举,我们只关心A,A可以从1扩展到i-1。有一个性质,不管AB重复多少次,C的权值只有两种,AB重复奇数次有一
阅读全文
摘要:(不想打高精,也不想学习其他大佬的神仙写法,打了90分的错解)。 本题容易想到用拓扑排序处理,涉及分数的加法,用long long会超时,不过通分时先除后乘卡一下也可以拿90分。 结构体真是个复杂的东西,代码11行是无参数的构造函数,似乎是初始化的,分子为0,分母为1。 1 #include<bit
阅读全文
摘要:题目的意思就是在直径上找一段距离不超过s的路径,使该路径的偏心距最小。 求出直径之后,显然我们可以用双指针扫描一段合法路径。设u1,u2...ut是直径上的点,d[ui]表示从ui出发能到达的最远距离(除直径),那么该路径的偏心距的表达式就是max(max{d[uk]},dist(u1,ui),di
阅读全文
摘要:(这道题考察了求直径的两种方法......) 在原图中,每条边要经过两次,增加1条后,形成了一个环,那么环上的边只需要经过一次了(大量画图分析得),再增加一条又会形成一个环,如果这两个环有重叠,重叠部分还是要经过两次,就浪费了,所以我们先找直径(两次dfs),在直径的两个端点连一条边,就可以得到k=
阅读全文
摘要:求出最短树,用乘法原理统计答案就行了(模拟prim过程)。 不知道说什么了,直接上代码: 1 #include<cstring> 2 #include<iostream> 3 #include<algorithm> 4 #define ll long long 5 using namespace s
阅读全文
摘要:显然的0/1分数规划问题,用二分来解决,检验mid,就用prim算法求最小生成树,看总边权是否大等于0即可验证。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int M=1006; 4 const double eps=1e-8;
阅读全文
摘要:节点1是有度数限制的,把节点1去掉,就会形成若干个连通块,在每个连通块内部求最小生成树(prim算法实现),并求出每个连通块与1相连的最短的边,这样形成了初始状态的生成树。 假设(1,x)这条边没在生成树中,如果在生成树中从1到x的路径中的最大边权大于(1,x),考虑加上(1,x),去掉这条最大边权
阅读全文
摘要:完全图就是每两个点都有直接相连的边。 模拟Kruskal算法的过程,每选择一条边加入时,他两端端点在同一个集合中就跳过,否则考虑合并两个集合,合并时需要增加的每条边的权值至少是edge[i]+1,这才使得最小生成树不会改变,记录每个集合大小统计要增加的边数,累加答案。 1 #include <ios
阅读全文
摘要:关系具有传递性,可以用floyd解决。 将关系都看做i<j的形式,令d[i][j]=1,如果d[i][j]=d[j][i]=1,说明矛盾;d[i][j]=d[j][i]=0,说明i与j的关系无法确定。 按顺序枚举每个关系,可以求出“”至少要前t个关系确定每两个变量之间的关系“的t值是多少,枚举过程中
阅读全文
摘要:该最短路可不同于平时简单的最短路模板。 这道题一看就知道用SPFA,但是众所周知,USACO要卡spfa,所以要用更快的算法。 单向边不构成环,双向边都是非负的,所以可以将图分成若干个连通块(内部只有双向边),用拓扑排序的框架处理整张图求解最短路,对于每个入度为0的连通块求一次最短路,因为边权非负,
阅读全文
摘要:本题就是在一条1-n的路径上找p,q(先经过p),使得q-p最大。 考虑建正反图,正图上求出d[x],表示1-x的路径经过的节点最小值,反图上则从n开始求出f[x],x-n的最大值,最后枚举断点i,取最大的f[i]-d[i]就是答案。 基于动态规划的思想。 1 #include<bits/stdc+
阅读全文
摘要:和整体二分的模板相比,多了修改操作。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10,INF=1e9; 4 int n,m,t,c[N],ans[N],b[N]; 5 struct node{ 6 int o
阅读全文
摘要:刚学了整体二分,用这种解法来解决这道题。 首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提。将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分。用树状数组来检验二分值。 1 #include<bits/stdc++.h> 2 using namespace std; 3 c
阅读全文
摘要:解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出。如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了故障时,我们就查询x,查询到的就是x出故障后不受影响的路径。 (洛谷上有一个点一直过不了,似乎是之后
阅读全文
摘要:这道题的贪心思路可真是很难证明啊...... 对于<i,j>的限制(i必须在j之前),容易想到topsort,每次在入度为0的点中选取最小的。但这种正向找是错误的,题目要求的是小的节点尽量往前,并不是字典序最小。<i,j>中i肯定大于j,这样建的图中小的节点是靠后的,当然不行;那我们考虑反向建图,那
阅读全文
摘要:【题目描述】 Tom和Jerry各有一个玩具,每个玩具都是由M根绳子连接到N个球上制成的。 在Tom的玩具中,球的编号为1,…,N,第i条绳子将球Ai和Bi连接起来。 类似地,在Jerry的玩具中,球编号为1,…,N,第i条绳子将连接到球Ci和球Di。 在每个玩具中,没有球把一条绳子的两端都系在自己
阅读全文
摘要:这道题目有两种解法: 1.将每个点视为一个二元组(x,p),表示从起点到x有p条路径免费,相当于构建了一张分层图,N*k个节点,P*k条边。在这张图上用优先队列优化的SPFA算法求解,注意这里的d数组存的不是最短路径,而是路径中边权最大的值,最终答案就是min(d[n][j]),0<=j<=k 。
阅读全文
摘要:通过打懒标记实现区间取反,和线段树基本操作都差不多。 本题还是一道边权化为点权的问题。 200行巨长代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int
阅读全文
摘要:差不多是模板题,不过要注意将边权转化为点权,将边的权值赋给它所连的深度较大的点。 这样操作过后,注意查询ask()的代码有所改变(见代码注释) 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace
阅读全文
摘要:用树链剖分求LCA的模板; 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=40005; 5 int n,m; 6 int head[maxn],to[maxn<<1],w[maxn
阅读全文