这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了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. java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig

    问题描述: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with n ...

  2. RecyclerView学习笔记

    主要方法: setLayoutManager:设置显示方式,有LinearLayoutManager(像ListView一样的纵向列表布局),有GridLayoutManager(网格布局),有Sta ...

  3. CSS长度单位详解

    序言 长度单位可以总体的分为绝对长度单位和相对长度单位.CSS中最为大家熟知的无疑是px和em,但与此同时还存在pt, rem, vw, vh等其他计量单位,使用好它们可以大大增长我们的开发效率.本篇 ...

  4. java系列--过滤器

    在web.xml配置过滤器:过滤器一定要放在所以Servlet前面 过滤器的生命周期: 过滤器的应用: 1.编码格式 2.权限验证 3.数据库关闭

  5. DataTable.DataRow的复制

    经常遇到这种错误,“此行已属于另一个表”的错误,导致这个错误的语句如下: dtPriceTable.Rows.InsertAt(aDataRow,i); 或者 dtPriceTable.Rows.Ad ...

  6. iOS 之 内存检查instrument

    经常听见iOS开发instrument是一个内存检查工具,但是,没想到,它是集成在xcode里面的,而且打开一看,感觉功能非常强大. 打开方式是 product -> profile 头一次运行 ...

  7. 使用布局(Layout资源)

    实际上从我们学习第一个Android应用开始,已经开始接触Android的Layout资源了,因此此处不会详细介绍Android Layout资源的知识,会对Layout资源进行简单的归纳. Layo ...

  8. JAVA中Singleton的用法

    Java Singleton模式属于管理实例化过程的设计模式家族.Singleton是一个无法实例化的对象.这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例. JAVA ...

  9. 实现jul 日志重定向到 slf4j

    需求背景 jul 指的是java.util.logging,是 java 内置的日志模块,目前流行的Java日志组件还包括 jcl(common-logging).slf4j/log4j/logbac ...

  10. oracle sql 知识小结

    Oracle_sql : 第一单元:select 语句: ①:字符串连接操作符: || ②:去除重复行:distinct   第二单元:条件限制和排序 ①:关键字:where ②:比较操作符:=,&g ...