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]捉迷藏 (线段树,括号序列)
大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...
随机推荐
- tomcat8.5配置高并发
最近部署的tomcat应用,有一天压测的时候,测试一致反馈下载不了,结果查看日志才发现如下错误: INFO: Maximum number of threads (200) created for c ...
- 20145202mc《计算机病毒》实践2
网站检测 http://www.virustotal.com太慢了实在,所以我换成了http://www.virscan.org/ lab01-01.exe 文件行为 lab01-01.dll 可以基 ...
- mongoengine中collection名称自动生成机制浅探
项目碰到要使用mongodb的场景,以前只听过这一强大的文档数据库,但一直没有真正使用过,参考一下项目中已有的使用代码,是通过import mongoengine这一模块实现python服务对db中c ...
- 北京Uber优步司机奖励政策(11月9日~11月15日)
用户组:人民优步“关羽组”(适用于11月9日-11月15日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月 ...
- 3680: 吊打XXX
3680: 吊打XXX 链接 思路: 模拟退火. 代码: 跑的特别慢... #include<cstdio> #include<algorithm> #include<c ...
- ORB-SLAM(六)MapPoint与Map
地图点可以通过关键帧来构造,也可以通过普通帧构造,但是最终,必须是和关键帧对应的,通过普通帧构造的地图点只是临时被Tracking用来追踪用的. 构造函数(地图点3D坐标及其参考帧): // 参考帧是 ...
- python之web架构
一.web架构简介 web.py是一个轻量级Python web框架,它简单而且功能强大.web.py是一个开源项目.该框架由已故美国作家.Reddit联合创始人.RSS规格合作创造者.著名计算机黑客 ...
- python之saltstack二次开发
一.salt的概念 salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行).一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选 ...
- spring源码-bean之增强初始化-3
一.ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持.资源访问(如URL和文件).事件传播 ...
- redis 学习笔记二
redis启动: 直接 redis-server.exe 启动服务,是按照redis默认配置启动的,如果想按照自己的配置文件启动,要加上 redis-server.exe redis.windows ...