首页 > 其他分享 >CodeChef Chef and Churus 题解

CodeChef Chef and Churus 题解

时间:2024-02-28 15:26:46浏览次数:14  
标签:frac 每个 题解 复杂度 Chef 修改 ans 区间 Churus

对给出的 \(n\) 个区间分块,设块长为 \(B\)。

每个块内计算每个位置的贡献(被覆盖次数)。具体地,记 \(f_{i,j}\) 表示第 \(i\) 个块第 \(j\) 个数被覆盖了多少次,这个可以用差分轻松维护。预处理复杂度 \(O(\frac{n^2}{B})\)。

现在考虑修改。记 \(ans_i\) 表示块 \(i\) 的贡献,那么对于每个块 \(i\),\(ans_i\leftarrow ans_i-f_{i,x}\times a_x+f_{i,x}\times y\) 即可。对每个块处理完后再令 \(a_x=y\)。时间复杂度 \(O(\frac{mn}{B})\)。

最后是查询。整块直接累加 \(ans\) 值即可,问题是散块。一个 naive 的想法是对每一块维护一个线段树/树状数组 ,然后对 \(2B\) 个区间都求一下区间和。但是这样复杂度会带 \(\log\),不是很优。

考虑对原序列再分一次块,但是发现如果每个位置维护当前 \(a_i\) 的值的话复杂度会凭空多一个 \(B\),显然不行。转换思路,第 \(i\) 个位置维护 \(\sum_{j=1}^{i}a_j\),也就是前缀和。那么单点修改就对应了 \([x,n]\) 这一个区间的修改,复杂度 \(O(B+\frac{n}{B})\),查询就直接 \(O(1)\) 差分即可。这样散块的复杂度就变成了 \(O(\frac{n}{B}+B)\)。

现在重新分析一下复杂度:预处理复杂度不变。而区间和原序列的分块互不影响,所以修改的复杂度为 \(O(\frac{mn}{B}+B+\frac{n}{B})\),查询复杂度 \(O(\frac{n}{B}+B)\)。此时 \(B\) 取 \(\sqrt{n}\) 最优,为 \(O(n\sqrt{n})\)(\(n,m\) 同级),实现了复杂度平衡。

代码:

咕咕咕。

标签:frac,每个,题解,复杂度,Chef,修改,ans,区间,Churus
From: https://www.cnblogs.com/syzqwq/p/18040510

相关文章

  • 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......
  • 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\)个字......