Codeforces 848C (cdq分治)】的更多相关文章

虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ分治的入门教程 下面是正文: 首先整理一下条件: 每个点有三个属性,x,r,f 统计有多少对点i,j满足 min(ri,rj) >= |xi-xj| 且 |fi-fj| <= k,这样的点对被称作是“坏的” 对r值取min是个烦人的条件,于是我们把点按照r值从大到小排序,按照r值从大到小的顺序依次…
大意: 给定$n$个三元组$(x,r,f)$, 求所有对$(i,j)$, 满足$i<j, |f_i-f_j|\le k, min(r_i,r_j)\ge |x_i-x_j|$ 按$r$降序排, 去掉$min$, 然后就是个裸的三维数点问题, 可以用$CDQ$分治解决. #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <ma…
题意:你需要维护一个multiset,支持以下操作: 1:在某个时间点向multiset插入一个数. 2:在某个时间点在multiset中删除一个数. 3:在某个时间点查询multiset的某个数的个数. 思路:该题相当于要构建一个在任意位置插入,并查询前缀操作的某个值的多少.乍一看比较棘手,搞不好还要数据结构的嵌套.但是转化一下思路,用cdq分治这题非常简单.分治过程中按时间排序即可,用map维护前半部分产生的影响,后面如果有查询在map中查询即可. 代码: #include <bits/st…
题面 One day Polycarp decided to rewatch his absolute favourite episode of well-known TV series "Tufurama". He was pretty surprised when he got results only for season 7 episode 3 with his search query of "Watch Tufurama season 3 episode 7 on…
大意: n个机器人, 位置$x_i$, 可以看到$[x_i-r_i,x_i+r_i]$, 智商$q_i$, 求智商差不超过$k$且能互相看到的机器人对数. 这个题挺好的, 关键是要求互相看到这个条件, 直接求的话是个四维数点问题, 但是可以发现按照$r$排序后, $r$小的能看到的一定能互相看到, 所以就是一个简单的三维数点了. #include <iostream> #include <iostream> #include <algorithm> #include &…
Codeforces 848C Goodbye Souvenir Problem : 给一个长度为n的序列,有q个询问.一种询问是修改某个位置的数,另一种询问是询问一段区间,对于每一种值出现的最右端点的下标与最左端点的下标的差值求和. Solution : 定义pre[i] 为 第i个位置的数字上一次出现位置,对于询问l, r 就是对于所有满足 l <= pre[i] < i <= r 的点求和,权值为 i - pre[i]. 因此可以把这个看作是三维偏序的问题,第一维时间,第二维,第三…
题面传送门 考虑记录每个点的前驱 \(pre_x\),显然答案为 \(\sum\limits_{i=l}^{r} i-pre_i (pre_i \geq l)\) 我们建立一个平面直角坐标系,\(x\) 轴表示下标 \(i\),\(y\) 轴表示前驱 \(pre_i\),点权为 \(i-pre_i\). 每次询问以 \((l,l)\) 为左下角,\((r,n)\) 为右下角的矩形中所有点的权值和. 至于修改操作,就是撤销上次操作的贡献,加入新的贡献. 至此,我们就把问题转化为单点加,矩形和的问题…
洛谷 Codeforces 这题我写了四种做法-- 思路 不管做法怎样,思路都是一样的. 好吧,其实不一样,有细微的差别. 第一种 考虑位置\(x\)对区间\([l,r]\)有\(\pm x\)的贡献当且仅当\(pre_x\!\!<\!l \;or\;nxt_x\!\!>\!r\),其中\(pre,nxt\)表示与\(x\)同种颜色的前驱后继. 那么题目就转化为二维数点了:一维是位置,一维是前驱/后继,权值是\(\pm​\)位置. 第二种 考虑最后的减去开始的等价于每一位减去前面的. 即位置\…
洛谷 Codeforces 思路 一开始想到莫队+bitset,发现要T. 再想到分块+bitset,脑子一抽竟然直接开始写了,当然也T了. 最后发现这就是个裸的CDQ分治-- 发现\(a\)不变,可以处理出每个数在\(a\)中的位置\(pos\). 然后处理出\(aa_i=pos_{b_i}\),交换时就是\(swap(aa_x,aa_y)\). 把每个位置看成\((i,aa_i)\)的点,查询\(l1,r1,l2,r2\)时就是查以\((l2,l1)\)为左下角,\((r2,r1)\)为右上…
洛谷 Codeforces 简单的CDQ分治题. 由于对话要求互相看见,无法简单地用树套树切掉,考虑CDQ分治. 按视野从大到小排序,这样只要右边能看见左边就可以保证互相看见. 发现\(K\)固定,那么左右按智商排序.位置离散化之后可以\(two\;pointers\)一下,套个树状数组,就做完了. 由于复杂度瓶颈在树状数组,没必要归并,可以直接\(sort\). 复杂度应该是\(O(n\log^2 n)\). #include<bits/stdc++.h> namespace my_std{…