[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\). [算法]括号序 ...
随机推荐
- oracle如何获得新插入记录的id
.对于提交(最后一次操作commit了)的话可以查询那个提交段 SELECT 列名1,列名2…… FROM 表名 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAX ...
- 2017.2.22 activiti实战--第六章--任务表单
学习资料:<Activiti实战> 第六章 任务表单 本章将一步步完成一个协同办公系统(OA)的请假流程的设计,讲解如何将Activiti和实际业务联系起来. 首先讲解动态表单与外置表单的 ...
- zookeeper客户端 和服务器连接时版本问题
在使用kafka 和zookeeper 实现实时分析程序时,由于zookeeper部署版本和分析程序导入jar包的版本不一致,导致了当实时分析程序从远程服务器连接kafka集群的zookeeper时报 ...
- 通过apache,和nginx模块去除html中的空格和tab
最近一个项目中,合作方要求去除html中的空格,不想改代码,所以百度了一下通过apache,和nginx模块去除html中的空格和tab的方案,下面记录下来: 一.nginx nginx可以通过mod ...
- Python爬虫爬取美剧网站
一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间.之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前一样同步更新了.但是,作为一个宅diao ...
- iOS 自己定义页面的切换动画与交互动画 By Swift
在iOS7之前,开发人员为了寻求自己定义Navigation Controller的Push/Pop动画,仅仅能受限于子类化一个UINavigationController,或是用自己定义的动画去覆盖 ...
- 分享下多年积累的对JAVA程序员成长之路的总结
http://blog.csdn.net/zhongzelin/article/details/8643269我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,不爱玩社交网站,不爱 ...
- Cloudera Manager 和 CDH 4 终极安装
转载请注明出处:http://www.cnblogs.com/thinkCoding/p/3567408.html 系统环境 操作系统:CentOS 6.5 Cloudera Manager 版本:4 ...
- ETL拉链算法汇总大全
拉链算法总结大全: 一.0610算法(追加) 1.删除仓库表的载入日期是本次载入日期的数据,以支持重跑 delete from xxx where start_dt >=$tx_date; 2. ...
- Content Security Policy
资料来源:阮一峰博客 一.背景 XSS最常见,危害最大的网页安全漏洞,“网页安全政策”从根本上解决问题 二.简介 CSP的实质是白名单制度,明确告诉客户端那些外部资源可以加载和执行. CSP 大大增强 ...