BZOJ4543: [POI2014] 호텔 강화판 긴 체인 해부
7028 단어 체인 분할dp트리 dpBZOJ 퀴즈 기록.
#include
#define gm 100005
using namespace std;
typedef long long ll;
inline ll* __alloc(size_t size)
{
static ll pool[gm<<2];
static ll* ptr=pool;
ll* res=ptr;ptr+=size;
return res;
}
struct e
{
int t;
e *n;
e(int t,e *n):t(t),n(n){}
}*p[gm];
int dep[gm],son[gm],len[gm],fa[gm];
ll *F[gm],*G[gm];
void dfs(int x)
{
son[x]=x;
for(e *i=p[x];i;i=i->n)
{
if(i->t==fa[x]) continue;
fa[i->t]=x;
dep[i->t]=dep[x]+1;
dfs(i->t);
if(dep[son[i->t]]>dep[son[x]]) son[x]=son[i->t];
}
len[x]=dep[son[x]]-dep[x]+1;
for(e *i=p[x];i;i=i->n)
{
if(i->t==fa[x]) continue;
if(son[i->t]!=son[x])
{
int y=son[i->t];
F[y]=__alloc(len[i->t])+len[i->t]-1;
G[y]=__alloc(len[i->t]<<1);
}
}
if(x==1)
{
int y=son[x];
F[y]=__alloc(len[x])+len[x]-1;
G[y]=__alloc(len[x]<<1);
}
}
ll ans=0;
void DP(int x)
{
ll *&f=F[x],*&g=G[x];
for(e *i=p[x];i;i=i->n)
{
if(i->t==fa[x]) continue;
DP(i->t);
if(son[x]==son[i->t])
{
f=F[i->t]-1;
g=G[i->t]+1;
}
}
ans+=g[0];
++f[0];
for(e *i=p[x];i;i=i->n)
{
if(i->t==fa[x]||son[i->t]==son[x]) continue;
ll *fs=F[i->t],*gs=G[i->t];
ans+=fs[0]*g[1];
for(int w=1;wt];++w)
ans+=fs[w]*g[w+1]+gs[w]*f[w-1];
g[1]+=fs[0]*f[1];
f[1]+=fs[0];
for(int w=1;wt];++w)
{
g[w+1]+=fs[w]*f[w+1];
g[w-1]+=gs[w];
f[w+1]+=fs[w];
}
}
}
int n;
int main()
{
scanf("%d",&n);
for(int i=1;iint u,v;
scanf("%d%d",&u,&v);
p[u]=new e(v,p[u]);
p[v]=new e(u,p[v]);
}
dfs(1);
DP(1);
printf("%lld
",ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
BZOJ4543: [POI2014] 호텔 강화판 긴 체인 해부나무 한 그루를 주고 몇 개의 삼원조가 두 개의 거리를 충족시키는지 물었다.n<=100000 긴 체인 분할 응용의 하나: o(n) 통계는 깊이를 아래로 표시한 합병 가능한 트리 정보가 현재 노드에 있음을 나타낸다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.