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 捉迷藏——线段树+括号序列
题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...
随机推荐
- javascript--hasOwnProperty()+isPrototypeof()+in方法
1.hasOwnProperty():用来检测对象中是否包含给出的函数属性或者对象,但是无法检测出对象的原型链中是否包含给出的属性或对象--该属性或者对象必须在函数内部被声明 2.isPrototyp ...
- java基础面试
1. String类为什么是final的. 安全性:如果字符串是可变的,那么会引起很严重的安全问题.譬如,数据库的用户名.密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名 ...
- OSG开发概览(转载)
OSG开发概览 1 OSG基础知识 Ø OSG是Open Scene Graphic 的缩写,OSG于1997年诞生于以为滑翔机爱好者之手,Don burns 为了对滑翔机的飞行进行模拟,对open ...
- AngularJS最理想开发工具WebStorm
http://blog.fens.me/angularjs-webstorm-ide/ Angularjs插件下载地址:http://plugins.jetbrains.com/plugin/6971 ...
- Xcode 添加前缀
项目导航栏>Targets>右侧的Utilities>Class Prefix
- Java语言Socket接口用法详解
Socket接口用法详解 在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...
- Ionic在线打包IOS平台应用
参见:http://docs.ionic.io/services/profiles/#ios-app-certificate--provisioning-profile Ionic云编译,需要注册.地 ...
- 如何将lrc歌词文件批量转换为ANSI编码?
有些MP3.MP4或学习机只能播放ANSI编码的歌词文件,可是从网站上下载的歌词大多是UTF-8或者其它机器支持不了的编码,如何批量将这些lrc歌词文件转换成ANSI编码的文件呢? 工具/原料 萍客T ...
- HDU-2058-The sum problem(数学题技巧型)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2058 思路: 这题的n,m都很大,很显然直接暴力,会超时,那就不能全部都找了,利用等差数列求和公式, ...
- JSP模板文本
JSP模板文本: http://book.51cto.com/art/200907/136020.htm JSP页面就是带有JSP元素的常规Web页面,它是由JSP模版文本和JSP元素组成的.在一个J ...