【BZOJ 1023】【SHOI 2008】cactus仙人掌图
良心的题解↓
http://z55250825.blog.163.com/blog/static/150230809201412793151890/
tarjan的时候如果是树边则做树形DP(遇到环就无视),最后在tarjan回溯前扫一遍当前点为“最高点”的环,进行环上DP,这个环上DP是$O(n^2)$的,但如果我们用单调队列优化则是$O(n)$的
总复杂度$O(n)$真是无限仰膜OTZ
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 500003;
void read(int &k) {
k = 0; int fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 1) + (k << 3) + c - '0';
k = k * fh;
} struct node {int nxt, to;} E[N << 1];
int ans = 0, point[N], n, m, cnt = 0, l, r;
int deep[N], F[N], fa[N], DFN[N], low[N], Q[N << 1], tb[N << 1]; void ins(int x, int y) {E[++cnt] = (node) {point[x], y}; point[x] = cnt;} void __(int rt, int x) {
int tot = deep[x] - deep[rt] + 1, num = tot << 1, top = tot >> 1;
for(int tmp = x; tmp != rt; tmp = fa[tmp]) tb[tot--] = F[tmp];
tb[1] = F[rt];
tot = deep[x] - deep[rt] + 1;
for(int i = 1; i <= tot; ++i) tb[tot + i] = tb[i];
l = r = 1; Q[1] = 1;
for(int i = 2; i <= num; ++i) {
while (l <= r && i - Q[l] > top) ++l;
ans = max(ans, tb[i] + i + tb[Q[l]] - Q[l]);
while (l <= r && tb[Q[r]] - Q[r] <= tb[i] - i) --r;
Q[++r] = i;
}
for(int i = 2; i <= tot; ++i)
F[rt] = max(F[rt], tb[i] + min(i - 1, tot - i + 1));
} void _(int x) {
DFN[x] = low[x] = ++cnt;
for(int tmp = point[x]; tmp; tmp = E[tmp].nxt) {
int v = E[tmp].to;
if (v == fa[x]) continue;
if (!DFN[v]) {
fa[v] = x; deep[v] = deep[x] + 1;
_(v); low[x] = min(low[x], low[v]);
} else
low[x] = min(low[x], DFN[v]);
if (DFN[x] < low[v]) {
ans = max(ans, F[x] + F[v] + 1);
F[x] = max(F[x], F[v] + 1);
}
}
for(int tmp = point[x]; tmp; tmp = E[tmp].nxt) {
int v = E[tmp].to;
if (x == fa[v] || DFN[x] > DFN[v]) continue;
__(x, v);
}
} int main() {
read(n); read(m); int u, v, k;
for(int i = 1; i <= m; ++i) {
read(k); read(u);
for(--k; k; --k) {read(v); ins(u, v); ins(v, u); u = v;}
} cnt = 0;
_(1);
printf("%d\n", ans);
return 0;
}
仙人掌虽然偏,但是不知道也不可以,这个代码是我磕了一晚上题解的成果QAQ
【BZOJ 1023】【SHOI 2008】cactus仙人掌图的更多相关文章
- 【BZOJ 1023】[SHOI2008]cactus仙人掌图
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1023 [题意] [题解] 如果不考虑有环的情况; 那么有一个经典的求树的直径的方法; ...
- 【BZOJ】【1023】【SHOI2008】cactus仙人掌图
DP+单调队列/仙人掌 题解:http://hzwer.com/4645.html->http://z55250825.blog.163.com/blog/static/150230809201 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1141 Solved: 435[Submit][ ...
- bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图
http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...
- SHOI2008 cactus仙人掌图 和 UOJ87 mx的仙人掌
cactus仙人掌图 题目描述 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一 ...
- [BZOJ]1023 cactus仙人掌图(SHOI2008)
NOIP后的第一次更新嗯. Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在 ...
- 1023: [SHOI2008]cactus仙人掌图 - BZOJ
Description如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路 ...
- 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
- 【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树)
[题意]给定仙人掌图(每条边至多在一个简单环上),求直径(最长的点对最短路径).n<=50000,m<=10^7. [算法]DFS树处理仙人掌 [题解]参考:仙人掌相关问题的处理方法(未完 ...
- 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...
随机推荐
- POJ 3384 Feng Shui --直线切平面
题意:房间是一个凸多边形,要在里面铺设两条半径为r的圆形地毯,可以重叠,现在要求分别铺设到哪,使地毯所占的地面面积最大. 解法:要使圆形地毯所占面积最大,圆形地毯一定是与边相切的,这样才能使尽量不重叠 ...
- UESTC 33 Area --凸包面积
题意: 求一条直线分凸包两边的面积. 解法: 因为题意会说一定穿过,那么不会有直线与某条边重合的情况.我们只要找到一个直线分成的凸包即可,另一个的面积等于总面积减去那个的面积. 怎么得到分成的一个凸包 ...
- HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- Unity Camera的两种模式
http://www.cnblogs.com/zhaoqingqing/p/3302484.html
- Zygote进程【1】——Zygote的诞生
在Android中存在着C和Java两个完全不同的世界,前者直接建立在Linux的基础上,后者直接建立在JVM的基础上.zygote的中文名字为"受精卵",这个名字很好的诠释了zy ...
- 手势-webview与scrollView重复手势处理
// called when the recognition of one of gestureRecognizer or otherGestureRecognizer would be blocke ...
- HTML DOM 事件
HTML DOM 事件 HTML DOM 事件 HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序. 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户 ...
- Mac下搭建php开发环境教程
方案一:原生安装 这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例,需要的朋友可以参考 ...
- Centos下Tomcat 安装Apache Portable Runtime
APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心. APR有很多用途,包括访问高级IO功能(例如sendfile,epo ...
- GNU Trove trove4j
GNU Trove (http://trove4j.sourceforge.net/) 是一个Java 集合类库.在某些场景下,Trove集合类库提供了更好的性能,而且内存使用更少.以下是Trove中 ...