对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数。。。

由此可以得出线段树的做法。。

#include<cstdio>
#include<iostream>
#define maxn 100000
#define inf (1<<25)
using namespace std;
int vis[maxn+];
struct node{
int l1,l2,r1,r2,c1,c2,dis;
void val(int x){
c1=c2=;
l1=l2=r1=r2=dis=-inf;
if(x==-)c2=;
else if(x==-)c1=;
else if(vis[x]==)l1=l2=r1=r2=;
}
void merge(node &a,node &b){
c1=a.c1+max(,b.c1-a.c2);
c2=b.c2+max(,a.c2-b.c1);
dis=max(max(a.dis,b.dis),max(a.r1+b.l2,a.r2+b.l1));
l1=max(a.l1,max(b.l1-a.c2+a.c1,b.l2+a.c2+a.c1));
l2=max(a.l2,b.l2+a.c2-a.c1);
r1=max(b.r1,max(a.r1-b.c1+b.c2,a.r2+b.c1+b.c2));
r2=max(b.r2,a.r2+b.c1-b.c2);
}
}s[maxn*<<];
int num[maxn*+],tot;
void update(int o,int l,int r,int p){
if(l==r)s[o].val(num[p]);
else{
int m=l+r>>;
if(p<=m)update(o<<,l,m,p);
else update(o<<|,m+,r,p);
s[o].merge(s[o<<],s[o<<|]);
}
}
void build(int o,int l,int r){
if(l==r)s[o].val(num[l]);
else{
int m=l+r>>;
build(o<<,l,m);
build(o<<|,m+,r);
s[o].merge(s[o<<],s[o<<|]);
}
}
struct EDGE{
int u,v,next;
}edge[*maxn+];
int head[maxn+],pp;
void adde(int u,int v){
edge[++pp]=(EDGE){u,v,head[u]};
head[u]=pp;
}
int pos[maxn+];
void dfs(int u,int fa){
num[++tot]=-;
pos[num[++tot]=u]=tot;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v!=fa)dfs(v,u);
}
num[++tot]=-;
}
int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)vis[i]=;
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
adde(u,v);
adde(v,u);
}
dfs(,);
build(,,tot);
int q,cnt=n;
scanf("%d",&q);
char e[];
while(q--){
scanf("%s",e);
if(e[]=='G'){
if(cnt==)puts("-1");
else if(cnt==)puts("");
else printf("%d\n",s[].dis);
}else{
int u;
scanf("%d",&u);
cnt+=vis[u]=-vis[u];
update(,,tot,pos[u]);
}
}
return ;
}

BZOJ 1095 捉迷藏(线段树维护括号序列)的更多相关文章

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

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

  2. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  3. BZOJ1095: [ZJOI2007]Hide 捉迷藏【线段树维护括号序列】【思维好题】

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

  4. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

  5. CodeForces-380C:Sereja and Brackets(线段树与括号序列)

    Sereja has a bracket sequence s1, s2, ..., sn, or, in other words, a string s of length n, consistin ...

  6. Codeforces Round #603 (Div. 2) E - Editor(线段树,括号序列)

  7. Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)

    Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...

  8. CodeForces 343D 线段树维护dfs序

    给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...

  9. [ZJOI2007]捉迷藏 (线段树,括号序列)

    大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...

随机推荐

  1. Java设计模式(23)——行为模式之访问者模式(Visitor)

    一.概述 概念 作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 引入 试想这样一个场景,在一个Collection中放入了一大堆的各种对象的引用 ...

  2. BZOJ1432_Function_KEY

    题目传送门 找规律. 画一个像这样的图: 不同颜色为不同层,因为函数图像可对称,所以只考虑K<=N/2的情况. 最小为min(K,N-K+1)*2. N=1时特殊考虑,答案为1. code: # ...

  3. php 用continue加数字实现foreach 嵌套循环中止

    foreach($array as $key => $value) { if($value == 5)break; } // 这是一种. // 如果是嵌套的循环,用continue加数字也可以实 ...

  4. 如何在Mac OS系统下搭建Java开发环境 配置Java环境变量

    1. 打开终端   在finder里面搜索(这台MAC)查找终端   2. 在cdlouiedeAir:~ cdlouie$(cdlouie是我的电脑用户名) 后面输入sudo vim /etc/pr ...

  5. 【廖雪峰老师python教程】——IO编程

    同步IO 异步IO 最常见的IO——读写文件 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一 ...

  6. hdu2098分拆素数和(素数+暴力)

    分拆素数和 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. Python学习-猜数字游戏

    菩萨蛮·黄鹤楼 茫茫九派流中国,沉沉一线穿南北.烟雨莽苍苍,龟蛇锁大江. 黄鹤知何去,剩有游人处.把酒酹滔滔,心潮逐浪高! --coding:UTF-8-- import random secret ...

  8. Python简要标准库(2)

    集合 堆 和 双端队列 1.集合 创建集合 s = set(range(10)) 和字典一样,集合元素的顺序是随意的,因此不能以元素的顺序作为依据编程 集合支持的运算 a = set([1,2,3]) ...

  9. 【MFC】VS2017新建完MFC后,没有界面,只有代码

    问题描述:双击.rc文件后提示在另一个编辑器中打开 解决方法整合: 1----- 打开工程之前先把.rc文件改个名称,然后打开工程双击解决方案管理器的.rc文件, 会显示"载入失败" ...

  10. leetcode个人题解——#17 Letter Combinations of a Phone Number

    思路:用深搜遍历九宫格字符串,一开始做的时候发生了引用指向空地址的问题,后来发现是vector不能直接=赋值. class Solution { public: int len; ]={"a ...