1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= =
然后,看到这种题,首先必须的就是缩点= =
缩点完之后呢,变成在树上找最长路了= =直接树形dp了
那么那些环呢,就是一个环形dp了,可以先把它拆成一条链,然后注意到最长路径=max(f[i]+f[j]-dist(i,j)) 拆成链的话dist(i,j)=i-j 然后就发现dist(i,j)有单调性,就可以用单调队列优化了= =
这样写就可以a了= =
ps1:今天发现有人给我留言了真开心QAQ 感觉自己写了这么久还是有人看到的QAQ 继续加油吧!!!
ps2:bzoj的808端口坏了现在上都得改网址真麻烦QAQ
ps3:刷了好久感觉没啥精神了这个月感觉刷不了多少了QAQ 所以众多STOI补番队的成员啊,这个月的占领头版计划就交给你们了QAQ
CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 50100
#define maxm 20000100
struct edges{
int to,next;
}edge[maxm];
int l,next[maxn];
int addedge(int x,int y){
edge[++l]=(edges){y,next[x]};next[x]=l;
edge[++l]=(edges){x,next[y]};next[y]=l;
return 0;
}
int f[maxn],q[maxn*2],ans,que[maxn],pre[maxn],dep[maxn];
int dp(int y,int x ){
int l=dep[y]-dep[x]+1;
int t=y;
while (l) {
q[l--]=f[t];
t=pre[t];
}
l=dep[y]-dep[x]+1;
for (int i=1;i<=l;i++) q[i+l]=q[i];
int h=0;
t=1;
for (int i=2;i<=(l>>1)+1;i++) {
while (h>=t&&que[h]+q[que[h]]<=i+q[i]) h--;
que[++h]=i;
}
int j=(l>>1)+1;
for (int i=1;i<=(l<<1)-(l>>1);i++){
while (h>=t&&que[t]<=i) t++;
ans=max(ans,que[t]+q[que[t]]+q[i]-i);
j++;
while (h>=t&&que[h]+q[que[h]]<=j+q[j]) h--;
que[++h]=j;
}
for (int i=2;i<=l;i++) f[x]=max(f[x],min(i-1,l-i+1)+q[i]);
return 0;
}
int low[maxn],dfn[maxn],clo;
int dfs(int u,int fa){
pre[u]=fa;
dep[u]=dep[fa]+1;
low[u]=dfn[u]=++clo;
for (int i=next[u];i;i=edge[i].next)
if (edge[i].to!=fa) {
if (!low[edge[i].to]){
dfs(edge[i].to,u);
low[u]=min(low[u],low[edge[i].to]);
}else low[u]=min(low[u],dfn[edge[i].to]);
if (dfn[u]<low[edge[i].to]) {
ans=max(ans,f[u]+f[edge[i].to]+1);
f[u]=max(f[u],f[edge[i].to]+1);
}
}
for (int i=next[u];i;i=edge[i].next)
if (pre[edge[i].to]!=u&&dfn[u]<dfn[edge[i].to]) dp(edge[i].to,u);
return 0;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) {
int k,x,y;
scanf("%d",&k);
scanf("%d",&x);
for (int j=2;j<=k;j++) {
scanf("%d",&y);
addedge(x,y);
swap(x,y);
}
}
dfs(1,0);
printf("%d\n",ans);
return 0;
}
1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)的更多相关文章
- BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)
题目链接 类似求树的直径,可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链.次长链,用每个点子节点不同子树的 max{最长链}+max{次长链} 更新答案.(不需要存次长链,求解过 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1141 Solved: 435[Submit][ ...
- bzoj 1023: [SHOI2008]cactus仙人掌图
这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...
- bzoj 1023: [SHOI2008]cactus仙人掌图【tarjan+dp+单调队列】
本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点 ...
- 1023: [SHOI2008]cactus仙人掌图 - BZOJ
Description如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路 ...
- 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图 2125: 最短路 4728: 挪威的森林 静态仙人掌上路径长度的维护系列
%%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 ...
- 【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树)
[题意]给定仙人掌图(每条边至多在一个简单环上),求直径(最长的点对最短路径).n<=50000,m<=10^7. [算法]DFS树处理仙人掌 [题解]参考:仙人掌相关问题的处理方法(未完 ...
- [BZOJ1023][SHOI2008]cactus仙人掌图 DP
题目链接 套路就是先考虑一般的树上做法.求直径的dp的做法大家应该都会吧. 那么设\(dp[i]\)表示\(i\)的子树中的点到\(i\)的最大距离. 在dp的过程中 \[ ans=\max\{dp[ ...
随机推荐
- jquey插件开发
1.概述 jquery插件开发的主要方法有三种: 1.通过$.extend()来扩展jQuery,即在jQuery命名空间下扩展属性,直接在$对象下调用,不需要再dom下调用,也无法在dom元素下调用 ...
- iOS + UIWebView 实践
1. 调用java script 现在只能实现弹出窗口 [self.m_webView stringByEvaluatingJavaScriptFromString:@"alert(1)&q ...
- redis 高级配置
一.安全性 设置密码:在配置文件中设置 requirepass 123456 由于redis的速度非常快,每秒可以进行15万次的暴力破解,所以密码设置要强壮些 在客户端登录或者连接的时候,使用 aut ...
- Html 和 Css 的杂乱总结
1. input 中可以设置 maxLength 属性,控制输入的文字数量,中英文字节数一样,但是没有验证兼容性 2.客户端中的页面禁止右键,复制等 <body scroll="no& ...
- 利用DIV+CSS制作网页过程中常用的基本概念及标签使用细节
CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...
- 设置与菜单项关联的Activity
有些时候,应用程序需要单击某个菜单项时启动其他Activity(包括其他Service).对于这种需求,Android设置不需要开发者编写任何事件处理代码,只要调用MenuItem的setIntent ...
- Java:网络编程
一.因特网地址 InetAddress类:实现主机名和因特网地址之间的转换. InetAddress address=InetAddress.getByName(String);返回一个InetAdd ...
- Spring JdbcTemplate用法整理
Spring JdbcTemplate用法整理: xml: <?xml version="1.0" encoding="UTF-8"?> <b ...
- Spring4.14 事务异常 NoUniqueBeanDefinitionException: No qualifying bean of type [....PlatformTransactionManager]
环境为Spring + Spring mvc + mybatis:其中Spring版本为4.1.4 spring配置文件: <?xml version="1.0" encod ...
- Eclipse格式化代码换行、删除空行
Java代码 Window-preference-Java-Code Style-Formatter|Edit...-Line Wrapping|Maximum line width: 修改一行最大长 ...