这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了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. 【NOIP2015】反思+题解

    D1T1> 神奇的幻方 模拟即可. #include <cstdio> #include <cstring> #include <algorithm> #de ...

  2. iOS 调试 之 打印

    参考:http://m.blog.csdn.net/blog/HookyStudent/42964317 参考:http://m.blog.csdn.net/blog/laencho/25190639 ...

  3. iOS 之 ARC 的内存泄露

    循环引用导致内存泄露,如block容易内存泄露

  4. 国民身份证号码校验之“C#/Winform方法实现+案例分析”

    根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出 ...

  5. 位运算,算术、逻辑运算详解-java篇

    /** * 功能: * 位运算符,原码.反码.补码规则: * 1.二进制的最高位是符号位:0表示正数,1表示负数 * 2.正数的原码.反码.补码都一样 * 3.负数的反码=它的原码符号位不变,其他位取 ...

  6. Delphi中解析Xml的控件-SimDesign NativeXml

    Delphi中解析Xml的控件-SimDesign NativeXml 正在学习,感觉应用很方便.无源代码的版本还是免费的. SimDesign.NativeXml是一个delphi和bcb的XML控 ...

  7. HDU-2058-The sum problem(数学题技巧型)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2058 思路: 这题的n,m都很大,很显然直接暴力,会超时,那就不能全部都找了,利用等差数列求和公式, ...

  8. swift 导航的使用

    导航还是有必要来搞一下的!!!!! 这只是一些基本的导航的使用.....感兴趣的猿可以自己去 废话不多   源码奉上   ⬇️ 首先  delegate里面 在 func application(ap ...

  9. jQuery css,position,offset,scrollTop,scrollLeft用法

    jQuery css,position,offset,scrollTop,scrollLeft用法: <%@ page language="java" import=&quo ...

  10. jQuery children等筛选用法

    jQuery children等筛选用法: <%@ page language="java" import="java.util.*" pageEncod ...