BZOJ 1095 捉迷藏(线段树维护括号序列)
对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数。。。
由此可以得出线段树的做法。。
#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 捉迷藏(线段树维护括号序列)的更多相关文章
- BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)
这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilo ...
- bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...
- BZOJ1095: [ZJOI2007]Hide 捉迷藏【线段树维护括号序列】【思维好题】
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...
- CodeForces-380C:Sereja and Brackets(线段树与括号序列)
Sereja has a bracket sequence s1, s2, ..., sn, or, in other words, a string s of length n, consistin ...
- Codeforces Round #603 (Div. 2) E - Editor(线段树,括号序列)
- Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)
Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...
- CodeForces 343D 线段树维护dfs序
给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...
- [ZJOI2007]捉迷藏 (线段树,括号序列)
大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...
随机推荐
- sas的使用
1.建表 /*************************************/ /* create the second input data set */ /*************** ...
- 20145234黄斐《信息安全系统设计基础》第八周(Linux下vim相关命令)
Linux下vim相关命令 在编辑程序时经常使用vim,所以记住一些常用的指令还是很有必要的 文件命令 vim file 打开单个文件vim file vim file1 file2 file3 .. ...
- 【BZOJ5290】[HNOI2018]道路(动态规划)
[BZOJ5290][HNOI2018]道路(动态规划) 题面 BZOJ 洛谷 题目直接到洛谷上看吧 题解 开始写写今年省选的题目 考场上我写了一个模拟退火骗了\(90\)分...然而重测后只剩下45 ...
- 杭州优步uber司机第二组奖励政策
-8月9日更新- 优步杭州第二组: 定义为激活时间在2015/6/8之后2015/8/3之前的车主(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com ...
- div仿textarea可输入
原本要用textarea,但是后来发现好像只有IE支持textarea里边使用html标签,由于需要在textarea中显示一条横线(<hr />),在网上查了很久,都说textarea是 ...
- 手机蓝牙APP扫描设备的时候异常断开(未完成)
1.手机蓝牙APP打开立马就出现异常,测试在公司有这个问题,在宿舍没这个问题,怀疑是公司设备太多,导致扫描空间不够,或者扫描到奇怪的设备.数组越界之类,明天用log看一下 2. 看样子出了一个erro ...
- Filter配置多个url-pattern
java开发中会用的Filter过滤器,有时候开发需要,在一个Filter中需要配置多个过滤地址,即<url-pattern>,下面就说一下一个Filter过滤器中多个<url-pa ...
- 两分钟了解Docker的优势
本文来自网易云社区 我们主要从Docker对业务架构和生产实践的角度来分析. 随着业务规模的逐渐扩大,产品复杂度也随着增加,企业需要解决快速迭代.高可靠和高可用等问题,一个自然的选择是服务化的拆分,把 ...
- vcf-tools 笔记
vcf-query: 通过 vcf-query 提取DP (reads depth). ~/zengs/Tools/vcftools/perl/vcf-query -f '%CHROM\t%POS\t ...
- hdu2544最短路(floyd基础)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...