在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 捉迷藏的更多相关文章

  1. [BZOJ 1095] [ZJOI 2007] 捉迷藏

    Description 传送门 Solution 先将原树转化成点分树: 然后维护三个堆: \(c[i]\) 保存点分树中子树 \(i\) 中的黑色节点到 \(fa[i]\) 的距离: \(b[i]\ ...

  2. [ZJOI 2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双 ...

  3. 【bzoj 1095】[ZJOI2007]Hide 捉迷藏

    题目链接: TP 题解: 样例好良心,调样例3h一A…… 细节好多……诸如没完没了的pop和push……搞得头都大了. 同情zzh……调了整一天了. 动态点分治裸题……果然每个“裸题”打起来都跟shi ...

  4. [BZOJ 1058][ZJOI 2007]报表统计 平衡树+线段树

    考试的时候看见这道题,感觉自己能AC掉,然后就冲着正解去了.然后想了想数据结构,应该是平衡树.然而蒟蒻的我忘了平衡树怎么打了..然后就根据自己的记忆和理解打了出来.然后我简单的以为相邻的用个链表就能解 ...

  5. [bzoj 1059][ZJOI 2007]矩阵游戏(二分图最大匹配)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 分析:不论如何交换,同一行或同一列的点还是同一行或同一列,如果我们称最后可以排成题目要求 ...

  6. bzoj 1093 [ ZJOI 2007 ] 最大半连通子图 —— 拓扑+DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1093 先缩点,然后就是找最长链,DP一下即可: 注意缩点后的重边!会导致重复计算答案. 代码 ...

  7. bzoj 1059 [ ZJOI 2007 ] 矩阵游戏 —— 二分图匹配

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1059 每一列选出一个占据一行才可以: 挫败. 代码如下: #include<iostr ...

  8. 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)

    1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏 ...

  9. 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树

    [题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...

随机推荐

  1. 安装XAMPP时出现 unable to realloc 83886080 bytes

    参考:https://www.apachefriends.org/faq_linux.html 转载:http://blog.xinspace.space/2015/08/06/xampp-unabl ...

  2. 代码篇之AOP框架

    AopFrameworkTest类 public class AopFrameworkTest { public static void main(String[] args) throws Exce ...

  3. overlay和overlay2的区别

    docker作为一个容器平台,它有一套自己的存储系统.它支持的driver有overlay,overlay2, aufs等等. 这篇文章主要分析overlay和overlay2的区别. overlay ...

  4. make -j 4 echo !$

    make -j 4 #以cpu四核编译 !$上一次命令空格后的部分

  5. http Keep-Alive

    1.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTT ...

  6. 在VS2010中如何添加MSCOMM控件,实现串口通讯

      参考文章:http://wenku.baidu.com/link?url=MLGQojaxyHnEgngEAXG8oPnISuM9SVaDzNTvg0oTSrrJkMXIR_6MR3cO_Vnh- ...

  7. Siteserver平台搭建

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 一开始什么也不懂真痛 ...

  8. HDMI原理图信号PIN脚

    HDMI(19Pin)/DVI(16 pin)的功能是热插拔检测(HPD),这个信号将作为主机系统是否对HDMI/DVI是否发送TMDS信号的依据.HPD是从显示器输出送往计算机主机的一个检测信号.热 ...

  9. POJ 1840 Eqs(hash)

    题意  输入a1,a2,a3,a4,a5  求有多少种不同的x1,x2,x3,x4,x5序列使得等式成立   a,x取值在-50到50之间 直接暴力的话肯定会超时的   100的五次方  10e了都 ...

  10. convert from EST/EDT to GMT

    TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime ...