【xsy1230】树
题意
\(N\)个点的树,边有边权。给\(M\)个询问,每个询问包含3个参数\(l,r,pos\),求标号在\(l\)到\(r\)中的所有点中,离节点pos最近的点到pos的距离。
分析:动态点分治+Treap
动态树分治。
把分治树给弄出来,用Treap以坐标为关键字,每个点存它在分治树的子树的所有节点到其距离。
这里不用再按照子树划分染色了,因为在同一个子树的点也不会影响结果。
其实用线段树就好了,只不过我傻了就用了Treap。
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define pb push_back
#define mp make_pair
#define X first
#define Y second
typedef pair<int,int> PII;
const int N=131072;
const int S=4194304;
const int MAX=INT_MAX;
const int SEC_MAX=INT_MAX>>1;
int n;
vector<PII> g[N];
int vis[N];
int num,siz[N],gvt,gs;
vector<int> atc[N];
int rt[N],tot;
struct Tree {
int lc,rc;
int key,fix;
int val,minVal;
Tree(int _key=0,int _val=SEC_MAX) {
lc=rc=0;
key=_key,fix=rand();
val=minVal=_val;
}
}tr[S];
struct D {
int lc,rc;
D(void) {
lc=rc=0;
}
};
int m;
void Pushup(int x) {
tr[x].minVal=min(tr[tr[x].lc].minVal,tr[tr[x].rc].minVal);
tr[x].minVal=min(tr[x].minVal,tr[x].val);
}
int Merge(int x1,int x2) {
if (!x1) return x2;
if (!x2) return x1;
if (tr[x1].fix<tr[x2].fix) {
tr[x1].rc=Merge(tr[x1].rc,x2);
Pushup(x1);
return x1;
}
else {
tr[x2].lc=Merge(x1,tr[x2].lc);
Pushup(x2);
return x2;
}
}
D Split_Key(int x,int key) {
D t; if (!x) return t;
if (key<tr[x].key) {
t=Split_Key(tr[x].lc,key);
tr[x].lc=t.rc; Pushup(x);
t.rc=x;
}
else {
t=Split_Key(tr[x].rc,key);
tr[x].rc=t.lc; Pushup(x);
t.lc=x;
}
return t;
}
void Insert(int &rt,int x) {
D t=Split_Key(rt,tr[x].key);
rt=Merge(t.lc,x); rt=Merge(rt,t.rc);
}
void Add_Point(int god,int key,int dst) {
tr[++tot]=Tree(key,dst);
Insert(rt[god],tot);
}
int Query(int rt,int l,int r) {
D t1=Split_Key(rt,l-1);
D t2=Split_Key(t1.rc,r);
int t=tr[t2.lc].minVal;
rt=Merge(t2.lc,t2.rc); rt=Merge(t1.lc,rt);
return t;
}
int Siz_DFS(int x,int fa) {
siz[x]=1;
rep(i,1,g[x].size()) {
int nx=g[x][i-1].X;
if (!vis[nx]&&nx!=fa) {
int t=Siz_DFS(nx,x);
siz[x]+=t;
}
}
return siz[x];
}
void Find_Root(int x,int fa) {
int t=num-siz[x];
rep(i,1,g[x].size()) {
int nx=g[x][i-1].X;
if (!vis[nx]&&nx!=fa) {
Find_Root(nx,x);
t=max(t,siz[nx]);
}
}
if (t<gs) {
gs=t;
gvt=x;
}
}
void Link(int god,int x,int fa) {
atc[x].pb(god);
rep(i,1,g[x].size()) {
int nx=g[x][i-1].X;
if (!vis[nx]&&nx!=fa)
Link(god,nx,x);
}
}
void Add(int god,int x,int fa,int dst) {
Add_Point(god,x,dst);
rep(i,1,g[x].size()) {
int nx=g[x][i-1].X,d=g[x][i-1].Y;
if (!vis[nx]&&nx!=fa)
Add(god,nx,x,dst+d);
}
}
void Build(int frm) {
num=Siz_DFS(frm,-1);
gvt=0,gs=MAX; Find_Root(frm,-1);
int x=gvt; vis[x]=1;
Link(x,x,-1);
Add(x,x,-1,0);
rep(i,1,g[x].size()) {
int nx=g[x][i-1].X;
if (!vis[nx])
Build(nx);
}
}
int Min_Dist(int x,int l,int r) {
int res=MAX;
rep(i,1,atc[x].size()) {
int nrt=atc[x][i-1];
int d1=Query(rt[nrt],l,r);
if (d1==SEC_MAX) continue;
int d2=Query(rt[nrt],x,x);
int t=d1+d2;
res=min(res,t);
}
return res;
}
int main(void) {
//...
n=rd();
rep(i,1,n-1) {
int x=rd(),y=rd(),d=rd();
g[x].pb(mp(y,d));
g[y].pb(mp(x,d));
}
Build(1);
int lst=0; m=rd();
rep(i,1,m) {
int l=rd(),r=rd(),pos=rd();
pos^=lst;
lst=Min_Dist(pos,l,r);
printf("%d\n",lst);
}
//...
}
【xsy1230】树的更多相关文章
- 【xsy1230】 树(tree) 点分治+线段树
题目大意:有一棵$n$个节点的树,点的标号为$1$到$n$.树中的边有边权.给你$m$个询问,每个询问包含三个参数$l,r,pos$,你要求出标号在$l$到$r$之间的所有点中,到节点$pos$距离最 ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- HDU1671——前缀树的一点感触
题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
随机推荐
- DOM9大节点
ELEMENT_NODE 1 元素节点 常用 ATTRIBUTE_NODE 2 属性节点 常用 TEXT_NODE 3 文本节点 常用 CDATA_SECTION_NODE 4 CDATA区段 E ...
- SQL练习题
create table Student( Sno varchar(20) primary key, Sname varchar(20) not null, Ssex varchar(20) not ...
- docker interact example
此为docker 第一篇,插下杂七杂八的东西,好找,就这么简单,,,, yum -y install docker-io //install cp /var/tmp/cap.data /var/lib ...
- react js 按条数 展开/折叠
//2条const MAX_SHOW_NUM = 2; class HotDiscuss extends Component { static propTypes = { //验证 repliedCo ...
- Zabbix通过percona监控MySQL
因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...
- 简单Hosts使用说明
1.查找hosts文件 首先,点击桌面的"我的电脑",或者是通过开始菜单进入到我的电脑. 之后,进入到"C:\Windows\System32\drivers\etc&q ...
- Ubuntu 16.04 802.1x 有线连接
Ubuntu下使用MentoHUST搞定 锐捷校园网认证网络 http://www.linuxidc.com/Linux/2013-10/91157.htm
- 更新数据前jquery如何填充数据到表单域中
$("#p_city option[value='${project.city}']").attr("selected","selected" ...
- Plextor 浦科特M7VC性能
浦科特一出TLC的SSD,立刻就受到了人们的关注,网上铺天盖地的评测.看了评测感觉不错,于是买了一块来用. 自己测试,似乎和网上的结果差异挺大的. 这是我自己测试的结果.(测试平台为:I7-5820K ...
- configure.ac:32: error: possibly undefined macro: AC_DEFINE
在ubuntu 下编译snappy时,在检查依赖关系时,处理autoconf的包时,在相关依赖包都已经安装的情况下,报如下错误,死活不过. configure.ac:32: error: possib ...