[CF414E]Mashmokh's Designed Problem
题意:给一棵树,有三个操作:①询问两点$(x,y)$之间的距离②把$x$和原来的父亲断开并连到它的$h$级祖先,作为新父亲最右的儿子③询问与根节点距离为$k$的点中最右的点是哪个点
用出栈入栈序$s_{1\cdots 2n}$来维护整棵树,入栈记$1$出栈记$-1$,那么一个节点$x$的深度就是$\sum\limits_{i=1}^{in_x}s_x$
每个平衡树节点记1.这个节点是出栈还是入栈2.子树和3.最大前缀和4.最小前缀和,那么我们就可以在平衡树上二分找到最右的深度为$d$的节点(注意如果找到的是出栈点应该返回父亲,因为有个$-1$)
对于操作①,把$(in_x,in_y)$提出来,那么这个区间内深度最小的节点就是$lca_{x,y}$
对于操作②,找到那个$h$级祖先,直接序列移动即可
对于操作③,直接找
为了使我的splay不残废就用splay写了一下
注意因为邻接表的性质,加边要倒着加
#include<stdio.h> int ch[200010][2],fa[200010],v[200010],s[200010],mx[200010],mn[200010],h[100010],nex[100010],to[100010],pa[100010],tmp[100010],p[200010],M,rt; void add(int a,int b){ M++; to[M]=b; nex[M]=h[a]; h[a]=M; } void dfs(int x){ M++; p[M]=(x<<1)-1; v[(x<<1)-1]=1; for(int i=h[x];i;i=nex[i]){ pa[to[i]]=x; dfs(to[i]); } M++; p[M]=x<<1; v[x<<1]=-1; } #define ls ch[x][0] #define rs ch[x][1] int max(int a,int b){return a>b?a:b;} int min(int a,int b){return a<b?a:b;} void pushup(int x){ s[x]=s[ls]+s[rs]+v[x]; mx[x]=max(mx[ls],s[ls]+v[x]+max(mx[rs],0)); mn[x]=min(mn[ls],s[ls]+v[x]+min(mn[rs],0)); } int build(int l,int r){ int mid=(l+r)>>1; int&x=p[mid]; if(l<mid){ ls=build(l,mid-1); fa[ls]=x; } if(mid<r){ rs=build(mid+1,r); fa[rs]=x; } pushup(x); return x; } void rot(int x){ int y,z,f,B; y=fa[x]; z=fa[y]; f=(ch[y][0]==x); B=ch[x][f]; fa[x]=z; fa[y]=x; if(B)fa[B]=y; ch[x][f]=y; ch[y][f^1]=B; if(ch[z][0]==y)ch[z][0]=x; if(ch[z][1]==y)ch[z][1]=x; pushup(y); pushup(x); } void splay(int x,int gl){ int y,z; while(fa[x]!=gl){ y=fa[x]; z=fa[y]; if(z!=gl)rot((ch[z][0]==y&&ch[y][0]==x)||(ch[z][1]==y&&ch[y][1]==x)?y:x); rot(x); } } int getdis(int x,int y){ x=(x<<1)-1; y=(y<<1)-1; int dx,dy,dl; splay(x,0); dx=s[ls]+v[x]; splay(y,0); dy=s[ch[y][0]]+v[y]; splay(x,0); splay(y,x); rt=x; dl=min(dx,dy); if(ls==y) dl=min(dl,s[ch[y][0]]+v[y]+mn[ch[y][1]]); else dl=min(dl,s[ls]+v[x]+mn[ch[y][0]]); return dx+dy-(dl<<1); } int find(int x,int d){ if(mx[rs]>=d-s[ls]-v[x]&&mn[rs]<=d-s[ls]-v[x])return find(rs,d-s[ls]-v[x]); if(s[ls]+v[x]==d)return(x&1)?(x+1)>>1:pa[x>>1]; return find(ls,d); } int pre(int x){ splay(x,0); for(x=ls;rs;x=rs); return x; } int nx(int x){ splay(x,0); for(x=rs;ls;x=ls); return x; } void change(int u,int h){ int x=(u<<1)-1,L,R,t; splay(x,0); pa[u]=find(ls,s[ls]+v[x]-h); L=pre(x); R=nx(u<<1); splay(L,0); splay(R,L); t=ch[R][0]; ch[R][0]=0; pushup(R); pushup(L); L=pre(pa[u]<<1); R=(pa[u]<<1); splay(L,0); splay(R,L); ch[R][0]=t; fa[t]=R; pushup(R); pushup(L); rt=L; } #define inf 1000000000 int main(){ mx[0]=-inf; mn[0]=inf; int n,m,i,x,y; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ scanf("%d",&y); for(x=1;x<=y;x++)scanf("%d",tmp+x); for(x=y;x>0;x--)add(i,tmp[x]); } M=0; dfs(1); rt=build(1,n<<1); while(m--){ scanf("%d%d",&i,&x); if(i!=3)scanf("%d",&y); if(i==1)printf("%d\n",getdis(x,y)); if(i==2)change(x,y); if(i==3)printf("%d\n",find(rt,x+1)); } }
[CF414E]Mashmokh's Designed Problem的更多相关文章
- @codeforces - 414E@ Mashmokh's Designed Problem
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵 n 个点的树,每个点的儿子是有序的. 现给定 m 次操 ...
- [JZOJ3691] 【CF414E】Mashmokh's Designed tree
题目 题目大意 给你一棵树,接下来对这棵树进行三种操作: 1.询问两点之间的距离. 2.让某个点变为它原来的第\(h\)个祖先的最后一个儿子. 3.求\(dfs\)序中最后一个深度为\(k\)的点. ...
- HDU1086You can Solve a Geometry Problem too(判断线段相交)
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- [转]Amazon DynamoDB – a Fast and Scalable NoSQL Database Service Designed for Internet Scale Applications
This article is from blog of Amazon CTO Werner Vogels. -------------------- Today is a very exciting ...
- hdu 1086 You can Solve a Geometry Problem too
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- you can Solve a Geometry Problem too(hdoj1086)
Problem Description Many geometry(几何)problems were designed in the ACM/ICPC. And now, I also prepare ...
- C#学习日志 day10 -------------- problem statement
Revision History Date Issue Description Author 15/May/2015 1.0 Finish most of the designed function. ...
- HDU 4716 A Computer Graphics Problem
A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- (hdu step 7.1.2)You can Solve a Geometry Problem too(乞讨n条线段,相交两者之间的段数)
称号: You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
随机推荐
- zigbee ---- endpoint理解
很多资料将其翻译为“端点”,我们不如也这么叫. 在windows上使用不同的软件进行通信,数据包到达不同的应用的方法就是通过寻找IP地址和端口号来确定某一个应用的,也就是我们所说的五元组(源IP,目的 ...
- cloudera manager 5.3完整卸载脚本
service cloudera-scm-agent stop service cloudera-scm-agent stop umount /var/run/cloudera-scm-agent/p ...
- Windows下查看某个端口被哪个服务占用
1.查看某个端口是否被占用 打开命令行,输入:netstat -ano | findstr "3306" 2.查看端口被哪个服务占用 tasklist | findstr “PID ...
- JAVASCRIPT和JSP计算闰年
0x01:JAVASCRIPT 实现 <h1 align="left">求闰年</h1> 开始年份: <input type="text&q ...
- js获取当前url地址参数中文乱码问题
网上看了一些关于此问题的文章,都说的不清不楚,有些更是乱七八糟,完全没法看,故此找了一篇能用的,借鉴作为笔记. //首先获取到当前页面的地址栏信息 var url = window.location. ...
- iOS 控制台打印unicode 转中文汉字 UTF8String
今天查看代码数据结构,就在控台直接打印了,soGa,我看到了什么!!!! 于是乎想到了不对劲,不对呀,之前打印都是 UTF8String的呀,怎么会这样,百思不得其姐,看了一下封装的网络类,SoGa, ...
- Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径
注意:1. 模板需放在 WEB-INF 目录下2. 指定模板路径时不需要添加扩展名, Spring将自动添加 .xls 到URL 属性中.3. 在指定URL前需先设置 view 的 Applicat ...
- MyBatis的SQL语句映射文件详解
SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用 < ...
- DecimalFormat中格式化问题
一:前言 每天自己斗会看到新的东西,每天自己都会学到东西,但是觉得自己老是想一口吃一个胖子.每天看到一个知识点都把其收藏了,但是自己也没有时间去看,不知道自己到底想感谢什么.真是自己无语,本来说是把自 ...
- JVM内存模型 二
在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...