首页 > 其他分享 >ABC294 EFG 题解

ABC294 EFG 题解

时间:2024-02-28 15:37:09浏览次数:16  
标签:二分 log 树剖 题解 复杂度 long 即可 EFG ABC294

E - 2xN Grid

题意

给你一个 \(2\times L\) 的网格,但是 \(L\) 很大,所以用以下形式压缩:

将同一个颜色的连续段视为一个整体,那么每一行就可以用若干个二元组 \((a_i,b_i)\) 表示,其中 \(a_i\) 为颜色,\(b_i\) 为连续段的长度。保证长度 \(\le10^5\)。

输入以上述形式压缩,现在让你求出有多少个位置上下两个元素相同。

Solution

首先很容易就能算出连续段的左右端点,这样就转化为了对若干个区间的操作。

然后一个看起来很合理的做法就是,从左到右同时扫描两个数组,然后取交集计算即可。

实际上也是对的。双指针即可,时间复杂度 \(O(n)\),可以通过此题。

注意要开 long long

代码

F - Sugar Water 2

比较奇怪的二分题。

首先把分子上的 \(100\) 拿掉,这样浓度就变成了糖质量和糖水质量的比值。

考虑二分这个浓度 \(x\),因为糖和糖水的比值是 \(\dfrac{x}{1}\),所以糖和水的比值就是 \(\dfrac{x}{1-x}\)

其中 \(x\) 是糖的质量,\(y\) 是水的质量。

考虑实现 check 函数:由于要求当前浓度 \(mid\) 是第 \(k\) 大,所以只需要算出 \(n\times m\) 中方案中有多少种是 \(\ge mid\) 的即可。如果 \(<k\),说明浓度大了,令 \(r=mid\);否则,说明浓度小了,令 \(l=mid\)。

所以现在的问题就转化为了,如何求出有多少种方案的浓度 \(\ge\) 一个数 \(x\)。

假设糖质量为 \(a\),水质量为 \(b\),那么可以根据上面计算的糖和水的比算出 \(s=a-\dfrac{x}{1-x}b\)。而 \(s\) 的含义就是“当前糖的质量比凑出浓度为 \(x\) 的糖水所需要的糖的质量要多多少”。因此我们只需要从两个数组当中分别挑出一杯糖水,使得其 \(s\) 之和 \(\ge0\) 即可。

这个过程可以二分查找,这样就可以以 \(O(m\log n)\) 或者 \(O(n\log m)\) 的复杂度完成 check 了。再加上外层的二分,时间复杂度是 \(O(mk\log n)\) 的。其中 \(k\) 为外层二分次数,这里我设置为 \(100\),足够满足精度限制,也可以理解为是 \(\log^2\) 的。

最后乘 \(100\) 即可。

再就是 \(n\times m\) 会爆 int,要开 long long

代码

G - Distance Queries on a Tree

树剖板子。

由于树剖不是很容易处理边权,因此考虑一个经典套路:由于一个节点只有一个父亲,因此我们只需要把边权赋在儿子节点上,就可以唯一地代表儿子 \(\to\) 父亲这条路径的权值。

实际操作只需要判断深度即可,然后剩下的就是正常的树剖操作了。注意 \(lca\) 的点权是 \(lca\to fa(lca)\) 这条边的边权,不在 \(x\to y\) 的路径上,单独排除这个点即可。

然后就做完了,时间复杂度 \(O(m\log^2n)\),可以通过此题。

当然这道题也可以维护节点到根节点路径的权值和。这样每次修改相当于对儿子节点子树内的所有点的点权进行修改,DFS 序搞一下即可。查询差分一下即可,时间复杂度 \(O(m\log n)\),更为优秀。

树剖

更好的做法

标签:二分,log,树剖,题解,复杂度,long,即可,EFG,ABC294
From: https://www.cnblogs.com/syzqwq/p/18040569

相关文章

  • P1110 [ZJOI2007] 报表统计 题解
    考察点:STL的熟练运用。记:\(l_i\)表示序列中不超过\(a_i\)的最大数,\(r_i\)表示序列中超过\(a_i\)的最小数。开一个vectorinsert[N]存储\(a_i\)后面插入的所有数字。首先,我们使用一个multisets1来存储相邻元素的差的绝对值,然后再开一个multisets2来存储当前出......
  • CodeChef Chef and Churus 题解
    对给出的\(n\)个区间分块,设块长为\(B\)。每个块内计算每个位置的贡献(被覆盖次数)。具体地,记\(f_{i,j}\)表示第\(i\)个块第\(j\)个数被覆盖了多少次,这个可以用差分轻松维护。预处理复杂度\(O(\frac{n^2}{B})\)。现在考虑修改。记\(ans_i\)表示块\(i\)的贡献,那么对于......
  • ABC303 G 题解
    区间DP。设\(f_{l,r}\)表示只考虑\([l,r]\),先手得分减后手得分的最大值(并不关心谁是先手谁是后手),区间长度\(len=r-l+1\)。然后对三种情况分别讨论:使用操作一,此时取掉左/右端点的部分先手后手互换,对答案的贡献为\(\max(a_l-f_{l+1,r},a_r-f_{l,r-1})\)。使用操作二,继......
  • P1668 题解
    两种做法。一、最短路题目要求区间数量最小。如果能建出图来,就可以转换为最短路问题。具体地,我们从\(l-1\tor\)连一条长度为\(1\)的边,意味着要多经过\((l-1,r]\)这一个区间。这是左开右闭的形式。现在还有一个问题:通过这种边我们只能到达区间的右端点,如果想向左到达区......
  • P1266 速度限制 题解
    考虑分层图。把图按速度分成\(V\)层,\(f_{i,j}\)表示点\(i\)在第\(j\)层(速度为\(j\))的编号。注意:这里的速度为\(j\)是指到达\(i\)那一条边的速度(\(i\)为终点)。考虑一种naive的建边方式:首先,记当前点为\(u\),速度为\(i\);\(u\)的出边速度为\(j\),长度为\(l\),终点......
  • ABC302 Ex 题解
    首先我们考虑\(v\)固定怎么做。实际上就是ARC111B。考虑建图,对每个\((a_i,b_i)\)建一条无向边,那么问题就变成了:对于每条边都要选择它以及其连接的一个点,最大化选出的点数。很明显可以对每个连通块分开考虑。记当前连通块的点数为\(V\),边数为\(E\)。那么有结论:该连通块对......
  • 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_......
  • 第五届图灵杯中级组题解
    网址赛时得分\(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......