这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了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 捉迷藏(线段树维护括号序列)的更多相关文章

  1. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  2. [BZOJ 1095] [ZJOI2007]Hide 捉迷藏——线段树+括号序列(强..)

    神做法-%dalao,写的超详细 konjac的博客. 如果觉得上面链接的代码不够优秀好看,欢迎回来看本蒟蒻代码- CODE WITH ANNOTATION 代码中−6-6−6表示左括号'[',用−9 ...

  3. BZOJ 1095 捉迷藏(线段树维护括号序列)

    对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数... 由此可以得出线段树的做法.. #include<cstdio> #include<iost ...

  4. bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...

  5. BZOJ1095: [ZJOI2007]Hide 捉迷藏【线段树维护括号序列】【思维好题】

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  6. 【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  7. BZOJ 1095: [ZJOI2007]Hide 捉迷藏

    Description 一棵树,支持两个操作,修改一个点的颜色,问树上最远的两个白点距离. Sol 动态点分治. 动态点分治就是将每个重心连接起来,形成一个跟线段树类似的结构,当然它不是二叉的... ...

  8. 洛谷.4115.Qtree4/BZOJ.1095.[ZJOI2007]Hide捉迷藏(动态点分治 Heap)

    题目链接 洛谷 SPOJ BZOJ1095(简化版) 将每次Solve的重心root连起来,会形成一个深度为logn的树,就叫它点分树吧.. 我们对每个root维护两个东西: 它管辖的子树中所有白点到 ...

  9. [bzoj1095][ZJOI2007]Hide 捉迷藏——线段树+括号序列

    题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...

随机推荐

  1. UILabel常用属性小结

    标签常用的属性: (1)frame属性:设置标签的位置与大小. frame = CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat heig ...

  2. mongodb 导入数据库文件

    吐槽一下:  这个导入现有数据文件弱爆了... 直接将要导入的数据文件放到mongodb下的db目录下就完事了...O(∩_∩)O哈哈~ 例如: 将shop_suning (shopdb_suning ...

  3. js jqery判断checkbox是否选中,全选,取消全选,反选,选择奇数偶数项

    // 一,判断选中 // js var ischecked2 = function(){ // this.checked == true $(document.getElementsByTagName ...

  4. OI队内测试二【数论概率期望】

    版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] T1: 题解:插头dp应该很好想吧,我们考虑当出现转折时我们对下 ...

  5. 理解javascript:void(0);和href="#"

    我们经常可以看见这样的代码: <a href="javascript:void(0);">链接</a> void的意思是空的,无效的意思,但是在js中是表示 ...

  6. highcharts设置Y轴范围及根据Y轴范围设置不同颜色

    yAxis : { title : { text : '数据' }, plotLines : [ { value : 0, width : 1, color : '#808080' } ], min: ...

  7. 【转】java调用存储过程和函数

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  8. 1.4.2.5. 测试(Core Data 应用程序实践指南)

    测试的方法也很简单: 首先,在AppDelegate.h里面引用CoreDataHelper @property (strong, nonatomic, readonly)CoreDateHelper ...

  9. css全局样式表

    http://blog.csdn.net/baok1592/article/details/6448378

  10. Flash对不同的浏览器的兼容性

    现在遇到两个Flash的兼容性问题: 1.找不到指定的摄像头(VCamera),可是该摄像头在QQ等IM工具中是可以正常使用的 2.能找到摄像头,不过他的预览是黑屏 针对第一个问题: a.采用IE内核 ...