Codeforces 293E 点分治+cdq】的更多相关文章

Codeforces 293E 传送门:https://codeforces.com/contest/293/problem/E 题意: 给你一颗边权一开始为0的树,然后给你n-1次操作,每次给边加上边权,问你n-1次操作后有有多少对点之间的路径长度小于等于l,并且边权和小于等于w 题解: poj1741 点分治裸题是 边权和小于等于k,这里加了一个路径条数的限制 对于这个路径条数和边权的两个限制,我们可以得到两个不等式,可以用点分治得到满足距离的一个数组a 将数组a按照距离从小到大排序后,就可…
洛谷 Codeforces 简单的CDQ分治题. 由于对话要求互相看见,无法简单地用树套树切掉,考虑CDQ分治. 按视野从大到小排序,这样只要右边能看见左边就可以保证互相看见. 发现\(K\)固定,那么左右按智商排序.位置离散化之后可以\(two\;pointers\)一下,套个树状数组,就做完了. 由于复杂度瓶颈在树状数组,没必要归并,可以直接\(sort\). 复杂度应该是\(O(n\log^2 n)\). #include<bits/stdc++.h> namespace my_std{…
洛谷 Codeforces 这题我写了四种做法-- 思路 不管做法怎样,思路都是一样的. 好吧,其实不一样,有细微的差别. 第一种 考虑位置\(x\)对区间\([l,r]\)有\(\pm x\)的贡献当且仅当\(pre_x\!\!<\!l \;or\;nxt_x\!\!>\!r\),其中\(pre,nxt\)表示与\(x\)同种颜色的前驱后继. 那么题目就转化为二维数点了:一维是位置,一维是前驱/后继,权值是\(\pm​\)位置. 第二种 考虑最后的减去开始的等价于每一位减去前面的. 即位置\…
In this problem you will meet the simplified model of game Pudding Monsters. An important process in developing any game is creating levels. A game field in Pudding Monsters is an n × n rectangular grid, n of its cells contain monsters and some other…
题目传送门 题意:现在有一棵树,每条边的长度都为1,然后有一个权值,求存在多少个(u,v)点对,他们的路劲长度 <= l, 总权重 <= w. 题解: 1.找到树的重心. 2.求出每个点到中心的长度和权值. 3.对所有点都询问出合法点的个数(包括同一颗子树)加到答案上. 4.对于每一棵子树内部都找到合法点的个数从答案中减去. 5.递归处理每一颗子树. 我们现在最大的问题就是怎么计算合法点的个数. 我们把点的信息记录下来之后,按照权重从小到达排序. 然后我们就可以用2个端点维护出 a[l].we…
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种特殊的分治方法,在 OI 界初见于陈丹琦 2008 年的集训队作业中,因此被称为 CDQ 分治. CDQ分治是将操作分治,用于解决"修改独立,允许离线"的问题.本质为按时间分治. 可以用CDQ的题目必须满足: 1.修改与询问互相独立,且修改之间互不影响 2.允许离线 那么我们将操作序列分为…
重写一遍很久以前写过的题. 考虑链上的问题.容易想到设f[i]为i到1的最少购票费用,转移有f[i]=min{f[j]+(dep[i]-dep[j])*p[i]+q[i]} (dep[i]-dep[j]<=l[i]).套路的考虑若j转移优于k(dep[j]>dep[k]),则f[j]-dep[j]*p[i]<f[k]-dep[k]*p[i],f[j]-f[k]<(dep[j]-dep[k])*p[i],(f[j]-f[k])/(dep[j]-dep[k])<p[i].若没有l…
传送门:https://codeforces.com/problemset/problem/161/D 题意: 求树上点对距离恰好为k的点对个数 题解: 与poj1741相似 把点分治的模板改一下即可,我们依然是求得一个dep数组,然后根据这个dep数组来更新两点间的距离,由于k的范围只有500,所以我们可以直接开一个500的数组来统计两点间距离的数量 代码: #include <set> #include <map> #include <cmath> #include…
游荡的孤高灵魂不需要羁绊之处. 洛谷题单 点分治 前置芝士 树的重心 树分治 例题略解 P3806 [模板]点分治1 板子题,先暴力找到整棵树的重心,然后先求出重心到各点的距离,进而算出他所在树的各个节点的距离,在对应的ans数组加一;然后再接着扫子节点,并把儿子节点子树的贡献减去,最后回答询问. 然后我们愉快的\(TLE60pts\),题目上也有说明,这种做法使用于大部分不过本体比较卡时间,储存然后离线剪枝就好了. 这里给出\(60pts\)的\(code\) P2634 [国家集训队]聪聪可…
题意:给你一个序列a[i],对于每个询问xi,求出有多少个(l,r)对使得gcd(al,al+1...ar)=xi. 表面上是询问,其实只要处理出每个可能的gcd有多少个就好了,当左端点固定的时候,随着右端点的移动,gcd必然是单调非增的,而且个数不会超过log(a[i])个,所以总的不同的个数的上界是nlog(ai),所以求出所有是可行的. 一个分治的做法是这样的,对于一个区间[l,r],分治成[l,mid],[mid+1,r]求解,然后就是合并,合并的时候首先求以[l,mid]右端点为结束点…
按位贪心,以当前考虑位是0还是1将数分成两部分,则MST中这两部分之间只会存在一条边,因为一旦有两条或以上的边,考虑两条边在原图中所成的环,显然这两条边有一条是环上的权值最大边,不会出现在MST中.则建出trie后每次分治时用数较少的部分在trie上贪心求出边的最小权值即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring>…
题目传送门 这是一条通往vjudge的高速公路 这是一条通往Codeforces的高速公路 题目大意 给定一个$n$阶完全图,每个点有一个权值$a_{i}$,边$(i, j)$的权值是$(a_{i}\  xor\  a_{j})$.一个生成树的权值是各边的权值和.问最小生成树的权值. 设值域为$[0, 2^{k})$. 当$k = 1$的时候,显然将点权为0的点之间互相连边,点权为1的点之间互相连边,中间随便连一条. 当$k = x\ (x > 1)$的时候,将这些点按照二进制的第$k$位分成两…
题目链接 正解:点分治+树状数组. 点分治板子题,直接点分以后按照$w$排序,扫指针的时候把$w$合法的路径以$l$为下标加入树状数组统计就行了. 写这道题只是想看看我要写多久..事实证明我确实是老年选手了,这种傻逼题写+调竟然用了$40min$.. #include <bits/stdc++.h> #define il inline #define RG register #define ll long long #define lb(x) (x & -x) #define N (3…
题意:给出一棵点带权的树,求i\(\in\)[1,200000]所有路径的上点权的gcd==i的个数. 考虑点分治,对于一棵以u为根的子树,如何统计经过u的路径的答案? 显然既然是经过点u的路径,那么所有经过u的路径上的点权的gcd肯定是点u的点权的约数. 暴力算下,2e5以内最多只有160个约数. 然后dfs出u子树里所有点到u路径的gcd,然后用个桶,最多\(u的点权的约数个数^2\)数下数就行了,但是实际应该是远远不满的. 最慢的一个点1404ms,4.5s的时限应该没什么问题. 然而这题…
题目:https://vjudge.net/contest/307753#problem/J 题意:一棵树,每个点都有个权值,现在问你,树上gcd每个不同的数有多少个 思路:点分治,首先范围只有 1e5,然后我们记录一条路径的gcd,我们在重心确定后找路径,每到gcd一个数,这条路径必然是父亲节点的因子,一个数的因子不同的个数很少,其实就相当于是几个数的不同因子数,所以gcd路径不同的个数肯定很少,我们就可以在遍历子树的时候直接暴力之前出现过的路径值了,复杂度 应该是 O(n*logn*logn…
题意:有一颗树,每个点有一个点权,边权都是1,问路径上的所有点的gcd不是1的最长路径是多少? 思路:之前补这道题的时候,用分解质因数 + 树形DP做的,其实用点分治可以更暴力一点.对于这类统计树上路径的问题,点分治是一种通用,高效的解法.对于所有的路径,无非两种情况:经过某个点,不经过某个点,我们对于每个点统计的相当于是经过该点的路径的信息.点分治为以下几步:1:找重心.2:以找到的重心为根,解决经过该点的路径的问题.3:递归的找其它子树的重心,解决问题.找经过该点的路径时,直接搜索求gcd,…
[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题. 在定位系统中,世界被认为是一个W*W的正方形区域,由1*1的方格组成.每个方格都有一个坐标(x,y),1<=x,y<=W.坐标的编号从1开始.对于一个4*4的正方形,就有1<=x<=4,1<=y<=4(如图): 请帮助Moki…
大意: n结点无向完全图, 给定每个点的点权, 边权为两端点异或值, 求最小生成树…
3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1749  Solved: 885[Submit][Status][Discuss] Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接.为了方便起见,我们将全国的 n 个城市用 1 到…
要点 因为当前最大字符只有一个且两边是回文的,所以如果答案包含最大字符则一定是重合部分. 若不包含,则用此字符将两个区间分别断为两部分,则共有四种组合,答案一定为其中之一. #include <cstdio> #include <algorithm> using namespace std; int l1, l2, r1, r2; int Divide(int a, int b, int c, int d, int depth) { if (a > b || c > d…
/* CDQ分治的对象是时间. 即对于一个时间段[L, R],我们取mid = (L + R) / 2. 分治的每层只考虑mid之前的修改对mid之后的查询的贡献,然后递归到[L,mid],(mid,R]. 显然,CDQ分治是一种离线算法,我们需要将所有的修改/查询存下来,一起进行操作. 同时,CDQ分治还需要满足:操作之间相互独立,即一个操作的存在不会影响到另一个操作的存在. 经典入门题 单点修改 矩形查询 如果此题矩形小一点的话 可以使用树状数组套线段树 但是矩形过大时就不适用了 这里可以将…
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内所有格子的数的和. 数据规模:操作1) ≤ 160000,操作2) ≤ 10000,n ≤2000000. 二维树状数组不行了... 每个询问拆成4个,然后所有操作按$x,op$排序 对时间进行$CDQ$分治 $CDQ(l,r)$过程中,用时间$(1,mid)$的$ADD$操作更新$(mid+1,r…
[BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的东西 那么,对于每一个已经固定好的左下角 我们可以通过单调栈来维护答案 既然只有左下角对右上角会产生贡献 那么,按照\(x\)轴排序之后可以\(CDQ\)分治 \(CDQ\)分治怎么搞? 如果在上面的基础上多了几个点.. 那几根棕色的线链接的连是不能贡献答案的 我们来看看: 这些点的\(y\)轴都在…
作为一个永不咕咕咕的博主,我来更笔记辣qaq CDQ分治 CDQ分治的思想还是比较简单的.它的基本流程是: \(1.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作结果的修改操作在序列中一定会在这一个查询操作前面 \(2.\)将这一段序列分为左右两半,递归解决左右两半的子问题 \(3.\)考虑左半部分的修改操作对右半部分的查询操作的贡献 CDQ分治的基本思想就是在分治的过程中统计左半部分对右半部分的影响 上面的过程可能比较抽象,举个栗子:归并排序求逆序对 别告…
初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. --by __stdcall 其实CDQ分治名字听上去很高大上,其实和一般的分治没有特别大的区别,其大体流程如下: 将问题抽象为一个区间\([l,r]\)内的问题(废话) 分:将问题分解成左\([l,mid]\)右\([mid+1,r]\)两部分,然后递归操作 治:合并两个子问题,同时考虑到\([l…
前言 陌上花开,可缓缓归矣                         --吴越王 寓意:意思是:田间阡陌上的花开了,你可以一边赏花,一边慢慢回来. 隐意:春天都到了,你怎么还没有回来.形容吴越王期盼夫人早日归来的急切心情. Ask:那么这和cdq有什么关系呢? Answer:并没有什么关系,增强语文水平而已,现在来看一到题目:陌上花开.这就有关系了吧. 题目大意是:有\(n\)个元素,第\(i\)个元素有\(a_i,b_i,c_i\)三个属性,设\(f(i)\)表示满足\(a_j≤a_i\…
更新了三维偏序问题的拓展 cdq分治 \(cdq\)分治是一种由\(IOI\ Au\)选手\(cdq\)提出的离线分治算法,又称基于时间的分治算法. 二维偏序问题 这是\(cdq\)分治最早提出的时候解决的问题,大意为:给定\(n\)对二元组\((a_{i},b_{i})\),求\(cnt_i=\sum_{j=i+1}^n[a_j>a_i\ and \ b_j>b_i]\). 这个和逆序对有点像,先将二元组按\(a\)为第一关键字排序,那么\(a\)就一定有序了,即求下标和数值(\(b\))都…
B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一共有几种不同的颜色 一开始做的时候直接就是开51个vector保存每个颜色相应的点,然后就是询问就是,暴力循环判断这个颜色存不存在一个满足条件的点,感觉最差情况下应该会超时,不过却过了 #include<cstdio> #include<vector> using namespace…
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有的金券. 设dp[i]表示第i天卖出所有金券的能够得到的钱数.则有: \[dp[i]=max(dp[i-1],\frac{dp[j]}{A[j] \times R[j]+B[j] } \times (A[i] \times R[j]+B[i])) (0 \leq j < i)\] 意义是第j天按R[…
cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + R) / 2,分治的每层只考虑mid之前的修改对mid之后的查询的贡献,然后递归到[L,mid],(mid,R]. 整体二分就是将所有询问一起二分,然后获得每个询问的答案.CDQ相比整体二分略有不同,整体二分是按照答案进行分治. cdq和整体二分适用范围:处理一些用数据结构(如树套树)做起来非常令…