传送门

二分答案 \(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」第二题的更多相关文章

  1. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  2. [LOJ#6066]. 「2017 山东一轮集训 Day3」第二题[二分+括号序列+hash]

    题意 题目链接 分析 首先二分,假设二分的答案为 \(mid\),然后考虑利用括号序列来表示树的形态. 点 \(u\) 的 \(k-\) 子树的括号序列表示实际上是刨去了 \(u\) 子树内若干个与 ...

  3. loj6100 「2017 山东二轮集训 Day1」第一题

    传送门:https://loj.ac/problem/6100 [题解] 我们考虑维护从某个端点开始的最长满足条件的长度,如果知道了这个东西显然我们可以用主席树来对每个节点建棵关于右端点的权值线段树, ...

  4. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  5. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

  6. Loj 6068. 「2017 山东一轮集训 Day4」棋盘

    Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...

  7. 「2017 山东一轮集训 Day5」苹果树

    「2017 山东一轮集训 Day5」苹果树 \(n\leq 40\) 折半搜索+矩阵树定理. 没有想到折半搜索. 首先我们先枚举\(k\)个好点,我们让它们一定没有用的.要满足这个条件就要使它只能和坏 ...

  8. loj6068. 「2017 山东一轮集训 Day4」棋盘 二分图,网络流

    loj6068. 「2017 山东一轮集训 Day4」棋盘 链接 https://loj.ac/problem/6068 思路 上来没头绪,后来套算法,套了个网络流 经典二分图 左边横,右边列 先重新 ...

  9. LOJ #6074. 「2017 山东一轮集训 Day6」子序列

    #6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...

随机推荐

  1. Linux之Ubuntu切换root su -

    当在Ubuntu系统从普通用户切换到root用户时,总是会报错,提示错误信息.这时因为我们还没有给系统中的root用户设置密码,我们给Ubuntu系统中的root用户设置一个密码就可以实现普通用户和管 ...

  2. 架构师养成记--32.Redis高级(安全 主从复制)

    Redis高级命令及特性 keys * 返回满足的所有键值(*表示模糊匹配) exists 是否存在指定的key(返回1表示存在,0表示不存在) expire 设置某个key的过期时间,使用ttl查看 ...

  3. windows任务管理器所查的网站

    添加menu   https://blog.csdn.net/u012273127/article/details/71293088 点击菜单打开对话框  https://blog.csdn.net/ ...

  4. Java操作数据库实现"增删改查"

    本文主要讲解JDBC操作数据库    主要实现对MySql数据库的"增删改查" 综合概述: JDBC的常用类和接口 一   DriverManager类 DriverManage类 ...

  5. PHPStudy环境下搭建composer

    第一种方法(亲测有效) 1. 找到composer的安装目录:D:\phpstudy\PHPTutorial\tools\composer 2.把目录下的 composer.bat 和 compose ...

  6. Jenkins 插件升级时跳过 update site 的签名验证

    当升级jenkins插件时,如果链接的update site用的自签名证书,可以用这个选项来启动Jenkins,来跳过签名验证:  -Dhudson.model.DownloadService.noS ...

  7. 认识CSS3新增选择器和样式

    前端之HTML5,CSS3(二) CSS3新增选择器和样式 CSS3新增选择器 结构伪类选择器 :first-child:选取父元素中的第一个子元素的指定选择器 :last-child:选取父元素中的 ...

  8. Mac下Homebrew安装的软件放在什么地方

    一般情况是这么操作的: 1.通过brew install安装应用最先是放在/usr/local/Cellar/目录下. 2.有些应用会自动创建软链接放在/usr/bin或者/usr/sbin,同时也会 ...

  9. 使用NHibernate(5)-- Linq To NHibernate

    Linq是NHibernate所支持的查询语言之一,对于Linq的实现在源码的src/Linq目录下.以下是一个使用Linq进行查询数据的示例: var users = session.Query&l ...

  10. R302指识别开发笔记

    一.相关概念 1.存储容量:500枚指纹,地址范围0-499. 2.用户记事本:模块内部为用户开辟了512Bytes的FLASH空间用于存放用户数据该存储空间称为用户记事本,该记事本逻辑上被分成16个 ...