LOJ6066:「2017 山东一轮集训 Day3」第二题
传送门
二分答案 \(k\),考虑如何 \(hash\) 使得做起来方便
把每个点挂在 \(k+1\) 级祖先上,考虑在祖先上删除
这道题巧妙在于其可以对于 \(dfs\) 序/括号序列 \(hash\)
这样在 \(k+1\) 级祖先上暴力删除就好了
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn(2e5 + 5);
const ull base(19260817);
unordered_map <ull, int> hash_table;
int first[maxn], cnt, n, idx, dfn[maxn], ed[maxn], mxd[maxn], st[maxn], top;
ull val[maxn], pw[maxn], hsh[maxn];
vector <int> son[maxn], kson[maxn];
inline void Dfs1(int u) {
dfn[u] = ++idx, val[idx] = 233;
for (auto v : son[u]) Dfs1(v), mxd[u] = max(mxd[u], mxd[v]);
ed[u] = ++idx, ++mxd[u], val[idx] = 131;
}
inline void Dfs2(int u, int k) {
st[++top] = u;
if (top - 1 > k) kson[st[top - k - 1]].push_back(u);
for (auto v : son[u]) Dfs2(v, k);
--top;
}
inline ull Hash(int l, int r) {
return hsh[r] - hsh[l - 1] * pw[r - l + 1];
}
inline int Calc(int k) {
register int i, l, r;
register ull v;
hash_table.clear();
for (i = 1; i <= n; ++i) kson[i].clear();
Dfs2(1, k);
for (i = 1; i <= n; ++i)
if (mxd[i] > k) {
l = dfn[i], v = 0;
for (auto to : kson[i]) {
r = dfn[to] - 1;
v = v * pw[r - l + 1] + Hash(l, r);
l = ed[to] + 1;
}
r = ed[i], v = v * pw[r - l + 1] + Hash(l, r);
if (hash_table.count(v)) return 1;
hash_table[v] = 1;
}
return 0;
}
int main() {
register int i, v, x, l, r, mid, ans;
scanf("%d", &n);
for (i = 1; i <= n; ++i)
for (scanf("%d", &x); x; --x) scanf("%d", &v), son[i].push_back(v);
Dfs1(1), pw[0] = 1;
for (i = 1; i <= idx; ++i) pw[i] = pw[i - 1] * base;
for (i = 1; i <= idx; ++i) hsh[i] = hsh[i - 1] * base + val[i];
l = 2, r = n, ans = 1;
while (l <= r) Calc(mid = (l + r) >> 1) ? ans = mid, l = mid + 1 : r = mid - 1;
printf("%d\n", ans);
return 0;
}
LOJ6066:「2017 山东一轮集训 Day3」第二题的更多相关文章
- 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)
[LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...
- [LOJ#6066]. 「2017 山东一轮集训 Day3」第二题[二分+括号序列+hash]
题意 题目链接 分析 首先二分,假设二分的答案为 \(mid\),然后考虑利用括号序列来表示树的形态. 点 \(u\) 的 \(k-\) 子树的括号序列表示实际上是刨去了 \(u\) 子树内若干个与 ...
- loj6100 「2017 山东二轮集训 Day1」第一题
传送门:https://loj.ac/problem/6100 [题解] 我们考虑维护从某个端点开始的最长满足条件的长度,如果知道了这个东西显然我们可以用主席树来对每个节点建棵关于右端点的权值线段树, ...
- Loj #6069. 「2017 山东一轮集训 Day4」塔
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
- Loj #6073.「2017 山东一轮集训 Day5」距离
Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...
- Loj 6068. 「2017 山东一轮集训 Day4」棋盘
Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...
- 「2017 山东一轮集训 Day5」苹果树
「2017 山东一轮集训 Day5」苹果树 \(n\leq 40\) 折半搜索+矩阵树定理. 没有想到折半搜索. 首先我们先枚举\(k\)个好点,我们让它们一定没有用的.要满足这个条件就要使它只能和坏 ...
- loj6068. 「2017 山东一轮集训 Day4」棋盘 二分图,网络流
loj6068. 「2017 山东一轮集训 Day4」棋盘 链接 https://loj.ac/problem/6068 思路 上来没头绪,后来套算法,套了个网络流 经典二分图 左边横,右边列 先重新 ...
- LOJ #6074. 「2017 山东一轮集训 Day6」子序列
#6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...
随机推荐
- python+selenium 定位隐藏元素
定位隐藏要素的原理:页面主要通过“display:none”来控制元素不可见.所以我们需要通过javaScript修改display的值得值为display="block,来实现元素定位的. ...
- 本机号码认证黑科技:极光(JG)开发者服务推出“极光认证”新产品
近日,中国领先的大数据服务商极光(JG)推出全新产品--极光认证JVerification.极光认证是极光针对APP用户注册登陆,二次安全验证等身份验证场景打造的一款本机号码认证SDK,验证用户提供的 ...
- leetcode-733-Flood Fill
题目描述: An image is represented by a 2-D array of integers, each integer representing the pixel value ...
- spring属性配置执行过程,单列和原型区别
Spring配置中,采用属性注入时,当创建IOC容器时,也直接创建对象,并且执行相对应的setter方法 Student.java package com.scope; public class St ...
- Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云!
Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云! Chef.Puppet.Ansible.SaltStack 都可以称为配置管理工具,这些工具的主要目 ...
- 【性能测试】:LR中解决接口请求中包含中文字符,服务器不识别的问题
在LR中,直接写的接口请求,如果请求字段包含中文字段,服务器会不识别,这个时候就要用到lr_convert_string_encoding这个函数: 具体用法: lr_convert_string_e ...
- python 网络编程之socket开发和socketserver模块
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
- Mac下使用tree命令
Mac下没有tree命令,但是可以通过brew进行安装,命令如下: brew install tree 装好后tree的用法和linux下的保持一致.参考:http://www.cnblogs.com ...
- (转)Python数学函数
原文:https://www.cnblogs.com/lpl1/p/7793645.html PYTHON-基础-内置函数小结----------http://www.wklken.me/posts/ ...
- Linux系统编程:文件I/O编程
文件I/O操作在Linux编程时是经常会使用到的一个内容,通常可以把比较大的数据写到一个文件中来进行存储或者与其他进程进行数据传输,这样比写到一个全局数组或指针参数来实现还要方便好多. 一.文件常用操 ...