这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= =

然后,看到这种题,首先必须的就是缩点= =

缩点完之后呢,变成在树上找最长路了= =直接树形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+单调队列优化)的更多相关文章

  1. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)

    题目链接 类似求树的直径,可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链.次长链,用每个点子节点不同子树的 max{最长链}+max{次长链} 更新答案.(不需要存次长链,求解过 ...

  2. bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][ ...

  3. bzoj 1023: [SHOI2008]cactus仙人掌图

    这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...

  4. bzoj 1023: [SHOI2008]cactus仙人掌图【tarjan+dp+单调队列】

    本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点 ...

  5. 1023: [SHOI2008]cactus仙人掌图 - BZOJ

    Description如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路 ...

  6. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  7. bzoj 1023: [SHOI2008]cactus仙人掌图 2125: 最短路 4728: 挪威的森林 静态仙人掌上路径长度的维护系列

    %%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 ...

  8. 【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树)

    [题意]给定仙人掌图(每条边至多在一个简单环上),求直径(最长的点对最短路径).n<=50000,m<=10^7. [算法]DFS树处理仙人掌 [题解]参考:仙人掌相关问题的处理方法(未完 ...

  9. [BZOJ1023][SHOI2008]cactus仙人掌图 DP

    题目链接 套路就是先考虑一般的树上做法.求直径的dp的做法大家应该都会吧. 那么设\(dp[i]\)表示\(i\)的子树中的点到\(i\)的最大距离. 在dp的过程中 \[ ans=\max\{dp[ ...

随机推荐

  1. css--用户体验笔记及兼容记录

    css用户体验 1.HTML的< >&"©分别是<,>,&,",©;的转义字符 2.IE8和7的透明度 filter: progid:DXI ...

  2. cocos2d-x介绍

    总体来说,cocos2d-x是一个优秀的库. Cocos2d-x没有很复杂的一个架构,基本上是一些以单件形式提供的管理器和是一些围绕SceneGraph(CCNode及其派生类)展开的类.这个设计使得 ...

  3. 在ubuntu中为navicat创建快捷方式

    在ubuntu中,解压navicat并不会生成快捷方式,每次运行都需要进入软件解压的目录,然后运行命令开启navicat,十分不便.今天尝试引入快捷方式,直接双击运行,感觉挺不错. 首先下载一个合适的 ...

  4. 阿里云安装wordpress遇到的问题

    在阿里云服务器上安装Nginx,php5.3.3环境,使用阿里云的RDS数据库 1,安装wordpress,提示您的PHP似乎没有安装运行WordPress所必需的MySQL扩展 解决方案:移除已经安 ...

  5. Hao Yin Jian 寒假第一周

    题目链接:https://vjudge.net/contest/147561#problem/A 题意:除法运算,abcde / fghij = n,从小到大输出,其中abcdefghij为0~9的不 ...

  6. centos 6 下编译安装 nginx

    下载nginx源码包,可以到nginx官方的下载文件归档里 http://nginx.org/download/ 下载 下载pcre源码,并编译安装,从pcre官方下载  ftp://ftp.csx. ...

  7. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  8. 读jQuery之二十(Deferred对象)

    Deferred对象是由$.Deferred构造的,$.Deferred被实现为简单工厂模式. 它用来解决JS中的异步编程,它遵循 Common Promise/A 规范.实现此规范的还有 when. ...

  9. HDU-1995-汉诺塔V

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1995 这题不知道该说水还是不水,对于这题我看到题目数据,就有了想法,因为题目数据给的好 所以我直接 假 ...

  10. Objective-C 关于静态方法与实例方法的转载

    objective-c中非常重要的语法知识,在此归纳总结一下. 类方法,也称静态方法,指的是用static关键字修饰的方法.此方法属类本身的方法,不属于类的某一个实例(对象).类方法中不可直接使用实例 ...