题目链接:

  TP

题解:

  样例好良心,调样例3h一A……

  细节好多……诸如没完没了的pop和push……搞得头都大了。

  同情zzh……调了整一天了。

  动态点分治裸题……果然每个“裸题”打起来都跟shi一样。

题目:

  

 #define Troy
#define inf 0x7fffffff #include <bits/stdc++.h> using namespace std; inline int read(){
int s=,k=;char ch=getchar();
while(ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while(ch>&ch<='') s=s*+(ch^),ch=getchar();
return k*s;
} const int N=1e5+; struct edges{
int v;edges *last;
}edge[N<<],*head[N];int cnt; inline void push(int u,int v){
edge[++cnt]=(edges){v,head[u]};head[u]=edge+cnt;
} int n,m,f[N][],deep[N],bit[]; inline void dfs(int x){
for(int i=;bit[i]<=deep[x];++i)
f[x][i]=f[f[x][i-]][i-];
for(edges *i=head[x];i;i=i->last) if(i->v!=f[x][]){
deep[i->v]=deep[x]+;
f[i->v][]=x;
dfs(i->v);
}
} inline int lca(int x,int y){
int ret=deep[x]+deep[y];
if(deep[x]<deep[y]) swap(x,y);
int t=deep[x]-deep[y];
for(int i=;t;++i)
if(bit[i]&t) t^=bit[i],x=f[x][i];
if(x!=y){
for(int i=;~i;--i)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
x=f[x][];
}
return ret-(deep[x]<<);
} priority_queue<int,vector<int>,less<int> > q[N][],e[N][],ans,anse;
int size[N],heavy[N],top,tot,root,lastans[N],lasttop[N],fat[N];
bool vis[N]; inline void dfs(int x,int fa){
size[x]=;
heavy[x]=;
for(edges *i=head[x];i;i=i->last) if(!vis[i->v]&&i->v!=fa){
dfs(i->v,x);
size[x]+=size[i->v];
heavy[x]=max(heavy[x],size[i->v]);
}heavy[x]=max(heavy[x],tot-size[x]);
if(heavy[x]<top) top=heavy[x],root=x;
} inline void build(int x,int fa,int grand){
q[grand][].push(lca(x,fat[grand]));
size[x]=;
for(edges *i=head[x];i;i=i->last) if(!vis[i->v]&&i->v!=fa)
build(i->v,x,grand),size[x]+=size[i->v];
} inline void build(int x,int fa){
top=inf;
dfs(x,x);
vis[x=root]=true;
dfs(x,x);
fat[x]=fa;
build(x,x,x);
for(edges *i=head[x];i;i=i->last)if(vis[i->v]^){
tot=size[i->v];
build(i->v,x);
if(q[root][].empty()^)
q[x][].push(lasttop[root]=q[root][].top());
}
if(!q[x][].empty()){
int a1=q[x][].top();
q[x][].pop();
ans.push(lastans[x]=a1+(q[x][].empty()?:q[x][].top()));
q[x][].push(a1);
}
root=x;
} inline void putans(){
while(!ans.empty()&&!anse.empty()){
if(ans.top()==anse.top())
ans.pop(),anse.pop();
else break;
}
if(tot<=){
printf("%d\n",tot-);
}else
printf("%d\n",ans.top());
} inline void clear(int x,bool k){
while(!q[x][k].empty()&&!e[x][k].empty()&&q[x][k].top()==e[x][k].top())
q[x][k].pop(),e[x][k].pop();
} inline void erase(int x,int s,int er){
int now=-;
if(fat[x]){
if(vis[er])
e[x][].push(lca(er,fat[x]));
else
q[x][].push(lca(er,fat[x]));
clear(x,);
erase(fat[x],x,er);
}
if(s) {
if(q[s][].empty()^)
now=q[s][].top();
if(lasttop[s]!=now){
if(lasttop[s]!=-)
e[x][].push(lasttop[s]);
if(now!=-)
q[x][].push(now);
}else return;
lasttop[s]=now;
}
clear(x,);
now=-;
if(q[x][].empty()^){
int a1=q[x][].top();
q[x][].pop();
clear(x,);
if(q[x][].empty()^)
now=a1+q[x][].top();
else if(!vis[x]) now=a1;
q[x][].push(a1);
}
if(lastans[x]!=now){
if(lastans[x]!=-)
anse.push(lastans[x]);
if(now!=-)
ans.push(now);
}lastans[x]=now;
} inline void update(int x){
vis[x]^=;
if(vis[x]) --tot;
else ++tot;
erase(x,,x);
} int main(){
n=read();
register int i;
for(i=;i^n;++i){
int a=read(),b=read();
push(a,b),push(b,a);
}
for(i=;i^;++i) bit[i]=<<i;
memset(lastans,-,sizeof(lastans));
memset(lasttop,-,sizeof(lasttop));
dfs();tot=n;
build(,);
memset(vis,,sizeof(vis));
tot=n;
m=read();
while(m--){
char opt[];
scanf("%s",opt);
if(opt[]=='G') putans();
else update(read());
}
}

【bzoj 1095】[ZJOI2007]Hide 捉迷藏的更多相关文章

  1. 【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  2. BZOJ 1095: [ZJOI2007]Hide 捉迷藏

    Description 一棵树,支持两个操作,修改一个点的颜色,问树上最远的两个白点距离. Sol 动态点分治. 动态点分治就是将每个重心连接起来,形成一个跟线段树类似的结构,当然它不是二叉的... ...

  3. bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...

  4. 洛谷.4115.Qtree4/BZOJ.1095.[ZJOI2007]Hide捉迷藏(动态点分治 Heap)

    题目链接 洛谷 SPOJ BZOJ1095(简化版) 将每次Solve的重心root连起来,会形成一个深度为logn的树,就叫它点分树吧.. 我们对每个root维护两个东西: 它管辖的子树中所有白点到 ...

  5. 洛谷 P2056 [ZJOI2007]捉迷藏 || bzoj 1095: [ZJOI2007]Hide 捉迷藏 || 洛谷 P4115 Qtree4 || SP2666 QTREE4 - Query on a tree IV

    意识到一点:在进行点分治时,每一个点都会作为某一级重心出现,且任意一点只作为重心恰好一次.因此原树上任意一个节点都会出现在点分树上,且是恰好一次 https://www.cnblogs.com/zzq ...

  6. BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)

    这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilo ...

  7. BZOJ 1095 [ZJOI2007]Hide 捉迷藏 ——动态点分治

    [题目分析] 这题好基啊. 先把分治树搞出来.然后每个节点两个堆. 第一个堆保存这个块里的所有点(即分治树中的所有儿子)到分治树上的父亲的距离. 第二个堆保存分治树子树中所有儿子第一个堆的最大值. 建 ...

  8. [BZOJ 1095] [ZJOI2007]Hide 捉迷藏——线段树+括号序列(强..)

    神做法-%dalao,写的超详细 konjac的博客. 如果觉得上面链接的代码不够优秀好看,欢迎回来看本蒟蒻代码- CODE WITH ANNOTATION 代码中−6-6−6表示左括号'[',用−9 ...

  9. BZOJ 1095: [ZJOI2007]Hide 捉迷藏 动态点分治+堆

    写了7k多,可以说是一己之力切掉了这道毒瘤题~ 开 $3$ 种堆,分别维护每个子树最大深度,以及每个节点在点分树中对父亲的贡献,和全局的最优解. 由于需要支持堆的删除,所以写起来特别恶心+麻烦. 细节 ...

  10. BZOJ 1095: [ZJOI2007]Hide 捉迷藏(动态点分治)

    传送门 解题思路 点分树其实就是在点分治的基础上,把重心连起来.这样树高是\(log\)的,可以套用数据结构进行操作.这道题是求最远距离,所以每个点维护两个堆,分别表示所管辖的子树的最远距离和到父节点 ...

随机推荐

  1. springMVC导出word模板

    controller 调用 @RequestMapping(value = "/exportWord") public void exportWord(HttpServletRes ...

  2. solr研磨之游标分页

    普通分页 当需要深度分页的时候,比如查询第10000页数据,每页显示10条,意味着需要提取前10000 x 10 页的数据,并将这100000条数据缓存在内存中,然后在内存中进行排序.最后返回最后10 ...

  3. Javascript、CSS、HTML面试题

    1 JS中的三种弹出式消息提醒(警告窗口.确认窗口.信息输入窗口)的命令是什么? alert     confirm     prompt 2声明一个已经存在一个CSS有几种方式? 1.导入一个已经存 ...

  4. Python中的函数与变量

    本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...

  5. Spring温故而知新 - bean的装配

    Spring装配机制 Spring提供了三种主要的装配机制: 1:通过XML进行显示配置 2:通过Java代码显示配置 3:自动化装配 自动化装配 Spring中IOC容器分两个步骤来完成自动化装配: ...

  6. Floyd 算法求多源最短路径

    Floyd算法: Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图也可以是有向图,边权可以为负,但是不能存在负环(可根据最小环的正负来判定). 基本算法: Floyd算法基 ...

  7. linux下安装xhprof

    https://jingyan.baidu.com/article/a24b33cd7ee1d519ff002b6d.html

  8. Myeclipse+selenium2.0+Junit+TestNg环境搭建

    这周末把自动化的环境搭好了,在网上也百度了很多,现在分享下,希望大家少走一点歪路. 需要用到的安装包都在这个里面,自取: 链接:https://pan.baidu.com/s/10ohf757ztgN ...

  9. Python_二叉树

    BinaryTree.py '''二叉树:是每个节点最多有两个子树(分别称为左子树和右子树)的树结构,二叉树的第i层最多有2**(i-1)个节点,常用于排序或查找''' class BinaryTre ...

  10. 第七章之S5PV210移植到Nandflash

    1,之前的操作都是基于SD卡进行运行的,如今在Nandfalsh中运行u-boot.因为s5p_goni.h配置文件没有配置Nand相关文件,所以先配置Nand文件. 在include/configs ...