题目链接:

  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. ionic3-ng4学习见闻--(轮播图完美方案)

    ionic上 轮播图是最坑的插件了吧,各种bug和 问题. 事件也不好用.. 于是,我终于搞出来了一个完美的方案, 适用于,动态获取轮播图数据,自动循环播放,跳转其他页面回来后自动播放,手指触摸后自动 ...

  2. Math类的方法应用

    class Mortgage { public static void main(String[]args) { double P=Double.parseDouble(args[0]); doubl ...

  3. 【转载】tomcat+nginx+redis实现均衡负载、session共享(二)

    今天我们接着说上次还没完成session共享的部分,还没看过上一篇的朋友可以先看下上次内容,http://www.cnblogs.com/zhrxidian/p/5432886.html. 1.red ...

  4. 使用Navicat for MySQL把本地数据库上传到服务器

    服务器系统基本都是基于linux的,这个数据库上传的方式适用于linux的各种版本,比如Ubuntu和Centos(尽管这两个版本各种大坑小坑,但至少在数据库传输上保持了一致性) 当然本地数据库上传到 ...

  5. 全文检索-Lucene.net

    Lucene.net是Lucene的.net移植版本,在较早之前是比较受欢迎的一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎. ...

  6. java float double精度为什么会丢失?浅谈java的浮点数精度问题 【转】

    由于对float或double 的使用不当,可能会出现精度丢失的问题.问题大概情况可以通过如下代码理解: public class FloatDoubleTest { public static vo ...

  7. 分析DuxCms之AdminUserModel

    /** * 获取信息 * @param array $where 条件 * @return array 信息 */ public function getWhereInfo($where) { ret ...

  8. CSS学习笔记三:自定义单选框,复选框,开关

    一点一点学习CCS,这次学习了如何自定义单选框,复选框以及开关. 一.单选框 1.先写好body里面的样式,先写几个框 <body> <div class="radio-1 ...

  9. Python_doc文件写入SQLite数据库

    #docx文档题库包含很多段,每段一个题目,格式为:问题.(答案) #数据库datase.db中tiku表包含kechengmingcheng.zhanngji.timu.daan四个字段 impor ...

  10. 深入理解.net - 4.你必须知道的String

    为什么要单独写string,主要是它太常用了,同时又太特殊了,特殊到CLR对它的处理都和其它对象不一样.简直可以称为VIP用户啊.本文并不是一篇介绍如何使用string的文章,而是旨在阐述string ...