[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]: 直接转移即可,让该儿子子树与其它儿子同步, ...
随机推荐
- STL源代码剖析 容器 stl_deque.h
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie deque ---------------------------------------- ...
- cocos2d-x 事件分发机制 ——触摸事件监听
cocos2d-x 3.0 出来已经好久了,也已经用3.0写了几个小游戏,感觉3.0的事件触发机制太赞了,随这里总结一下.也算是对知识的一种回顾和加深理解. 3.0的事件分发机制中.须要也只须要通过创 ...
- Codeforces Beta Round #1 A. Theatre Square
从今天開始.就要在Codeforces里有一个新的開始了,貌似任务非常重的说~~ Codeforces专题我将会记录全部通过的题目,事实上仅仅要通过的题目都是水题啊!. 题目大意: 依照要求计算须要多 ...
- python(26)- 面向对象补充Ⅱ
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)判断obj是否是类 cls 的对象 class Foo(object): ...
- Layout规则总结
一.尺寸要求 1.过孔到焊盘的距离多少合适? 6mil左右 2.铜皮到边框的距离多少合适? 极限8mil,通常12,最好做到20,40 3.Thermal焊盘打地孔个数? 正方形 3*3 4*4 ...
- python--员工信息管理系统编译及思路
员工管理系统,顾名思义,应该具有增删查改功能.拿到需求后,应该按照一定的流程依次编写,最后达到程序的统一和兼容. 系统需求如下: 文件存储格式如下: id,name,age,phone,job 1,A ...
- bootstrap table api
http://blog.csdn.net/rickiyeat/article/details/56483577
- nodejs-runoob
是否安装成功nodejs - node -v 是否安装成功npm - npm -v
- 微信小程序 如何使用globalData
微信小程序在JavaScript文件中声明的变量和函数只在该文件中有效:不同的文件中可以声明相同名字的变量和函数,不会互相影响.如果希望在各个页面之间共同使用某些信息,并且可以对共享数据进行修改设置, ...
- 零基础学python-2.18 异常
这一节说一下异常except 继续沿用上一节的代码.我有益把文件名称字搞错.然后在结尾部分加上异常捕捉: try: handler=open("12.txt")#在这里我特别将文件 ...