[ZJOI 2007] 捉迷藏
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=1095
[算法]
首先建出点分树,然后每一个点开两个堆。“第一个堆记录子树中所有节点到父亲节点的距离 ,第二个堆记录所有子节点的堆顶 ,那么一个节点的堆2中的最大和次大加起来就是子树中经过这个节点的最长链。然后我们最后开一个全局的堆,记录所有堆2中最大值和次大值之和。那么全局的堆顶就是答
案
时间复杂度 : O(NlogN ^ 2)
[代码]
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define M 500010
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull; int n , root , tot , timer;
int size[N] , head[N] , weight[N] , father[N] , ans[N];
bool visited[N] , light[N];
map< int , pair<int , int> > mp[N]; struct edge
{
int to , nxt;
} e[M << ]; struct Heap
{
priority_queue< int > hp , era;
inline void ins(int value)
{
hp.push(value);
}
inline void del(int value)
{
if (value != ) era.push(value);
}
inline int max()
{
while (!hp.empty() && !era.empty() && era.top() == hp.top())
{
hp.pop();
era.pop();
}
if (hp.empty()) return ;
else return hp.top();
}
inline int secmax()
{
int tmp = max();
del(tmp);
int ret = max();
ins(tmp);
return ret;
}
} A , B[N] , C[N << ]; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void addedge(int u , int v)
{
++tot;
e[tot] = (edge){v , head[u]};
head[u] = tot;
}
inline void getroot(int u , int father , int total)
{
size[u] = ;
weight[u] = ;
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == father || visited[v]) continue;
getroot(v , u , total);
size[u] += size[v];
chkmax(weight[u] , size[v]);
}
chkmax(weight[u] , total - size[u]);
if (weight[u] < weight[root]) root = u;
}
inline void dfs(int u , int father , int rt , int belong , int depth)
{
mp[rt][u] = make_pair(belong , depth);
C[belong].ins(depth);
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == father || visited[v]) continue;
dfs(v , u , rt , belong , depth + );
}
}
inline void work(int u)
{
visited[u] = true;
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (!visited[v])
{
dfs(v , u , u , ++timer , );
B[u].ins(C[timer].max());
}
}
ans[u] = B[u].max() + B[u].secmax();
A.ins(ans[u]);
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (!visited[v])
{
root = ;
getroot(v , u , size[v]);
father[root] = u;
work(root);
}
}
} int main()
{ read(n);
for (int i = ; i < n; i++)
{
int x , y;
read(x); read(y);
addedge(x , y);
addedge(y , x);
}
int q;
read(q);
root = ;
weight[] = n;
getroot( , , n);
work(root);
int cnt = n;
while (q--)
{
char type[];
scanf("%s" , type);
if (type[] == 'C')
{
int x , y;
scanf("%d" , &x);
y = x;
if (light[x])
{
light[x] = false;
++cnt;
A.del(ans[x]);
ans[x] = B[x].max() + B[x].secmax();
A.ins(ans[x]);
x = father[x];
while (x != )
{
pair<int , int> tmp = mp[x][y];
B[x].del(C[tmp.first].max());
C[tmp.first].ins(tmp.second);
B[x].ins(C[tmp.first].max());
A.del(ans[x]);
if (light[x])
{
if (B[x].secmax()) ans[x] = B[x].max() + B[x].secmax();
else ans[x] = ;
} else ans[x] = B[x].max() + B[x].secmax();
A.ins(ans[x]);
x = father[x];
}
} else
{
light[x] = true;
--cnt;
A.del(ans[x]);
if (B[x].secmax()) ans[x] = B[x].max() + B[x].secmax();
else ans[x] = ;
A.ins(ans[x]);
x = father[x];
while (x != )
{
pair<int , int> tmp = mp[x][y];
B[x].del(C[tmp.first].max());
C[tmp.first].del(tmp.second);
B[x].ins(C[tmp.first].max());
A.del(ans[x]);
if (light[x])
{
if (B[x].secmax()) ans[x] = B[x].max() + B[x].secmax();
else ans[x] = ;
} else ans[x] = B[x].max() + B[x].secmax();
A.ins(ans[x]);
x = father[x];
}
}
} else
{
if (!cnt) printf("-1\n");
else if (cnt == ) printf("0\n");
else printf("%d\n" , A.max());
}
}
return ; }
[ZJOI 2007] 捉迷藏的更多相关文章
- 数据结构(括号序列,线段树||点分治,堆):ZJOI 2007 捉迷藏
[题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N- ...
- [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] [ZJOI 2007]Hide 捉迷藏
在BZ上连续MLE n次后,终于A了. 自己YY的动态点分写法,思路还是很清楚的,但是比较卡内存. 用到了MAP导致复杂度比其他的代码多了一个log,看来需要去借鉴一下别人怎么写的. updata i ...
- 【BZOJ 1096】【ZJOI 2007】仓库建设 DP+斜率优化
后缀自动机看不懂啊QAQ 放弃了还是看点更有用的东西吧,比如斜率优化DP 先水一道 #include<cstdio> #include<cstring> #include< ...
- [BZOJ 1058][ZJOI 2007]报表统计 平衡树+线段树
考试的时候看见这道题,感觉自己能AC掉,然后就冲着正解去了.然后想了想数据结构,应该是平衡树.然而蒟蒻的我忘了平衡树怎么打了..然后就根据自己的记忆和理解打了出来.然后我简单的以为相邻的用个链表就能解 ...
- [ZJOI 2007]时态同步
Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...
- [ZJOI 2007] 矩阵游戏
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1059 [算法] 二分图最大匹配 时间复杂度 : O(N^3) [代码] #inclu ...
- 洛谷 P1131 [ ZJOI 2007 ] 时态同步 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P1131 记录 x 子树内同步的时间 f[x],同步所需代价 g[x]: 直接转移即可,让该儿子子树与其它儿子同步, ...
随机推荐
- activiti自己定义流程之整合(二):使用angular js整合ueditor创建表单
基础环境搭建完成,接下来就该正式着手代码编写了,在说代码之前.我认为有必要先说明一下activit自己定义流程的操作. 抛开自己定义的表单不谈.通过之前的了解,我们知道一个新的流程開始.是在启动流程实 ...
- editplus重新载入文档
editplus重新载入文档 :document->reload
- from: 关于RabbitMQ
from: http://lynnkong.iteye.com/blog/1699684 1 什么是RabbitMQ? RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种, ...
- 【matlab】:matlab中不断的出现计算过程怎么办
这个问题是会常常性出的.就是matlab中不断的出现计算. 关于这个问题,我们须要考虑的是自己是不是写错了,通常会出现以下两种可能的错误 1,关于计算的函数没有写分号 :这样的是致命问题,假设函数不写 ...
- python_获得列表中重复的项的索引
a = ['b','a', 'b', 'c', 'a', 'c','d'] b=[] f=[] for i in a: c=[] for item in enumerate(a): if item[1 ...
- Html5学习笔记1 元素 标签 属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Solaris 目录与文件管理
熟悉系统目录结构 掌握27个常用命令 掌握针对目录.文件的操作 掌握查找与文件内容的操作 一.命令 命令:内部命令(不依赖其他文件,可以直接执行)与外部命令 .他是用于实现某一类功能的指令或程序,其执 ...
- HDU ACM 1073 Online Judge ->字符串水题
分析:水题. #include<iostream> using namespace std; #define N 5050 char a[N],b[N],tmp[N]; void Read ...
- VCC/AVCC/VDD/AVDD区别
V*与AV*的区别是:数字与模拟的区别CC与DD的区别是:供电电压与工作电压的区别(通常VCC>VDD): 数字电路供电VCC 模拟电路供电AVCCVDD是指工作电压,就是供电进芯片的 AVDD ...
- Flatify分页
Flatify分页:<ul uib-pagination total-items="siteCount" items-per-page="1" max-s ...