bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏
http://www.lydsy.com/JudgeOnline/problem.php?id=1095
点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGold/p/8463436.html
线段树维护括号序列
对树进行dfs,入栈时加一个左括号,出栈时加一个右括号,那么书上两点间的距离=括号序列两点间不匹配括号数
例:
树1--2--3,2为根
括号序列为 (2(3)(1))
2和1的距离 为 ()( = 1, 3和1的距离为 )( =2
具体怎么维护不想写了,去看曹钦翔的冬令营讲稿《数据结构的提炼与压缩》(p29、30)吧
#include<cstdio>
#include<iostream> #define N 100001 using namespace std; int front[N],nxt[N<<],to[N<<],tot; int id[N];
int num[N*]; bool light[N]; #define max(a,b) ((a)>(b) ? (a) : (b)) struct node
{
int a,b,dis;
int right_plus,right_minus,left_plus,left_minus; void get_val(int x)
{
a=b=;
right_plus=right_minus=left_plus=left_minus=dis=-1e7;
if(num[x]==-) b=;
else if(num[x]==-) a=;
else if(!light[num[x]]) right_plus=right_minus=left_plus=left_minus=dis=;
} node operator + (node p)
{
node k;
k.a=max(a,a+p.a-b);
k.b=max(p.b,p.b+b-p.a);
k.dis=max(max(dis,p.dis),max(right_plus+p.left_minus,right_minus+p.left_plus));
int A=a,B=b,C=p.a,D=p.b;
k.right_plus=max(p.right_plus,max(right_plus+D-C,right_minus+D+C));
k.right_minus=max(p.right_minus,right_minus+C-D);
k.left_plus=max(left_plus,max(A+B+p.left_minus,A-B+p.left_plus));
k.left_minus=max(left_minus,B-A+p.left_minus);
return k;
} }tr[N*<<]; 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;
} void dfs(int x,int fa)
{
num[++tot]=-;
id[num[++tot]=x]=tot;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa) dfs(to[i],x);
num[++tot]=-;
} void build(int k,int l,int r)
{
if(l==r)
{
tr[k].get_val(l);
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
tr[k]=tr[k<<]+tr[k<<|];
} void change(int k,int l,int r,int pos)
{
if(l==r)
{
tr[k].get_val(l);
return;
}
int mid=l+r>>;
if(pos<=mid) change(k<<,l,mid,pos);
else change(k<<|,mid+,r,pos);
tr[k]=tr[k<<]+tr[k<<|];
} int main()
{
int n,u,v;
read(n);
for(int i=;i<n;++i)
{
read(u); read(v);
add(u,v);
}
tot=;
dfs(,);
build(,,tot);
int m; char s[];
read(m);
int cnt=n;
while(m--)
{
scanf("%s",s);
if(s[]=='G')
{
if(cnt<=) printf("%d\n",cnt-);
else printf("%d\n",tr[].dis);
}
else
{
read(u);
if(light[u]) cnt++;
else cnt--;
light[u]^=;
change(,,tot,id[u]);
}
}
return ;
}
bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏的更多相关文章
- 动态点分治:Bzoj1095: [ZJOI2007]Hide 捉迷藏
简介 这是我自己的一点理解,可能写的不好 点分治都学过吧.. 点分治每次找重心把树重新按重心的深度重建成了一棵新的树,称为分治树 这个树最多有log层... 动态点分治:记录下每个重心的上一层重心,这 ...
- [bzoj1095][ZJOI2007]Hide 捉迷藏 点分树,动态点分治
[bzoj1095][ZJOI2007]Hide 捉迷藏 2015年4月20日7,8876 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiaji ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划245:bzoj1095: [ZJOI2007]Hide 捉迷藏
http://www.lydsy.com/JudgeOnline/problem.php?id=1095 查询最远点对,带修改 显然可以用动态点分治 对于每个点,维护两个堆 堆q1[x] 维护 点分树 ...
- bzoj千题计划163:bzoj1060: [ZJOI2007]时态同步
http://www.lydsy.com/JudgeOnline/problem.php?id=1060 以激发器所在节点为根 终止节点一定是叶节点 记录点的子树内最深的终止节点 然后从根往下使用道具 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
随机推荐
- iOS开发--XMPPFramework--好友模块(四)
创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~ 前面几篇,我们讨论了环境的配置,框架的导入和用户登陆,这一篇我们来说说好友模块. 在进入正题之前,我们来说下 ...
- Hello English Again
Currently, I just want to write something in English.Maybe I just want to review my Egnlish knowledg ...
- 登录界面输入判断为空的bug
这个bug我改了两天啊两天,直到大神帮我debug了一下... 这是之前出错的部分.. <script type="text/javascript" language=&qu ...
- C++学习-8
1.注意:函数指针前面*,&都是一样的没啥实际意义,除了把实例化函数块的时候,需要指针或者引用修饰 cout << typeid(my1.show).name() <& ...
- 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)
构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...
- C语言引用另一个源文件中定义的数组
C语言中是可以引用另外一个源文件的全局数组的,但是不能引用局部数组. 引用方式举例如下: 设a.c文件有有数据定义 int array1[10]; 现有b.c文件中想访问a.c中的array1数组 ...
- 面向对象设计模式_命令模式(Command)解读
在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...
- iOS刚进入后台接受推送、打开推送调转到相应的界面
刚进入后台的时候消息处理时候我用了本地推送!可以看我前边写的博客,怎么处理刚进入后台接收推送的案例,链接 /** 注释:打开推送的三种方式:-peter 1.apns的时候,结束进程退出后台:启动的时 ...
- 设计模式——桥接模式(C++实现)
[root@ ~/learn_code/design_pattern/18_bridge]$ cat Abstraction.h #ifndef _ABSTRACTION_H_ #define _AB ...
- Silverlight的认识
Microsoft Silverlight是一个跨浏览器的.跨平台的插件.Silverlight提供灵活的编程模型,并可以很方便地集成到现有的网络应用程序中.Silverlight可以对运行在Mac或 ...