这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了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. IOS 7 Xcode 5 免IDP证书 真机调试(转载)

    最近转开发了,真的很久没有更新博客了,今天有空写一篇吧. 今天带来的是 IOS 7 Xcode 5 免IDP证书的真机调试.说白了就是穷,不想给苹果交那$99的钱. 注意:虽然可以用这个方法实现真机调 ...

  2. sqlserver 笔记:常用字符串函数

    select tid,tid+ coalesce(tid0,'101') from article where  id=1 ---如果tid为null 则 返回101    select LEN('你 ...

  3. ui主线程控件的更新就让这个activity的异步任务做完整

    项目中使用的SingleMessageView,控件实例化后,点击用户头像,此时跳转到UserInfo里查看这个用户的头像.用户名.签名.标签. 之前,师兄在SingleMessage里写了个头像的点 ...

  4. Android自定义控件之TextView

    转自:http://labs.easymobi.cn/?p=284 有时候Android自带的控件无法满足我们的某些要求,这时就需要我们自定义控件来实现这些功能.比如需要一个TextView里的字倾斜 ...

  5. 谈谈Session会话和Cookie

    Session Session在我们的网络应用中就是一种客户端与服务器端保持状态的解决方案 Session对象,就是客户端浏览器与服务器之间建立的互动信息状态.每一个不同的用户连接将得到不同的Sess ...

  6. [项目回顾]基于Annotation与SpringAOP的缓存简单解决方案

    前言: 由于项目的原因,需要对项目中大量访问多修改少的数据进行缓存并管理,为达到开发过程中通过Annotation简单的配置既可以完成对缓存的设置与更新的需求,故而设计的该简易的解决方案. 涉及技术: ...

  7. Swift分割字符串

    var str_componets = "I Like Swift " str_componets.componentsSeparatedByString(" " ...

  8. Angular - - ngClass、ngClassEven、ngClassOdd、ngStyle

    这几个都关于样式及类名修改的,所以先把样式代码贴上吧. .red{color:red} .blue{color:blue} 写案例用到的样式就这么简单的两个,下面进入正题. ngClass ngCla ...

  9. DELPHI加密字串(异或运算加密)

    首先有两个自定的转换函数: function myStrToHex(s:string):string; //字串转16进制 var TmpStr:string; i:integer; begin Tm ...

  10. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建第一个Web Api应用(二)

    运行应用 In Visual Studio, press CTRL+F5 to launch the app. Visual Studio launches a browser and navigat ...