[BZOJ 1095] [ZJOI 2007]Hide 捉迷藏
在BZ上连续MLE n次后,终于A了.
自己YY的动态点分写法,思路还是很清楚的,但是比较卡内存.
用到了MAP导致复杂度比其他的代码多了一个log,看来需要去借鉴一下别人怎么写的.
updata in 2017-05-25:
发现了一些没必要储存的东西.
1. 存储当前重心某子树堆的位置的MAP可以利用在重心树上的儿子记录此信息.
2.求树上距离可以用RMQ,没必要直接拿MAP记下来.
改完这两个令我颇不舒服的地方,复杂度就正常多了.
/*
动态树分治
BZOJ1095
全局路径查询
单点修改,全局查询
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;++i)
#define db double
#define piii pair< pair<int,int>,int>
#define pb push_back
#define FILE "dealing"
#define eps 1e-8
template<class T> inline bool cmin(T&a,T b){return a>b?a=b,true:false;}
template<class T> inline bool cmax(T&a,T b){return a<b?a=b,true:false;}
template<class T> inline T squ(T a){return a*a;}
const int maxn=+,base=,limit=3e8,inf=;
int read(){
int x=,f=,ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
int n,Q;
vector<int>E[maxn];
struct dui{
priority_queue<int> q,q2;
void pop(){
while(!q.empty()&&!q2.empty()&&q.top()==q2.top())q.pop(),q2.pop();
if(!q.empty())q.pop();
}
int top(){
while(!q.empty()&&!q2.empty()&&q.top()==q2.top())q.pop(),q2.pop();
if(!q.empty())return q.top();
else return -;
}
void erase(int x){
q2.push(x);
while(!q.empty()&&!q2.empty()&&q.top()==q2.top())q.pop(),q2.pop();
}
void push(int x){
q.push(x);
while(!q.empty()&&!q2.empty()&&q.top()==q2.top())q.pop(),q2.pop();
}
int getans(){
int s1=top();pop();
int s2=top();push(s1);
if(s1==-)return -;
if(s2==-)return -;
return s1+s2;
}
}All,DA[maxn],MA[maxn<<];int cnt=;
int siz[maxn],vis[maxn],Mx[maxn],dep[maxn];
int getsize(int x,int fa){
siz[x]=;
for(int i=;i<E[x].size();i++)if(E[x][i]!=fa&&!vis[E[x][i]]){
getsize(E[x][i],x);
siz[x]+=siz[E[x][i]];
}
}
void getroot(int x,int fa,int& rt,int S){
Mx[x]=;
for(int i=;i<E[x].size();i++)if(E[x][i]!=fa&&!vis[E[x][i]]){
getroot(E[x][i],x,rt,S);
cmax(Mx[x],siz[E[x][i]]);
}
cmax(Mx[x],S-siz[x]);
if(Mx[x]<Mx[rt])rt=x;
}
int fa[maxn];
vector<int> F[maxn];
map<int,int>A[maxn],B[maxn];
void DFS(int x,int fa,int Cnt,int FA){
A[FA][x]=Cnt;
B[FA][x]=dep[x];
MA[Cnt].push(dep[x]);
for(int i=;i<E[x].size();i++)if(E[x][i]!=fa&&!vis[E[x][i]]){
dep[E[x][i]]=dep[x]+;
DFS(E[x][i],x,Cnt,FA);
}
}
int work(int x,int S){
int rt=;
getroot(x,,rt,siz[x]);
vis[rt]=;
getsize(rt,);x=rt;
cnt++;F[x].push_back(cnt);MA[cnt].push();
A[x][x]=cnt;B[x][x]=;
for(int i=;i<E[x].size();i++)if(!vis[E[x][i]]){
cnt++;
F[x].push_back(cnt);
dep[E[x][i]]=;
DFS(E[x][i],,cnt,x);
}
for(int i=;i<F[x].size();i++)
DA[x].push(MA[F[x][i]].top());
int val=DA[x].getans();
if(val!=-&&val!=-)All.push(val);
for(int i=;i<E[x].size();i++)if(!vis[E[x][i]]){
int y=work(E[x][i],siz[E[x][i]]);
fa[y]=x;
}
return x;
}
char s[];
int f[maxn],sum;
void motify(int x,int FA){
while(x){
int val=DA[x].getans();
if(val!=-&&val!=-)All.erase(val); int id=A[x][FA];
val=MA[id].top();if(val!=-)DA[x].erase(val);
if(!f[FA])MA[id].push(B[x][FA]);
else MA[id].erase(B[x][FA]);
val=MA[id].top();if(val!=-)DA[x].push(val); val=DA[x].getans();
if(val!=-&&val!=-)All.push(val);
x=fa[x];
}
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read();Mx[]=inf;sum=n;
up(i,,n){
int x=read(),y=read();
E[x].push_back(y);
E[y].push_back(x);
}
getsize(,);
work(,siz[]);
Q=read();
while(Q--){
scanf("%s",s+);
if(s[]=='G'){
if(sum==)printf("-1\n");
else if(sum==)printf("0\n");
else printf("%d\n",All.top());
}
if(s[]=='C'){
int x=read();
f[x]^=;
if(!f[x])sum++;
else sum--;
motify(x,x);
}
}
return ;
}
[BZOJ 1095] [ZJOI 2007]Hide 捉迷藏的更多相关文章
- [BZOJ 1095] [ZJOI 2007] 捉迷藏
Description 传送门 Solution 先将原树转化成点分树: 然后维护三个堆: \(c[i]\) 保存点分树中子树 \(i\) 中的黑色节点到 \(fa[i]\) 的距离: \(b[i]\ ...
- [ZJOI 2007]Hide 捉迷藏
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双 ...
- 【bzoj 1095】[ZJOI2007]Hide 捉迷藏
题目链接: TP 题解: 样例好良心,调样例3h一A…… 细节好多……诸如没完没了的pop和push……搞得头都大了. 同情zzh……调了整一天了. 动态点分治裸题……果然每个“裸题”打起来都跟shi ...
- [BZOJ 1058][ZJOI 2007]报表统计 平衡树+线段树
考试的时候看见这道题,感觉自己能AC掉,然后就冲着正解去了.然后想了想数据结构,应该是平衡树.然而蒟蒻的我忘了平衡树怎么打了..然后就根据自己的记忆和理解打了出来.然后我简单的以为相邻的用个链表就能解 ...
- [bzoj 1059][ZJOI 2007]矩阵游戏(二分图最大匹配)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 分析:不论如何交换,同一行或同一列的点还是同一行或同一列,如果我们称最后可以排成题目要求 ...
- bzoj 1093 [ ZJOI 2007 ] 最大半连通子图 —— 拓扑+DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1093 先缩点,然后就是找最长链,DP一下即可: 注意缩点后的重边!会导致重复计算答案. 代码 ...
- bzoj 1059 [ ZJOI 2007 ] 矩阵游戏 —— 二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1059 每一列选出一个占据一行才可以: 挫败. 代码如下: #include<iostr ...
- 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)
1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏 ...
- 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...
随机推荐
- WPF文字渲染相关的问题及解决
wpf中常常遇到各种和文字渲染有关的问题. 如今列举下现象和解决方式. (1) 现象: 文字大小不一.不在同一水平线. 不同字渲染成同一个字, 或者字体发虚 原因:微软雅黑字体对中文字符的渲染支 ...
- 【转载】C++11的简单学习
首先在我们的开发机以及线上机器一般都安装了C++11,目录在: /opt/compiler/gcc-4.8.2/ 看了下面这篇文章<[C++11]30分钟了解C++11新特性> http: ...
- 140. Word Break II(hard)
欢迎fork and star:Nowcoder-Repository-github 140. Word Break II 题目: Given a non-empty string s and a d ...
- Spark Streaming的样本demo统计
废话不多说,直接上代码 package com.demo; import java.util.List; import java.util.regex.Pattern; import org.apac ...
- Java面向对象编程(二)
上一篇博文里总结了面向对象三大特性在Java中的体现.如今谈一谈Java中的抽象类,接口,内部类等特性. 一. 抽象类 public abstract class Shape { public int ...
- 微信小程序 - 下载图片并且显示进度
lastUpDate: 2018-8-12 请把请求地址加入到downLoadFile 提示:首先得要在公众号设置对应的downLoadFile地址. downImg : 下载图片 wxml js d ...
- InnoDB Insert(插入)操作(下)--mysql技术内幕
接上一篇文章,最后做的那个实验,我是想证明mysql innodb存储引擎,commit操作与flush数据到磁盘之间的关系,当与同事交流之后,他说,你应该把innodb_buffer_size的大小 ...
- 『HTML5梦幻之旅』 - 仿Qt演示样例Drag and Drop Robot(换装机器人)
起源 在Qt的演示样例中看到了一个有趣的demo.截图例如以下: 这个demo的名字叫Drag and Drop Robot,简单概括而言,在这个demo中,能够把机器人四周的颜色拖动到机器人的各个部 ...
- PyInstaller把.py转为.exe
http://www.pyinstaller.org/ http://blog.csdn.net/hmy1106/article/details/45151409 python pyinstaller ...
- STL源代码剖析 容器 stl_vector.h
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie vector --------------------------------------- ...