在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. 后台CMS日志处理记录

    自从上一次添加了极光推送之后,我的工程就像是着魔了一样,不管怎么调整,日志级别都是DEBUG. 启动一次工程会打印很多无用日志,今天决定抽时间去研究了一下,最终解决了问题,下面记录一下解决过程. 1. ...

  2. Mongodb性能调优

    摘要 1. Mongodb 适用场景简介 2. Mongodb 性能监控与分析 3. Mongodb 性能优化建议 关于Mongodb的几个大事件 1.根据美国数据库知识大全官网发布的DB热度排行,M ...

  3. js 数组去重复

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. pkav之当php懈垢windows通用上传缺陷

    $pkav->publish{当php懈垢windows}剑心@xsser抛弃了我,但我却不能抛弃乌云..php懈垢windows,就像男人邂逅女人,早晚都会出问题的..感谢二哥@gainove ...

  5. x86 Android游戏开发专题篇之使用google breakpad捕捉c++崩溃(以cocos2dx为例)

    近期一直都在x86设备上进行游戏开发.就c++层和Android java层倒没有什么要特别注意的(除了须要注意一下改动Application.mk指定平台外),在c++崩溃的时候,非常多时候看不到堆 ...

  6. Theano学习笔记(四)——导数

    导数使用T.grad计算. 这里使用pp()打印梯度的符号表达式. 第3行输出是打印了经过优化器简化的符号梯度表达式,与第1个输出相比确实简单多了. fill((x** TensorConstant{ ...

  7. IOS Audio开发集合

    打算每天抽出一点时间学习音频方面的知识,在此做下汇总: 1. 多媒体层预览  根据结构,明确学习内容.

  8. Oracle Sequence用plsql修改

    在plsql中,打开Objects窗口   找Sequences文件夹>你需要修改的Sequence   选中你需要修改的sequence,右键edit(编辑)     OK!

  9. TI C66x DSP 系统events及其应用 - 5.9(IST重定位)

    RESET中断的获取包必须位于0地址处,然后其它中断的获取包能够位于不论什么256字(1k字节边界)对齐的程序空间.IST的位置由ISTP寄存器中的ISTB字段决定. IST又一次定位举例: 1,将I ...

  10. javascript的slice(),splice(),split(),substring(),substr()

    例子摘抄于http://www.w3school.com.cn/jsref/jsref_obj_array.asp 1.slice(): Array和String对象都有 在Array中  slice ...