图论
timidcatt
永远不要放弃战斗
展开
-
Tree Cutting Codeforces Round 936 (Div. 2) 1946C
那么很容易想到的就是进行dfs,后序维护当前点u的子树大小siz[u],如果siz[u]>=x,那么这个点和它父节点之间的边就要断掉,使用的边的数量tot+1,然后令siz[u]=0,使其不影响后序的dfs过程,但如果当前点时根节点也就是1号点,它没有父节点,所以tot不能+1,而且如果以1为根的子树的大小=x。那么接下来考虑在确定了某个x的情况下求需要移除的最少边数,因为按照上面的单调性,移除的边数越少x越大。原创 2024-03-25 11:36:42 · 357 阅读 · 0 评论 -
Tree Compass Codeforces Round 934 (Div. 2) 1944E
我们操作4 1 、4 3、5 1、5 3,只需要4次,如果只操作一个中点就需要5次,少一次的原因是我们每次操作都涂黑了至少2个点,只操作一个中点 的话必然会有只涂黑一个点的操作,而要想每次操作都涂黑至少两个点也需要直径的点数是4的倍数,这样才能两个中点交叉操作,所以只需要分两类讨论即可。思路:要想操作数最少,就要使每次操作涂黑的点的数量尽可能多,那么也就是要找这棵树的中心点,而这样的点一定在树的直径上,也就是树上的最长链,直径可以通过两次bfs找最远点或者一次树上dp来找,这里只讲树上dp做法。原创 2024-03-21 11:07:00 · 505 阅读 · 0 评论 -
D. Doremy‘s Connecting Plan Codeforces Round 906 (Div. 2)
思路:令当前已有的一个连通块为s,我们要找一个点j和s连通,那么我么肯定选择连通块中编号最小的一个点i,使i*j*c最小,如果s内的和+a[j]>=i*j*c,i和j就可以连通,既然i*j*c已经小于等于当前连通块的和,那么对于小于j的所有编号i*j*c都一定小于等于。题目大意:有一个长度为n的数组a,同时有一个n个点的图,编号与数组的编号对应,初始没有边,如果当前连通块的中a[i]的和+某一个点a[j]>=连通块的一个点i*某一个点j*c,那么就可以连通i和j,问能否使所有点在一个连通块内。原创 2023-11-02 13:13:33 · 147 阅读 · 0 评论 -
B. 看比赛 The 10th Jimei University Programming Contest
思路:因为直走最短路,所以我们把所有在最短路上的边都要选出来,建成新图,为此,首先用dijkstra求出1到n的最短路的长度,然后我们从n开始bfs,遍历相邻边,如果这条边的边权加上1到这条边起点的最短路距离等于1到这条边终点的最短路距离,那么就把这条边加到新图中,最后就会形成一个包含1到n的所有最短路的DAG。原创 2023-10-26 19:48:50 · 300 阅读 · 3 评论 -
H. Mad City Codeforces Round 898 (Div. 4)
所以我们先跑一个dfs找到所有环上的点,然后再以b为起点,找到b距离环上的哪个点最近,且是哪个点,然后再从a出发跑bfs找到b到那个点的距离,如果b一开始就在环上且到那个点比a更近,就有必胜策略,同时如果ab重合一定没有必胜策略。题目大意:有一个n个点的图,有n条边,西安有两个人A,B分别位于点a/b,每轮两个人同时开始向相邻点移动,问B有没有可能永远不和A汇合。思路:如果要永远不汇合,那么他们最终肯定在一个环里,而边的数量等于点数,说明图中有且只有一个环,那么B只要比A先到这个环即可。原创 2023-10-19 15:39:49 · 172 阅读 · 0 评论 -
F. Minimum Maximum Distance Codeforces Round 903 (Div. 3)
如上图,从4出发找到最远的点2,但右边的5距离2更远,这时候因为2已经是最靠左的一个点了,所以只要再从2再跑一遍bfs,找到的最远的点和2一定是距离最远的两个点,类似于问以哪个标记点为根,能找到根到标记点的最远距离。显然,在标记点2、4之间的点是才可能是取得最小值的点,因为如果在某一个点一段的话,这个最大值一定大于两个标记点之间的距离,而在中间的点一定都是小于这个距离的,那么在这两个点之间很显然最中间的点是取得最小值的点。原创 2023-10-17 16:38:28 · 205 阅读 · 0 评论 -
UVA - 10765 Doves and bombs
思路:也就是求每一个割点出现在几个双联通分量(没有割点的图)中,找双连通分量也是用tarjan,dfn[u]表示u是第几个遍历到的点,low[u]表示从u出发在不经过父子边的情况下能到达的最早的祖先的dfn值,而如果一个点是割点,那么在不经过该点的情况下无法到达该点的祖先也就是low[v]>=dfn[u],注意特判起始点的情况,它可能是假割点。题目大意:有一个n个点的图,求每个点如果被删除后,图中剩余连通块的数量。原创 2023-10-06 22:13:57 · 180 阅读 · 0 评论 -
UVa11324 - The Largest Clique
思路:根据建新图的规则可知,一个点会和它能到达的所有点构成一个合法的分量,那么从入度为0的点开始组成的这样一个分量一定是最大的,但是因为图中有环,所以没法直接统计这样的分量的大小,所以要先用tarjan将所有强量通分量缩成一个点,再在新图中用记忆化搜索找上述的分量。题目大意:有一张n个点m条边的图,现对于每一个点u,建立一条边连接它和所有它能到达的点,问满足所有点之间都有边的分量的大小最大是多少。原创 2023-10-05 23:16:30 · 130 阅读 · 0 评论 -
D.Tree XOR Codeforces Round 899 (Div. 2)
然后考虑换根时,费用如何转移,当我们将根从u转移到它的相邻节点v时,首先减去应该舍去的贡献,也就是(a[u]^a[v])*v原来的子树大小siz[v],然后加上新产生的贡献(a[u]^a[v])*v变成根后新产生的子树大小(n-siz[v]),这样就得到了v相对于u的变化量mod[v],然后v的子节点是在c变化后的基础上进行变化,所以每个点的子节点的mod要先加上父节点传来的mod,这样就得到了每个点为根时相对与以1为根时的变化量,每个点i为根时的答案也就是ans+mod[i]。原创 2023-09-26 09:38:52 · 343 阅读 · 0 评论 -
D. Cyclic Operations Codeforces Round 897 (Div. 2)
,要将a[2]修改成3,k就等于[2,3,?我们先按顺序操作[1,2,3],[3,5,4],使位置1,2,3,5上的数都修改完毕,要让位置4上的数也修改好,只能是[4,2,3],这是会把3修改成4,而我们要的是5,要把3改回去,就要操作[3,5,4],第4个位置又不行了,所以这样的环永远会出现错误覆盖的情况。但环的大小小于k时,例如1,2互向指向自己,那k=3时的操作就只能是[1,2,1],后面填别的数都会错误的覆盖掉其他位置,而这样又与b种数字不能重复矛盾,所以这样的话也没法修改好。原创 2023-09-12 15:08:15 · 574 阅读 · 0 评论 -
F. Selling a Menagerie Codeforces Round 895 (Div. 3)
题目大意:有n个动物,每个动物i有一个害怕的动物a[i],现要卖掉所有动物,每个动物都有价值c[i],如果i在a[i]之前卖掉,就会获得2*c[i]的价值,如果在a[i]之后被卖掉就会获得c[i]的价值,问以什么顺序卖掉所有动物能使获得的总价值最高。思路:对于这种约束问题,首先直接从i向a[i]建单向边,初始状态下,所有没有入边的点卖掉都能获得2*c[i]的价值,同时因为该点被删除,所以他们指向的点入度-1,接着卖掉入度为0的点,依次循环,最后一定会出现剩下的点都成环的情况。原创 2023-09-08 11:28:16 · 397 阅读 · 0 评论 -
B. Building Company The 13th Shandong ICPC Provincial Collegiate Programming Contest
思路:如果我们逐个项目判断能否完成,那么时间复杂度将是n*m,那么我们可以判断每个岗位,将每个岗位在各项目中的所需员工数从小到大排序,每当这个岗位有新员工时,我们就判断哪些项目的该岗位需求能被满足,所以每个项目要维护一个当前限制数,初始等于m,每满足一个岗位的需求,限制数就-1,限制数为0就可以完成这个项目,用队列存储所有可以完成的项目,逐一领取奖励然后解除岗位限制即可。原创 2023-09-02 17:35:28 · 509 阅读 · 0 评论 -
Grayscale Confusion “范式杯”2023牛客暑期多校训练营10 L
题目大意:有n个三维三维向量,c[i]=(x,y,z),定义c[i]原创 2023-08-19 12:27:41 · 184 阅读 · 0 评论 -
G. Counting Graphs Codeforces Round 891 (Div. 3) 1857G
因为我们已经算出了每个位置能加边的种类数,所以我们现在只要算出有多少个位置能加边即可,设我们当前遍访问的边的两个端点分别为u,v,我们要加的边应该一个端点在u的子树上,另一个在v的子树上,在我们当前确定的边权和位置条件下,u的子树上的每一个点都可以向v的子树上的每一个点建边,除了我们本身正在访问的边,总的位置数就是size[u]*size[v]-1,每一条边提供的贡献也就是。题目大意:给出一棵n个点的边权树,问有多少个边权最大不超过s的图的最小生成树是这棵树。原创 2023-08-10 10:41:41 · 214 阅读 · 0 评论 -
E1. PermuTree (easy version) Codeforces Round 890 (Div. 2) E1
那么问题就转变成了有x个数(x为子链数),怎样将这x个数分成两部分,使得一部分的和*另一部分的和最大,因为和最大是5000,所以我们可以用类似01背包的方法,求出所有能凑出来的和,即将所有所有链长存入数组q中,数组occ记录哪些和出现过,对于q[i],我们从5000到0枚举j,如果occ[j]=1,那么occ[j+q[i]]也为1,之所以要倒推就是因为一个数只能取一次,不能重复取,然后从1到sum(子节点总数)遍历i,如果occ[i]=1,就维护i*(sum-i)的最大值。原创 2023-08-09 15:49:59 · 286 阅读 · 0 评论 -
H. HEX-A-GONE Trails 2023“钉耙编程”中国大学生算法设计超级联赛(7)hdu7354
然后我们还要求从关键路径上每个点出发的所有链的长度,每移动一个节点,所有从起点出发的链的长度都要-1,但其实可以数学一下,我们求出两个起点出发所有链的长度d1,d2,然后假如A从起点移动了一格,到了编号为i1的点,那么再判断时我们只需要判断dis[i1]+1与从B的起点出发所有链的长度即可,省去了全部-1的操作,我们用st表求最大值即可。我们按照此策略循环,看谁先找到最优策略,或者两个人汇合时,谁不能继续走。从2出发的所有链,就能必胜,此图已不存在此情况。原创 2023-08-08 20:59:06 · 263 阅读 · 3 评论 -
Red and Blue and Green 2023牛客暑期多校训练营5 E
如果当前区间不是叶子结点,那么就找两个相邻子区间,交换左区间的最大值和右区间的最小值,这里我们为了方便找最值,只需在下标数组上进行交换操作,即pos[i]表示排列中数字i应该在的位置,这样每次都是交换左区间的右端点和右区间的左端点,最后再令答案排列p[pos[i]]=i即可。题目大意:给出m个互补包含和重合的区间约束,表示[l[i],r[i]]内有偶数/奇数个逆序对,求一个满足所有约束条件长度为n的排列,或输出不能。原创 2023-08-02 23:33:01 · 467 阅读 · 0 评论 -
Counting Stars 2023“钉耙编程”中国大学生算法设计超级联赛(5)hdu7335
思路:因为边数总共不超过1e6,所以可以遍历点,遍历度数,因为不同星图数量直接要求异或,所以对于每个点,只能求出它对每个星图的贡献,最后再求异或和。题目大意:如果一个点连接着k个点,就称这k+1个点构成k星图,现给出一个大小为n的图,问2星图的数量^3星图的数量^...^n星图的数量是多少。原创 2023-08-02 11:22:27 · 192 阅读 · 0 评论 -
Tree 2023“钉耙编程”中国大学生算法设计超级联赛(5) hdu7332
思路:新树和旧树的区别就在于多了由重链构成的二叉树,所以我们从根开始dfs,先沿着重子节点搜索,期间维护这个重链的长度len,直到搜到整个重链的尽头,由这条重链构成的二叉树的深度即为log2(len),向上取整,得到这棵树上所有叶子结点的深度d=len+1,那么我们在回溯的过程中,给所有链上的点赋值d,然后在继续搜索轻子节点,即下一条重链时,将d也向下传,再往下的二叉树深度都要加上d,最后遍历所有点找到深度最大的即可。原创 2023-08-02 10:38:03 · 195 阅读 · 0 评论 -
Cheeeeen the Cute Cat 2023牛客暑期多校训练营5 C
1-2-3-4-1构成一个4个点的环,他们的匹配分别为1-6,2-7,3-8,4-5,然后我们发现建出的有向图一定是竞赛题(即去掉方向后变成完全图的图),竞赛图一定存在一条哈密顿通路(即从一个点出发,能不重复的经过所有点),哈密顿通路的路径长度也是最大匹配,如下图中哈密顿通路为1-2-3-4,匹配为1-6,2-7,3-8,所以答案至少是n-1。原创 2023-08-01 00:27:54 · 232 阅读 · 0 评论 -
G. Vlad and the Mountains codeforces Round 888 (Div. 3) 1851G
题目大意:有一个n个点的无向图,每个点有点权wi,如果要从点u移动到v,需要消耗w[v]-w[u]的能量,一共q次询问,每次给e点初始能量,问能否从a走到b。原创 2023-07-30 15:34:23 · 196 阅读 · 0 评论 -
Circuit 2023“钉耙编程”中国大学生算法设计超级联赛4-3 hdu7322
这样的话我们需要求出任意两点之间的最短路,再枚举边即可,所以用到floyd算法,我们在每次路径更新时,或者找到权值相同的路径时,都要维护最短路径的数量cnt,然后在每次第k个点更新完成后,可以直接枚举小于k的点i与k之间的边,如果有环,就判断以k为顶点的环:ma[i][k]+dis[k][i]是不是最小值,如果是最小值相等,也要更新数量。题目大意:有一个n个点的边权有向图,求图中环的权的最小值以及相应最小环的数量。思路:要求一个如下图的环的大小,我们只需知道u到v的最短路径加上v到u的边权。原创 2023-07-28 11:49:03 · 117 阅读 · 0 评论 -
foreverlasting and fried-chicken hdu7293
思路:我们要找两个点u,v,他们至少有4个公共点,且至少有一个点的度数至少为6,其中还要判断两个点之间有没有直连的边,如果有,这个边不能放在度数的统计中,所以我们建立邻接矩阵存图,便于查找这样的边,同时用bitset将每个点连接的点记录下来,那么两个点的公共点的数量就等于两个bitset求&之后1的数量,然后再判断满足以上要求的点的度数,如果不算直连边也>=6,那么答案就加上C(它的度数,4)*C(另一个点度数,2)题目大意:给出一个n个点,m条边的图,问其中包含了几个下面这样的子图。原创 2023-07-26 16:37:54 · 120 阅读 · 0 评论 -
Play on Tree hdu7286
题目大意:有一棵n个点的树,每次操作可以选择一个节点,并删除它的整棵子树,删掉根节点的人输,A后B先,A不知道哪个是根节点,问A赢得概率。原创 2023-07-26 16:07:44 · 180 阅读 · 0 评论 -
Fine Logic
思路:如果数值对中要求u在v左边,v在w左边,那么u就得在w左边,所以他们之间具有传递性,同时,如果w要求在u左边,那么1个排列是肯定满足不了的,那么我们从每个数值对的u向v建边,有向图中无环和能用1个排列表示是充分必要条件,而如果有环时,最复杂的情况就是完全图,这是可以用1,2...n和n,n-1...1两个排列表示,可以看出这两个排列已经包含了题目中所有可能的图,我们再来看无环的情况,如果u1和u2都指向v,那么我们要把u1,u2都放在v的左边,所以取拓扑序即可。原创 2023-07-24 16:59:42 · 399 阅读 · 0 评论 -
City Upgrading hdu7279
题目大意:有一棵n个点的树,每个点的费用为ai,每个点可以覆盖到它本身和其相邻点,要求覆盖所有点,求最小花费。原创 2023-07-18 20:40:10 · 283 阅读 · 0 评论 -
F1. Omsk Metro (simple version) codeforces f1
思路:因为点权和都是+1和-1,所以如果我们知到根和v之间的最大连续区间和ma和和最小连续区间和mi,就可知所有在mi和ma之间的数都在里面必定出现过,如果要统计连续区间和masum,我们就先统计从1到v的点权和,如果当前和大于0,就维护最大值,也就是masum=max(0,上一个点的masum+当前点点权),然后对于每个点记录当前最大的连续区间和,也就是ma=max(masum,上一个点的ma),对于最小区间和同理,区别仅在于根节点的最大值初始化为1,最小值初始化为0,然后特判k=0的情况。原创 2023-07-15 13:11:22 · 347 阅读 · 0 评论 -
G. Rudolf and CodeVid-23 codeforces1846G
思路:可以发现s和一对字符串操作,就相当于s&(~e1)|e2(可以用真值表推导),因为字符串的位数最高是10位,也就是说无论怎么操作,最多出现1024个不同的字符串,所以我们可以把每个不同的字符串当做一个节点,先用bitset把字符串都转化为数字,然后每一对字符串作为边,用set来做bfs的队列,从起点开始,将set中的每个点都用上面的到的公式与每对字符串进行操作,如果到新的的距离小于之前记录的距离,就更新这个最短距离,最后队列为空后输出到0点的距离即可。原创 2023-07-11 15:52:47 · 268 阅读 · 0 评论 -
D2. LuoTianyi and the Floating Islands (Hard Version)
当n为偶数时,同理也只有中间两个点之间的这些点满足条件,如果在这些点中挪动,那么到k/2个点的距离分别+1,到另k/2个点的距离分别-1,总距离不变,如果移出这个范围,到k/2+1个点的距离会分别+1,到k/2-1个点的距离会分别-1,所以总距离+1,所以对于每一个点,可行点数v就是一半子树放k/2个点,另一半子树放k/2个点,等于C(k/2,子树大小)*C(k/2,另一边的子树大小)总的放点t的方案数是C(k,n),然后因为我们遍历时是左闭右开的遍历,所以答案是1+v/t。原创 2023-06-01 18:20:14 · 110 阅读 · 0 评论 -
The more, The Better HUD1561
状态表示:dp[u][j]表示在以节点u为根的子树中选择j个节点获得的最大价值 状态转移:对节点u的每一个子节点v,若在以v为根的子树内选择k个节点获得的最大价值为dp[v][k],则在以节点u为根的其余部分获得的最大价值为dp[u][j-k],两部分求和之后在与当前状态取最大值,方程:dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k])(k原创 2023-05-23 21:40:43 · 64 阅读 · 0 评论 -
C. Fools and Roads codeforces 191C
思路:树上边差分题,先将边权下放到点权,令每条边的终点的点权为边权,然后要统计边的访问次数,就将起点和终点的计数分别+1,因为起点和终点的lca为这个子树的根,所以计数应该为0,也就要-2,这样该子树以外的点的计数就都不变。题目大意:有一棵n个点的树,给出m个数对,每次从一个点出发到另一个点,问每条边被访问的次数。原创 2023-05-16 13:06:18 · 73 阅读 · 0 评论 -
松鼠的新家 51Nod - 3116(点差分)
题目大意:有一棵n个点的树,给出一长度为n的数组a,依次沿简单路径访问a[1],a[2],a[3]...a[n]号点,问每个点被访问的次数是多少。原创 2023-05-16 09:27:21 · 107 阅读 · 0 评论 -
E. Between codeforces 1816E
最后输出整个金字塔,每次输出都是从上到下。规则3:对于所有数对(a,b)在数组中每两个等于a的数中间至少有一个b。1原创 2023-04-18 14:34:34 · 88 阅读 · 0 评论 -
D. Sum Graph codeforces1816D
我们发现假如a[1]=2,那么我们依次询问1,(2~n),会发现有两个位置都是1,两个位置都是2,都需要额外的询问去确定这两个数的顺序,但如果我们依次询问:端点1的坐标,(1~n),那么我们得到的所有结果都是唯一的,所以只要我们确定了端点k,然后询问n-1次,就能确定其他数,想要确定端点,只需任取一个i,询问i和其他所有点,路径最长的点一定是端点,但我们无法确定端点具体是哪个,比如上图中可能是1也可能是4,因为可以输出两个排列,所以就分别假设端点为1和4,最终总询问数正好等于2n。原创 2023-04-16 17:34:57 · 86 阅读 · 0 评论 -
D. Game on Axis codeforces1787D
然后我们发现,如果在不做任何修改的情况下就能从1到终点,非法的方案数是很容易统计的,在从1到终点的这条路径上,对于每一个点,将指向终点方向的那条边指向自己或前驱节点,就会构成环,无法到达终点,同时在图中除了终点和1号点构成的树,还有其他的含环的连通分量,连接这些连通分量中的任意点也无法到达终点,所以要求出路径上每个点的前驱节点,在反向建边的情况下,就是求子节点数,用dfs即可简单求出,其他连通分量的点数就用n-树的大小即可。原创 2023-02-01 17:29:43 · 173 阅读 · 0 评论 -
D. Friendly Spiders codeforces1775D
思路:因为n的范围是3e5,所以建图最大的时间复杂度就是nlogn,这样的话我们对于每个数,将这个数的下标与这个数的所有质因数建边,因为如果两个数的gcd不等于1,那么他们一定有相同的质因数,这样的时间复杂度就是nlogn,因为边权都是1,所以我们从起点开始bfs,第一次找到终点时一定是最短路径,bfs同时保存路径。题目大意:有n个点,如果有两个点的权值ai的gcd不等于1,那么这两个点之间是联通的,问两点之间的最短距离。原创 2023-01-19 21:28:19 · 106 阅读 · 0 评论 -
D. Lucky Permutation codeforces1768D
如果我们交换2,1使1被放到排序好的位置,就相当于将1的出边指向自己,然后4的出边指向2,类似于链表删除元素的操作,所以对于有四个元素的环,3次操作就能使所有数排好序,所以要使整个列排好序只需要n-换的数量次操作,然后要有一个逆序对只需再额外交换两个相邻数即可,但是在排序的过程可能出现过两个相邻元素成一个点数为2的环,这样的环不需要拆,操作数不需要+1,而需要-1,所以我们对于在dfs时,对于每个环都用map记录当前访问过的元素,如果遇到过+1或-1的元素,就操作数-1。原创 2023-01-07 14:46:18 · 252 阅读 · 0 评论 -
E. Anya‘s Simultaneous Exhibition codeforces 1779E
那么有了以上结论的话,我们先n次询问得出每个人和其他所有人比的胜场,然后初始化最小冠军胜场x=最大的那个胜场数,然后将所有人按胜场数从多到少排序,然后对每个不是冠军的进行一次询问,让他与所有已确定的冠军比赛,如果有胜场,说明它也是候选冠军,维护最小胜场,然后将前面胜场大于等于x的没有被归为候选冠军的都归为候选冠军,总询问次数不超过2n。(如果有大佬知道怎么严谨证明,烦请留言指教)原创 2023-01-05 18:27:59 · 220 阅读 · 0 评论 -
2022CCPC绵阳 C. Catch You Catch Me codeforces104065C
思路:因为要拿的次数最少,所以我们应该每次拿的蝴蝶数量尽量多,而每只蝴蝶都是从下往上凑的,所以更浅的节点的蝴蝶数更多,所以我们应该从最浅的也就是1的子节点拿,而对于每个子节点拿的次数也就等于子树的最大深度,所以我们先dfs求出每个点从下到上的深度,然后累加1的子节点的深度。题目大意:有一棵以1为根节点有n个节点的树,除了根以外每个点都有一个蝴蝶,每分钟沿着向树根的简单路径走过一条边,每分钟可以任选捕获任意数量的点中的所有蝴蝶,要求不能让任意一只蝴蝶到达根节点,问最少要捕获几次。原创 2022-11-23 19:44:19 · 551 阅读 · 1 评论 -
C. Bulmart codeforces 730C
思路:因为每个超市可以任意选择数量,所以我们肯定优先选取单价最便宜的那个,那么我们可以二分答案,先dfs找出顾客所在位置到所有超市的最短距离,然后再判断在二分枚举的距离内的超市按照价格从小到大的顺序拿,直到拿够商品然后判断实际价格有没有超过预算,没超过,即可以把预设距离缩短试试,如果商品那不够,或者超出预算,就要加大预设距离。原创 2022-11-19 20:32:24 · 156 阅读 · 0 评论