bzoj1023 [SHOI2008]cactus 선인장 그림 트리 DP+ 단조로운 대기열
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e5+5;
const int M=5e6+5;
int n,m;
int a[N],head[N],next[M],go[M];
int low[N],dfn[N],vis[N],sta[N],tot,cnt;
int fa[N],dep[N],f[N],q[N],ans;
int read()
{
int x=0;char ch=getchar();
while (ch<'0'||ch>'9')ch=getchar();
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
inline void add(int x,int y)
{
go[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
inline void dp(int x,int y)
{
int tot=dep[y]-dep[x]+1;
int t=1,w=1;
for(int i=y;i!=x;i=fa[i])a[tot--]=f[i];
a[1]=f[x];tot=dep[y]-dep[x]+1;
q[1]=1;
fo(i,1,tot)a[i+tot]=a[i];
fo(i,2,2*tot)
{
if (i-q[t]>tot/2)t++;
ans=max(ans,a[i]+i+a[q[t]]-q[t]);
while (t<=w&&a[i]-i>=a[q[w]]-q[w])w--;
q[++w]=i;
}
fo(i,2,tot)f[x]=max(f[x],a[i]+min(i-1,tot-i+1));
}
inline void dfs(int x)
{
dfn[x]=low[x]=++cnt;
for(int i=head[x];i;i=next[i])
{
int v=go[i];
if (v==fa[x])continue;
if (!dfn[v])
{
fa[v]=x;
dep[v]=dep[x]+1;
dfs(v);
}
low[x]=min(low[x],low[v]);
if (low[v]>dfn[x])
ans=max(ans,f[v]+f[x]+1),f[x]=max(f[x],f[v]+1);
}
for(int i=head[x];i;i=next[i])
{
int v=go[i];
if (dfn[v]>dfn[x]&&fa[v]!=x)dp(x,v);
}
}
int main()
{
n=read(),m=read();
fo(i,1,m)
{
int s=read(),last=0,x;
fo(j,1,s)
{
x=read();
if (last)add(last,x),add(x,last);
last=x;
}
}
dfs(1);
printf("%d
",ans);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
bzoj1010 장난감 포장 [결정 단조성 최적화 dp]하나의 모범 문제라고 할 수 있다.우리는 먼저 소박한 dp방정식을 얻을 수 있다. f[i]=min(f[j]+w(j,i)),j∈[0,i). w(j,i)는 j+1~i를 포장하여 운송하는 비용의 시간 복잡도는 O(n2)라...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.