[P3806] 【模板】点分治 - 点分治】的更多相关文章

P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式 n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出格式 对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NAY”(不包含引号) 输入输出样例 输入 #1复制 2 1 1 2 2 2 输出 #1复制 AYE 说明/提示 对于30%的数据n<=100 对于60%的数据n<=1000,m<=50…
POJ 1741. Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 34141   Accepted: 11420 Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and…
D. Distance in Tree time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standard output A tree is a connected graph that doesn't contain any cycles. The distance between two vertices of a tree is the length (…
[题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\)分 我直接把之前写的总结kuai过来 而选取其他位置(比如序列的最大值)由不能保证复杂度.但是如果每层分治的复杂度只与较小的一侧的大小有关,那么这个复杂度就等同于启发式合并的复杂度. 一句话证明启发式合并的复杂度:一次合并至少有一个集合倍增了. Luogu4755 Beautiful Pair(\(…
Part 1:CDQ分治 CDQ分治讲解博客 可以把CDQ分治理解为类似与归并排序求逆序对个数的一种分治算法(至少我现在是这么想的).先处理完左右两边各自对答案的贡献,在处理跨越左右两边的对答案的贡献. 例题: 逆序对(二维偏序) 过水,不讲. 三维偏序 第一维先sort,第二维由归并保证,第三维在归并时查询权值树状数组. \(Code:\) int n, k, tot; struct node{ int a, b, c, w, id; }p[N], tp[N]; int ans[N]; ll…
洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果memset清空ex数组显然是会T的,所以开一个bef用来记录需要清空哪个地方. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; ],to[],nx[],…
辣鸡蒟蒻怎么今天才来敲这个模板题 好像还敲了很久的样子 (大雾) #include <bits/stdc++.h> using namespace std; #define int long long const int N = 10005; vector<pair<int,int> > g[N]; int dis[N],siz[N],msiz[N],n,m,k[N],ans[N],u[N]; vector <int> st; int buc[1000000…
题目:https://www.luogu.org/problemnew/show/P4721 分治FFT:https://www.cnblogs.com/bztMinamoto/p/9749557.html https://blog.csdn.net/VictoryCzt/article/details/82939586 不知为何自己的总是很慢. 觉得是 n 和 m 表示次数的话,len<=n+m:n 和 m 表示项数的话,len<n+m:应该是这样? 这里是 mid-L+1 项和 R-L+1…
题目:https://www.luogu.org/problemnew/show/P4721 分治做法,考虑左边对右边的贡献即可: 注意最大用到的 a 的项也不过是 a[r-l] ,所以 NTT 可以只做到 2*(r-l),能快一倍. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long…
题目连接:https://www.luogu.org/problemnew/show/U60884 题意:有N个点,标号为1∼N,用N−1条双向带权通道连接,保证任意两个点能互相到达. Q次询问,问从编号为x的点到达标号L∼R的点其中一个点的最小距离是多少. 说明 :N,Q<1e5,边权<1e4; 思路:不难想到点分树,保存每个点到其“负责”的点的距离,这样的话可以套线段树,线段树保存其他点到点的距离. 但是,点分树上有个需要解决的问题是:如果x顺着点分树向父亲走,那么在父亲保存的线段树中要除…
题目链接:https://vjudge.net/problem/HDU-1007 题意:给定n个点,求平面距离最小点对的距离除2. 思路:分治求最小点对,对区间[l,r]递归求[l,mid]和[mid+1,r]的最小点对,取两者中的小者设为d.然后处理一个点在左区间,一个点在右区间的情况.一个点P在左区间,如果使它与右区间Q一个点距离小于d的话,那么P到mid的距离一定小于的,Q也是,且P和Q的纵坐标之差小于d.可以证明这样的Q点最多6个.那么我们把符合到mid距离小于d的点按y排序后,遍历一遍…
给定 $g[1....n-1]$,求 $f[0],f[1],...,f[n-1]$,其中   $f[i]=\sum_{j=1}^{i}f[i-j]g[j]$    变界为 $f[0]=1$ 答案模 998244353   分治 $FFT$:类似 $CDQ$ 分治,先处理左边,再处理左对右的贡献   假设当前的区间为 $[l,r]$,已经处理完 $[l,mid]$ 的所有 $f$ 值,考虑左面对右面的贡献   右面所有 $f$ 的下标为 $[mid+1,r]$   那么 $f[l,mid]*g[1…
#include<cstdio> #include<algorithm> #define N 50010 #define M 500010 #define rg register #define LL long long using namespace std; int n,m,cnt,root,tot,totnow,totbf; int last[N],size[N],mxsize[N],dep[N],tmp[N],mg[N]; LL ans=; bool v[N]; struc…
游荡的孤高灵魂不需要羁绊之处. 洛谷题单 点分治 前置芝士 树的重心 树分治 例题略解 P3806 [模板]点分治1 板子题,先暴力找到整棵树的重心,然后先求出重心到各点的距离,进而算出他所在树的各个节点的距离,在对应的ans数组加一;然后再接着扫子节点,并把儿子节点子树的贡献减去,最后回答询问. 然后我们愉快的\(TLE60pts\),题目上也有说明,这种做法使用于大部分不过本体比较卡时间,储存然后离线剪枝就好了. 这里给出\(60pts\)的\(code\) P2634 [国家集训队]聪聪可…
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B堆:每个节点一个,存所有儿子的堆的堆顶.特别地,如果该节点关灯,那么将加入一个0:如果没有元素,堆顶应返回负数. A堆:全局一个,存所有B堆的最大值和最小值之和.特别地,如果B堆不足两个,返回负数. 这样,我们一开始需要关闭所有的等,即对所有点调用一次turn_off.由于堆顶返回的是负数,删除时找…
题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他们的最小公共子树. 参考:[poj1741]Tree 树的点分治 代码: #include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<…
题意:给出一棵带边权树,询问有多少点对的距离小于等于\(k\) 本题解参考lyd的算法竞赛进阶指南,讲解的十分清晰,比网上那些讲的乱七八糟的好多了 不过写起来还是困难重重(史诗巨作 打完多校更详细做法 对于所有路径,以某个节点u来看分为两种情况 1.经过u的路径 2.不经过u的路径 能对答案有贡献的肯定是1类型,对2我们处理完1后递归求解 于是条件变为 以u为根的树中,其联通块中的点对符合 距离u之和小于等于k ① 且位于各不同的u的子树(u单独处理) ② 不妨先维护①再维护② 每一次选定根u后…
3672: [Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接.为了方便起见,我们将全国的 n 个城市用 1 到 n 的整数编号.其中SZ市的编号为 1.对于除SZ市之外的任意一个城市 v,我们给出了它在这棵树上的父亲城市 fv  以及到父亲城市道路的长度 sv. 从城市 v 前往SZ市的方法为…
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种特殊的分治方法,在 OI 界初见于陈丹琦 2008 年的集训队作业中,因此被称为 CDQ 分治. CDQ分治是将操作分治,用于解决"修改独立,允许离线"的问题.本质为按时间分治. 可以用CDQ的题目必须满足: 1.修改与询问互相独立,且修改之间互不影响 2.允许离线 那么我们将操作序列分为…
1.      括号匹配   有一棵树,每个节点上都有一个括号(左括号或者右括号).有多少个有序点对(u, v)从u到v的路径上的节点构成的字符串是一个合法的括号匹配?(我们称这样的点对是合法的) 输入格式 第一行是一个整数n,表示节点个数 第二行是一个字符串,由(和)组成,第i个字符表示第i个节点的括号. 接下来n-1行,每行两个整数u, v 表示u与v之间有一条边. 输出格式 输出一个整数,合法的点对数量. 输入样例 输出样例 4 ()() 1 2 2 3 3 4 4 数据范围和约定 30%…
传送门:http://poj.org/problem?id=1741 写的第一道树分治题,撒花纪念~ 对于每一对点对(i, j),它有三种情况: ① 其中一个是根节点.这种情况比较简单,直接加上就好了. ② 横跨根节点.这种情况是重点. ③ 不是以上两种情况.这时递归下去求解就好了. 那么对于第二种情况该怎么破呢?设根节点为root,那么dist(i, root) + dist(j, root) <= k,且需要i与j在不同的子树里.直接算不同子树的点对(i, j)的个数会麻烦,所以需要一点技巧…
题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中且不经过该节点. 2.路径经过该节点. 对于第一种点,我们递归处理:另外一种点.我们能够将全部子树的节点到这个子树的根节点的距离处理出来,然后排序处理出满足要求的点对的个数. 依照正常的树的结构来切割子树,这种做法的时间复杂度肯定是不好看的,为了让子树大小尽量同样.我们每次处理这个子树前找到这个子树的重心…
P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行,每行包含三个整数,表示一条无向边的两端和权值. 注意点的编号从 00 开始. 输出格式 输出一个整数,表示最小边数量. 如果不存在这样的路径,输出 -1−1. 输入输出样例 输入 #1复制 4 3 0 1 1 1 2 2 1 3 4 输出 #1复制 2 说明/提示 保证 n \leqslant 2…
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏. 他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树).并且每条“边”上都有一个数.接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵…
重写一遍很久以前写过的题. 考虑链上的问题.容易想到设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…
给你1e5个节点的树,(⊙﹏⊙) 你能求出又几对节点的距离小于k吗??(分治NB!) 这只是一个板子题,树上分治没有简单题呀!(一个大佬说的) #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #define maxn 10020 using namespace std; struct Node { int p; i…
存在2点间距离==k 输出AYE 否则输出NAY #include<stdio.h> #include<string.h> #include<algorithm> #include<vector> using namespace std; #define MAXN 100010 int n,m; int cnt,ans,mi,root,k; int head[MAXN],mx[MAXN],size[MAXN]; bool vis[MAXN]; struct…
题目大意:(同poj1741,刷一赠一系列) CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 40010 #define INF 0x3f3f3f3f using namespace std; int points,edges,k; int head[MAX],total; int next[MAX <<…
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 到…
[模板]洛谷·点分治 1.求树的重心 树的重心:若A点的子树中最大的子树的size[] 最小时,A为该树的中心 步骤: 所需变量:siz[x] 表示 x 的子树大小(含自己),msz[x] 表示 其子树中最大的子树的大小,sum表示当前子树所有节点个数,root表示当前子树根节点 处理出siz[x],msz[x] 按最大子树最小的标准处理出root inline void GetRoot(int x,int fa){ siz[x]=1;msz[x]=0;siz[x]//表示 x 的子树大小(含自…