首页 > 其他分享 >ABC301 Ex 题解

ABC301 Ex 题解

时间:2024-02-28 15:23:32浏览次数:22  
标签:连通 题解 边权 ABC301 Ex 考虑一下

题意:你有一张无向连通图,定义 \(d(s,t)\) 表示从 \(s\) 到 \(t\) 所有路径中最大边权的最小值。现在给你三个数 \(A_i,S_i,T_i\),让你求出当 \(A_i\) 这条边的边权 \(+1\) 时,\(d(S_i,T_i)\) 会增加多少。

首先考虑一下 \(A_j+1\) 什么时候会对 \(d(S_j,T_j)\) 有影响。

  • \(A_j>d(S_j,T_j)\) 时,明显不会产生影响。

  • \(A_j<d(S_j,T_j)\) 时,由于其只会 \(+1\),所以也不会产生影响。

考虑一下这两种情况怎么判断:令 \(G_i\) 表示只由原图中边权不超过 \(i\) 的边组成的图。把询问离线,将询问按照 \(A\) 从小到大排序,然后对每个连续段考虑。在 \(G_{w_{A_j}-1}\) 中,若此时 \(s_j,t_j\) 已经连通,那么显然 \(d(S_j,T_j)<A_j\)。否则将边权为 \(w_{A_j}\) 的点连起来,如果此时两点还不连通,说明 \(d(S_j,T_j)>A_j\)。这个过程用并查集维护即可。

最后考虑一下 \(A_j=d(S_j,T_j)\) 的情况:很明显,如果从 \(S_j\) 到 \(T_j\) 的所有路径都需要经过 \(A_j\),那么 \(d(S_j,T_j)\) 会 \(+1\),否则不变。

还是对每个连续段考虑,把边放在 \(G_{w_{A_j}}\) 中考虑,拎出所有边权 \(=w_{A_j}\) 的边,并将点离散化。那么,只有当 \(A_j\) 为割边,且 \(S_j\) 和 \(T_j\) 不在一个边双内的时候答案才为 \(1\)。

第一个条件直接在 Tarjan 的过程中判断即可,第二个可以用 DFS 序判断。

注意清空,还有数组要开大。

时间复杂度 \(O((m+q)\log q)\)(保留最高项),可以通过。

Code

带注释版

标签:连通,题解,边权,ABC301,Ex,考虑一下
From: https://www.cnblogs.com/syzqwq/p/18040549

相关文章

  • 第五届图灵杯中级组题解
    网址赛时得分\(25+50+5+1=81\),rk67,逊死了。赛后发现T1爆搜+剪枝有\(50\)分,我【】【】。总结:还是菜。A.等差数列首先特判\(n\le4\)的情况。此时答案必然为Yes,只需要两两分组即可。由于第一个数必然在其中一个等差数列内,不妨强制令其在第一个等差数列内。考虑......
  • CF351D - Jeff and Removing Periods 题解
    首先做一点显然的转化:在进行第一次操作之后,可以将相同的数排在一起,这样一次就能删掉一种数。如果一开始就能删光一种数的话,那么次数就是区间颜色数,否则就是区间颜色数\(+1\)。所以现在原问题变成了两个问题:求区间内不同颜色数,判断区间内是否有某种颜色满足其出现位置构成等差数......
  • P9755 [CSP-S 2023] 种树 题解
    首先考虑如何求出第\(i\)棵树在\([l,r]\)时间段能长多高。这个东西可以差分一下然后等差数列求和。放一下代码:inlinelllcalc(inti,intx){ if(c[i]>=0){ return(lll)b[i]*x+(lll)c[i]*x*(x+1)/2; }else{ intd=(b[i]-1)/(-c[i]); if(x<=d)return(lll)b[i]*x+(l......
  • Hudi-FlinkSQL导入数据报错:[ERROR] Could not execute SQL statement. Reason: java.l
    问题描述通过FlinkSQL创建Hudi表后,向表中插入数据报错:[ERROR]CouldnotexecuteSQLstatement.Reason:java.lang.ClassNotFoundException:org.apache.hadoop.fs.FSDataInputStream 解决办法向Hudi表中写入数据时,会调用Hadoop的Jar包,但是Flink的lib目录中没有该Jar包。......
  • A-E题解
    A:对于任意一个满足条件的2*2矩阵,要么3个R和1个W,要么3个W和1个R。我们以3个R和1个W举例,只有以下4中情况满足:RR   RR   RW   WRRW  WR  RR   RR所以一种构造方法如下:奇数行全部放R;偶数行奇数列放R,偶数列放W即可。voidsolve(){intn;......
  • CF756D Bacterial Melee 题解
    给一个\(O(n^2)\)的做法。考虑从左到右扫描最终得到的字符串,如果当前的字符和前一个字符相同,就删掉这个字符。由题意可知,最终得到的字符串一定是\(s\)的一个子序列。我们定义状态\(dp[i][j]\)表示:当前子序列的最后一个字符是\(s[i]\),已经填完了最终字符串的前\(j\)个字......
  • CF1034E Little C Loves 3 III 题解
    这道题与P6097【模板】子集卷积基本相同,但是每个元素的值属于\([0,3]\),且\(n\le21\),时限\(\rm1s\)。在做P6097这道题的时候,我们多开了一维用来记录二进制下\(1\)的个数。但是这道题每个元素的值只属于\([0,3]\),我们可以用一种十分巧妙的方法:我们设\(f(x)\)表示\(......
  • P2065 [TJOI2011] 卡片 题解
    看大家建图时中间都连了质数点,发一个不用质数点的解法。我们可以先从源点向每一个蓝色卡片对应的点连一条边,再从每一个红色卡片对应的点向汇点连一条边。如果两张卡片可以一起拿走,那就在它们之间连一条边(蓝色连到红色),这些边的最大流量都是\(1\)。建好图以后我们就可以直接用Di......
  • CF111D Petya and Coloring 题解
    很明显这是一道组合题。首先特判一下,当\(m=1\)时,答案就是\(k^n\)。对于\(m>1\)的情况,我们可以得出一个结论:对于沿格子的线穿过的任何垂直线,会将棋盘分成两个非空的部分,这两个部分中的不同颜色的数量相同且总是不变。设这个不同颜色的数量为\(i\),那么左边这部分的颜色一定......
  • [USACO13MAR]Farm Painting S 题解
    看大家好多写的都用了四维偏序,给一个不用偏序的解法。简化一下题目,就是给你\(n\)个矩形,第\(i\)个矩形用\((x1_i,y1_i,x2_i,y2_i)\)表示,问你有多少个\(i\)满足:不存在另一个\(j\)使得\(x1_j\lex1_i\lex2_j\wedgey1_j\ley1_i\ley2_j\)。我们从左到右扫描每一个......