BZOJ - 4066 KD树 范围计数 暴力重构】的更多相关文章

题意:单点更新,大矩阵(\(n*n,n≤10^5\))求和 二维的KD树能使最坏情况不高于\(O(N\sqrt{N})\) 核心在于query时判断当前子树维护的区间是否有交集/当前子节点是否在块中,然后暴力.... 然后跑30s的KD树... 维护size的重构方法不知为何T了,借鉴了hzwer的按数目重构 一个微小的工作是如果更新时点相同那就直接合并,不要另开(虽然还是可以轻易地被卡) T了三天三夜的题总算告一段落了 #include<bits/stdc++.h> #define rep(…
题意:给定数列\(a[1...n]\),\(Q\)次查询\([L,R]\)中只出现一次的最大值 这道题的做法比较劲.. 对每个元素构造三维空间的点\((i,pre[i],next[i])\),查询\([L,R]\)可以转换为查询\((L≤x≤R,y<L,z>R)\)的区间的最大值 就是说前一个和后一个都不在这个范围内的值 除此以外要注意剪枝!直接按照上面的思路码是会T的 比如随机乱跑,估计一下子树的\(max\)是否比当前答案更优,或者估价边界是否应该搜索(后者我没有写,也就慢个4s..) #…
3489: A simple rmq problem Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 551  Solved: 170[Submit][Status][Discuss] Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. Input 第一行为两个整数…
知道prufer序列就能写...就是求个可重集的排列...先判掉奇怪的情况, 然后答案是(N-2)!/π(d[i]-1)! --------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring>   using namespace std;   typedef long long l…
1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MB Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数. Input 第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输…
省赛后躺尸几天又回来更新了,内容是说好的KD树.. 具体操作从代码中感受一下 感觉已经把KD树尽量封装好了(虽然全局的D看着极不顺眼) 需要注意的是估值函数的判断条件 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #define rrep(i,j,k) for(register int i=j;i>=k;i--) #define erep(i,u) for(register int…
[题目描述] 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来. 仔细看看的话,这棵大树实际上是一个带权树.每个时刻他会长出一个新的叶子节点.每个节点上有一个可爱的小精灵,新长出的节点上也会同时出现一个新的小精 灵.小精灵是很萌但是也很脆弱的生物,每个小精灵i都有一个感受能力ri,小精灵i,j成为朋友当且仅当在树上i和j的距离 dist(i,j)<=ri+rj,其中dist(i,j)表示在这棵树上i和…
题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后再乘起来 注意此题无解须要输出0 当n!=1&&d[i]==0时 输出0 当Σ(d[i]-1)!=n-2时输出0 写代码各种脑残--竟然直接算了n-2没用阶乘-- #include<cstdio> #include<cstring> #include<iostre…
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同,例如下面两棵树的DFS序都是1 2 4 5 3,BFS序都是1 2 3 4 5 现给定一个DFS序和BFS序,我们想要知道,符合条件的有根树中,树的高度的平均值.即,假如共有K棵不同的有根树具有这组DFS序和BFS序,且他们的高度分别是h1,h2,...,hk,那么请你输出 (h1+h2..+hk)…
描述 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数. 题解 每颗树都对应以中prufer数列, prufer数列中数出现的个数 $=$ 节点的度数 -1 所以变成了求再prufer数列中, $x$出现次数为$c_x$ 的排列数 答案为$!(N - 2) / \prod\limits_{i = 1}^N{a_i-1}$ 直接算会爆LL…
Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, -, dn,编程需要输出满足d(vi)=di的树的个数. Input 第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的树不超过10^17个. Output 输出满足条件的树有多少棵. Sample Input 4 2 1…
prufer的应用.. 详细见这篇博客:https://www.cnblogs.com/dirge/p/5503289.html import java.math.BigInteger; import java.util.*; public class Main { static long n, h; public static void main(String[] args) { Scanner in = new Scanner(System.in); BigInteger f[] = new…
传送门:pid=2966" target="_blank">点击打开链接 题意:给n个点,求对于每一个点到近期点的欧几里德距离的平方. 思路:看鸟神博客学kd树劲啊点击打开链接 kd树事实上是暴力树.,真的. . 它把一个平面划分成了非常多个小平面.每次划分的根据是平面中按x排序的点的中位数或者是按y排序的点的中位数. 建树的复杂度是稳定O(nlogn),可是查询就是大暴力了 把平面分成非常多个小平面后,相当于在平面上搜索剪枝. kd树是一颗二叉树,假如我要查找离(a,…
Problem - 4347 一道KNN的题.直接用kd树加上一个暴力更新就撸过去了.写的时候有一个错误就是搜索一边子树的时候返回有当前层数会被改变了,然后就直接判断搜索另一边子树,搞到wa了半天. 代码如下: #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; ;…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支持矩阵查询即可,每隔5000个插入暴力重构树. [代码] #include <cstdio> #include <algorithm> using namespace std; const int N=300000,INF=1e9; namespace KD_Tree{ struct…
Prufer序列+组合数学 嗯哼~给定每个点的度数!求树的种数!那么很自然的就想到是用prufer序列啦~(不知道prufer序列的……自己再找找资料吧,这里就不放了,可以去做一下BZOJ1005明明的烦恼) 那么我们令每个点的度数v[i]-1,得到每个节点在prufer序中的出现次数! 现在就是求这个prufer序有多少种了……有两种做法: 1.多重集排列数:n个元素,每种元素有a[i]个,求全排列的方案数,自己随便yy一下就可以得到$$ans=\frac{n!}{\prod (a[i]!)}…
bzoj 3053 HDU 4347 : The Closest M Points  kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差较大的维度分开(建树常数大)或者每一位轮换分割(询问常数大),后者更快也更好些,以后就果断写第二种了. #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using…
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数表示 N个节点上的权值.  接下来 M行,每行包含两个整数x和 y,表示初始的时候,点x和点y 之间有一条无向边, 接下来 T行,每行描述一个操作,格式为“Q x y k”或者“L x y ”,其含义见题目描述部分. Output 对于每一个第一类操作,输出一个非负整数表示答…
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #include <bits/stdc++.h> using namespace std; #define mk(x, y) make_pair(x, y) #define mem(a) memset(a, 0, sizeof(a)) #define fi first #define se second…
1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数. Input 第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2716 [题目大意] 给出一些点,同时不断插入点和询问某点离插入点最近距离 [题解] 我们对于给定的点直接建树,之后动态插入查询即可,重建会超时, 直接插入就可以过了 [代码] #include <cstdio> #include <algorithm> using namespace std; const int N=1500000,INF=1e9; inline in…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题目大意] 操作 1 x y k 表示在点(x,y)上放置k个物品, 操作 2 x0 y0 x1 y1 k 表示查询矩形内放置物品第k多的格子有几个物品 同一个格子不会被同时放置物品一次以上 [题解] 内层用替罪羊式的KD树动态维护加点,和查询矩形内点数 外层用权值线段树维护KD树的权值编号 对于每个权值点,添加到权值线段树查询路径上的每一颗KD树上, 这样就保证了区间的二进…
题意:给你一棵树,n个点q次操作,操作1查询x子树深度为d的节点权值和,操作2查询子树x权值和 把每个点按(dfn,depth)的二维关系构造kd树,剩下的只需维护lazy标记即可 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #define rrep(i,j,k) for(register int i=j;i>=k;i--) #define erep(i,u) for(regis…
题目链接 kd树模板题,求二维空间上的最远点/最近点. 对所有点建立kd树,分别查询每个点即可.单次查询期望时间复杂度$O(logn)$ #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],mi[N][],rt,ans; ];} a[N]; ]<b.x[];} ]<b.x[];} ]-b.x[])+abs(a.x[]-b.x[]);} void pu(int u)…
今天(18.5.4)室友A突然问我算法怎么入门,兴奋之下给他安利了邓公的<数据结构>,然而他接着又问我能不能两周内快速入门,毕竟打算搞Machine Learning,然后掏出手机看了下他老师给的安排:python学习并实现K近邻算法/决策树/朴素XXX/支持向量机(???),两周内,四选一 原来是以为我学的算法是差不多这样的才来请教,我懂个π啊 不过说回来10个月前我还是摸了一把KD树,K近邻什么的我应该还记得,特写此文回忆一下并督促自己做题更新 //以下文本均无代码实现 //以后会更新补上…
几个月后的UPD: 学习完下面之后,实战中的总结: 0.比赛中正解就是kdtree的题目很少很少 1.几类优先考虑kdtree的题目: k(维度) >= 3 的题目 二维平面上涉及区间标记的题目 2. 二维平面上的题目, n >= 5W 谨慎使用kdtree      非强制在线考虑cdq套数据结构(不涉及标记的话基本考虑树状数组)      强制在线考虑树状数组套主席树(该方法需要提前确定空间够不够O(nlogn2)) 几种方法的常数比较:cdq套树 < 树套树 < kdtree…
很久之前我就想过怎么快速在二维平面上查找一个区域的信息,思考许久无果,只能想到几种优秀一点的暴力. Kd树就是干上面那件事的. 别的不多说,赶紧把自己的理解写下来,免得凉了. KD树的组成 以维护k维空间(x,y,……)内的KD树为例,主要由一下三部分组成: p[k],代表树上这个结点所储存的点(在题目中给出的/你自己加上的点集中的一个点). ch[2],表示它的子结点(没错,KD树是一棵二叉树) mi[k]与mx[k],mi/mx[i]代表KD树这个结点统辖的所有点的第i-1范围.比如说mi[…
题目大意:有$m$个操作,分两种:在指定三维坐标内加入一个点,询问指定空间内点的数量. 其中$m≤5*10^{4},1≤x,y,z≤10^9$ 这题几乎就是裸的$k-d$树啊.我们动态维护一棵$k-d$树,对于以某个节点为根的字树中,维护该子树中点的三维范围,以及该子树中点的数量.然后直接查询即可. PS:为了保证你的程序不会变成“优秀”的$n^{2}$做法,需要写一个类似虚树暴力重构的东西,去控制该树的平衡. #include<bits/stdc++.h> #define M 100000…
概念就不说了吧,网上教程满天飞 学了半天才知道,kd 树实质上只干了两件事情: 1.快速定位一个点 / 矩形 2.有理有据地优化暴力 第一点大概是可以来做二维平面上给点/矩形打标记的问题 第二点大概是平面最远点对? bzoj1941 Hide and Seek 求每个点除自己以外的最近点和最远点 sol: kd 树优化暴力,对于暴力,考虑这样一个剪枝:如果一个点在某一维上隔的太远,就不搜比它远的了 把这个东西放到 kd 树上就可以了 #include<bits/stdc++.h> #defin…
一般用来解决各种二维平面的点对统计,也许一般非正解? 没时间慢慢写了,打完这个赛季后补细节 建树板子: #include <cstdio> #include <locale> #include <vector> #include <cstring> #include <algorithm> using namespace std; inline void read(int &x) { x=; ; char ch=getchar(); wh…