http://www.lydsy.com/JudgeOnline/problem.php?id=1095

查询最远点对,带修改

显然可以用动态点分治

对于每个点,维护两个堆

堆q1[x] 维护 点分树x的子树中,所有黑点到x的点分树中父节点的距离

堆q2[x]维护 点分树x的子节点的堆q1的堆顶,即若y是x在点分树中的子节点,则q2[x].push(q1[y].top())

再来维护一个全局的堆Q,维护所有q2的堆顶,即Q.push(q2[x].top())

#include<cmath>
#include<queue>
#include<cstdio>
#include<iostream> using namespace std; #define N 100001 #define Swap(a,b) ( (a)^=(b),(b)^=(a),(a)^=(b) ) int n; int front[N],to[N<<],nxt[N<<],tot; int fa[N]; bool light[N];
int sum; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
} namespace LCA
{
int fa[N][],dep[N],bin[],lim; void dfs(int x)
{
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x][])
{
dep[to[i]]=dep[x]+;
fa[to[i]][]=x;
dfs(to[i]);
}
} int query(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=lim;i>=;--i)
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
if(x==y) return x;
for(int i=lim;i>=;--i)
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][];
} int dist(int x,int y)
{
return dep[x]+dep[y]-(dep[query(x,y)]<<);
} void main()
{
lim=log(n)/log();
bin[]=;
for(int i=;i<;++i) bin[i]=bin[i-]<<;
dep[]=;
dfs();
for(int i=;i<=lim;++i)
for(int j=;j<=n;++j)
fa[j][i]=fa[fa[j][i-]][i-];
}
} struct HEAP
{
priority_queue<int>heap,trash; void Pop(int x) { trash.push(x); } void Push(int x) { heap.push(x); } int Size() { return heap.size()-trash.size(); } int Top()
{
if(Size())
{
while(!trash.empty() && heap.top()==trash.top()) heap.pop(),trash.pop();
return heap.top();
}
return ;
} int Top_Sec()
{
if(Size()>=)
{
int first,second;
while(!trash.empty() && heap.top()==trash.top()) heap.pop(),trash.pop();
first=heap.top(); heap.pop();
while(!trash.empty() && heap.top()==trash.top()) heap.pop(),trash.pop();
second=heap.top(); heap.push(first);
return first+second;
}
else return Top();
} }q1[N],q2[N],Q; namespace Point_divide
{
int siz[N],mx[N];
bool vis[N]; int root,min_size; void get_dist(int x,int pa,int fa)
{
q1[root].Push(LCA::dist(pa,x));
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa && !vis[to[i]]) get_dist(to[i],pa,x);
} void get_size(int x,int fa)
{
siz[x]=; mx[x]=;
for(int i=front[x];i;i=nxt[i])
if(!vis[to[i]] && to[i]!=fa)
{
get_size(to[i],x);
siz[x]+=siz[to[i]];
if(siz[to[i]]>mx[x]) mx[x]=siz[to[i]];
}
} void get_root(int x,int pa,int fa)
{
mx[x]=max(mx[x],siz[pa]-siz[x]);
if(mx[x]<min_size) min_size=mx[x],root=x;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa && !vis[to[i]]) get_root(to[i],pa,x);
} void work(int x,int pa)
{
min_size=n+;
get_size(x,);
get_root(x,x,);
fa[root]=pa;
vis[root]=true;
q2[root].Push();
q1[root].Push(LCA::dist(pa,root));
for(int i=front[root];i;i=nxt[i])
if(!vis[to[i]]) get_dist(to[i],pa,root);
q2[pa].Push(q1[root].Top());
int rt=root;
for(int i=front[root];i;i=nxt[i])
if(!vis[to[i]]) work(to[i],rt);
if(q2[rt].Size()>=) Q.Push(q2[rt].Top_Sec());
} void main()
{
work(,);
} } void turn_off(int x)
{
if(q2[x].Size()>=) Q.Pop(q2[x].Top_Sec());
q2[x].Push();
if(q2[x].Size()>=) Q.Push(q2[x].Top_Sec());
for(int u=x;fa[u];u=fa[u])
{
if(q2[fa[u]].Size()>=) Q.Pop(q2[fa[u]].Top_Sec());
if(q1[u].Size()) q2[fa[u]].Pop(q1[u].Top());
q1[u].Push(LCA::dist(fa[u],x));
q2[fa[u]].Push(q1[u].Top());
if(q2[fa[u]].Size()>=) Q.Push(q2[fa[u]].Top_Sec());
}
} void turn_on(int x)
{
if(q2[x].Size()>=) Q.Pop(q2[x].Top_Sec());
q2[x].Pop();
if(q2[x].Size()>=) Q.Push(q2[x].Top_Sec());
for(int u=x;fa[u];u=fa[u])
{
if(q2[fa[u]].Size()>=) Q.Pop(q2[fa[u]].Top_Sec());
q2[fa[u]].Pop(q1[u].Top());
q1[u].Pop(LCA::dist(x,fa[u]));
if(q1[u].Size()) q2[fa[u]].Push(q1[u].Top());
if(q2[fa[u]].Size()>=) Q.Push(q2[fa[u]].Top_Sec());
}
} int main()
{
//freopen("hide.in","r",stdin);
//freopen("hide.out","w",stdout);
read(n);
int u,v;
for(int i=;i<n;++i)
{
read(u); read(v);
add(u,v);
}
LCA::main();
Point_divide::main();
sum=n;
int m; char s[];
read(m);
// printf("%d\n",Q.Top());
while(m--)
{
scanf("%s",s);
if(s[]=='G')
{
if(sum>=) printf("%d\n",Q.Top());
else printf("%d\n",sum-);
}
else
{
read(u);
if(light[u])turn_off(u),sum++;
else turn_on(u),sum--;
light[u]^=;
//printf("%d\n",Q.Top());
}
}
return ;
}

bzoj千题计划245:bzoj1095: [ZJOI2007]Hide 捉迷藏的更多相关文章

  1. 动态点分治:Bzoj1095: [ZJOI2007]Hide 捉迷藏

    简介 这是我自己的一点理解,可能写的不好 点分治都学过吧.. 点分治每次找重心把树重新按重心的深度重建成了一棵新的树,称为分治树 这个树最多有log层... 动态点分治:记录下每个重心的上一层重心,这 ...

  2. [bzoj1095][ZJOI2007]Hide 捉迷藏 点分树,动态点分治

    [bzoj1095][ZJOI2007]Hide 捉迷藏 2015年4月20日7,8876 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiaji ...

  3. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  4. bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...

  5. bzoj千题计划163:bzoj1060: [ZJOI2007]时态同步

    http://www.lydsy.com/JudgeOnline/problem.php?id=1060 以激发器所在节点为根 终止节点一定是叶节点 记录点的子树内最深的终止节点 然后从根往下使用道具 ...

  6. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  7. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  8. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  9. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

随机推荐

  1. 软件测试必备-前端知识点之html基础

    前端必备知识点 第一部分:HTML基础 一. web前端标准 1. 结构标签----html 2. 样式标准,美化----css 3. 行为标准---js 二. 五大浏览器厂商 1. ie 2. 谷歌 ...

  2. SAPUI5 freestyle vs SAP Fiori Elements —— 两种开发SAP UI5 Apps的方式对比

    概述 目前SAPUI5 SDK 提供了两种方式来开发一个SAPUI5 App.一种方式是传统的SAPUI5开发方式,一种是利用SAP Fiori Elements通过模板快速构建应用的方式. 本文简单 ...

  3. 使用Angular CLI生成 Angular 5项目

    如果您正在使用angular, 但是没有好好利用angular cli的话, 那么可以看看本文. Angular CLI 官网: https://github.com/angular/angular- ...

  4. Java集合框架(一)

    原文  http://www.jianshu.com/p/e31fb2600e4f 集合类存放于java.util包中,集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就 ...

  5. 【Unity3D与23种设计模式】享元模式(Flyweight)

    GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...

  6. 为什么需要RPC,而不是简单的HTTP接口

    转载自:http://www.oschina.net/question/271044_2155059?sort=default&p=1#answers 目前有很多Java的RPC框架,有基于J ...

  7. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  8. Linux中安装字体

    Linux中安装字体 查看系统中的字体 fc-list 查看系统中的中文字体 fc-list :lang=zh将然后将字体文件拷贝到/usr/share/fonts/中 cp aa.ttl /usr/ ...

  9. Spring Security 源码解析(一)AbstractAuthenticationProcessingFilter

    # 前言 最近在做 Spring OAuth2 登录,并在登录之后保存 Cookies.具体而言就是 Spring OAuth2 和 Spring Security 集成.Google一下竟然没有发现 ...

  10. python装饰器使用

    看了不少python关于装饰器文章,觉得还挺实用,发贴来mark一下(以前做笔记总会长时间不看就忘记,放这里应该不会忘了吧 - -) 先来看一个简单的知识点: def a(): print(" ...