BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)
这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= =
岛娘真是太厉害了,先丢链接:http://www.shuizilong.com/house/archives/bzoj-1095-zjoi2007hide-%E6%8D%89%E8%BF%B7%E8%97%8F/
这个括号序列貌似可以解决一些关于树上两点距离查询的问题(可以替代点分治?)好像很高端的样子找论文看看吧
CODE:(最近在搞github,相信不久就能够直接贴链接跑了~~~)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 301000
vector<int> e[maxn];
int list[maxn],id[maxn],cnt;
int dfs(int x,int fa) {
list[++cnt]=1;
list[id[x]=++cnt]=0;
for (int i=0;i<e[x].size();i++) {
if (e[x][i]==fa) continue;
dfs(e[x][i],x);
}
list[++cnt]=-1;
return 0;
}
#define maxint 0x7fffffff
#define inf (maxint>>2)
struct bo{
int a,b,ans,lp,lm,rp,rm;
void init(){a=b=0;ans=lp=lm=rp=rm=-inf;}
void set(bool flag) {
if (flag) {
ans=lp=lm=rp=rm=-inf;
}else {
ans=lp=lm=rp=rm=0;
}
}
};
bo update(bo l,bo r) {
bo ans;
ans.ans=max(l.ans,r.ans);
ans.ans=max(l.rp+r.lm,ans.ans);
ans.ans=max(r.lp+l.rm,ans.ans);
if (l.b>r.a) {ans.a=l.a;ans.b=r.b+l.b-r.a;}
else {ans.a=l.a+r.a-l.b;ans.b=r.b;}
ans.rp=max(max(r.rp,l.rp-r.a+r.b),l.rm+r.a+r.b);
ans.rm=max(r.rm,l.rm+r.a-r.b);
ans.lp=max(max(l.lp,r.lp+l.a-l.b),r.lm+l.a+l.b);
ans.lm=max(l.lm,r.lm+l.b-l.a);
return ans;
}
struct node{
int l,r;bo b;
}t[maxn*8];
#define lc (x<<1)
#define rc (lc^1)
#define mid ((l+r)>>1)
int build(int x,int l,int r) {
t[x].l=l,t[x].r=r;
if (l==r) {
t[x].b.init();
if (list[l]==1) t[x].b.b=1;
if (list[l]==-1) t[x].b.a=1;
if (list[l]==0) t[x].b.set(0);
return 0;
}
build(lc,l,mid);build(rc,mid+1,r);
t[x].b=update(t[lc].b,t[rc].b);
return 0;
}
int set(int x,int y,bool flag) {
int l=t[x].l,r=t[x].r;
if (l>y||r<y) return 0;
if (l==r) {
t[x].b.set(flag);
return 0;
}
set(lc,y,flag);set(rc,y,flag);
t[x].b=update(t[lc].b,t[rc].b);
}
bool b[maxn];
#define pb push_back
int main(){
int n;
// freopen("1.in","r",stdin);
scanf("%d",&n);
for (int i=1;i<n;i++) {
int x,y;
scanf("%d%d",&x,&y);
e[x].pb(y);e[y].pb(x);
}
dfs(1,0);
build(1,1,n*3);
int T,cnt=n;
scanf("%d",&T);
// for (int i=1;i<=n*3*4;i++) printf("%d %d %d %d %d\n",i,t[i].l,t[i].r,t[i].b.a,t[i].b.b);
while (T--) {
char opt[2];int x;
scanf("%s",opt);
switch (opt[0]) {
case 'G' :
if (cnt==0) printf("-1\n");
else if (cnt==1) printf("0\n");
else printf("%d\n",t[1].b.ans);
break;
case 'C' :
scanf("%d",&x);
set(1,id[x],(b[x]^=1));
cnt+=b[x]?-1:1;
break;
}
}
return 0;
}
BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)的更多相关文章
- bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...
- [BZOJ 1095] [ZJOI2007]Hide 捉迷藏——线段树+括号序列(强..)
神做法-%dalao,写的超详细 konjac的博客. 如果觉得上面链接的代码不够优秀好看,欢迎回来看本蒟蒻代码- CODE WITH ANNOTATION 代码中−6-6−6表示左括号'[',用−9 ...
- BZOJ 1095 捉迷藏(线段树维护括号序列)
对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数... 由此可以得出线段树的做法.. #include<cstdio> #include<iost ...
- bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...
- BZOJ1095: [ZJOI2007]Hide 捉迷藏【线段树维护括号序列】【思维好题】
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- 【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- BZOJ 1095: [ZJOI2007]Hide 捉迷藏
Description 一棵树,支持两个操作,修改一个点的颜色,问树上最远的两个白点距离. Sol 动态点分治. 动态点分治就是将每个重心连接起来,形成一个跟线段树类似的结构,当然它不是二叉的... ...
- 洛谷.4115.Qtree4/BZOJ.1095.[ZJOI2007]Hide捉迷藏(动态点分治 Heap)
题目链接 洛谷 SPOJ BZOJ1095(简化版) 将每次Solve的重心root连起来,会形成一个深度为logn的树,就叫它点分树吧.. 我们对每个root维护两个东西: 它管辖的子树中所有白点到 ...
- [bzoj1095][ZJOI2007]Hide 捉迷藏——线段树+括号序列
题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...
随机推荐
- 长平狐 Cocos2d-x 的“HelloWorld” 深入分析
Cocos2d-x 的“HelloWorld” 深入分析 本节所用Cocos2d-x版本:cocos2d-1.0.1-x-0.12.0 不能免俗,一 ...
- Unity3D ——强大的跨平台3D游戏开发工具(四)
第六章 Unity3D中的C#Script编程的注意事项 也许您在学习Unity3D之前,已经是一位C#的编程高手了.但在Unity3D中的C#并不像真正的C#那般强大,在Unity3D的C#中必须全 ...
- docker网络访问(三)
docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPor ...
- C++ 句柄类
一.容器与继承 在容器中保存有继承关系的对象时,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,则保存基类对象又成问题(基类对象将被强制转换成派生类对象,而派生类中定义的成员未被初 ...
- c++ split()实现
在c++中,没有java与python中定义的split()功能的函数,于是自己实现之. 情况1,适用范围,分隔符为字符.思路,记录分隔符的位置,判断需要截取的字符串的下标范围. vector< ...
- IOS 微信
原文:http://blog.csdn.net/ysy441088327/article/details/8441608 按照常例,列一些网址先: 微信开放平台首页: http://open.weix ...
- C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名
转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...
- Mac下启动MySQL出现错误“the /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' user”解决
错误如下: Warring the /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' user 这应该是某 ...
- js动态设置输入框字体/颜色
动态设置文本框颜色: 主要是利用javascript中的触发事件onfocus和onblur <script language="javascript" type=" ...
- MySQL生产库开发规范
MySQL开发规范 文件状态: [ ] 草稿 [√] 正式发布 [ ] 正在修改 文件标识: 当前版本: V1.0 作 者: 贺磊 完成日期: 2016-05-24 变更记录 序号 ...