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]捉迷藏 (线段树,括号序列)
大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...
随机推荐
- [原创]利用python构造ICMP Echo Request并发送
import socket import struct def checksum(source_string): sum = 0 countTo = (len(source_string)/2)*2 ...
- Git使用列表(四)
最近,由于自己的一个项目,导致自己的关于自己的要使用Git的很多的命令,突然发现自己的git的还有许多不知道的东西 不过,在这个工作的过程中,也发现自己的一些很大的缺陷,就是自己题目理解力有限,明明就 ...
- 北京Uber优步司机奖励政策(3月20日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 北京Uber优步司机奖励政策(1月18日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- VINS(七)estimator_node 数据对齐 imu预积分 vision
首先通过vins_estimator mode监听几个Topic(频率2000Hz),将imu数据,feature数据,raw_image数据(用于回环检测)通过各自的回调函数封装起来 ros::Su ...
- cakephp2.x 一个ajax例子.md
CakePHP中的ajax还是比较简单,但要注意一些细节. app/View/Layouts下新建ajaxtest.ctp <!DOCTYPE html PUBLIC "-//W3C/ ...
- centos配置ip地址 添加多个ip地址的方法
操作如下,登陆SSH: vi /etc/sysconfig/network-scripts/ifcfg-eth0: 第二个IP,就是 vi /etc/sysconfig/network-scripts ...
- 【廖雪峰老师python教程】——IO编程
同步IO 异步IO 最常见的IO——读写文件 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一 ...
- 180713-Spring之借助Redis设计访问计数器之扩展篇
之前写了一篇博文,简单的介绍了下如何利用Redis配合Spring搭建一个web的访问计数器,之前的内容比较初级,现在考虑对其进行扩展,新增访问者记录 记录当前站点的总访问人数(根据Ip或则设备号) ...
- (转)CGMA - Organic World Building in UE4: week 6
原文:丢失,这篇是艺术家博客上发现的,小道整理笔记中,临时放于效果案例目录. In this week we focused on creating the grass and flora t ...