社区讨论
进食后入+疑问
P5904[POI 2014] HOT-Hotels 加强版参与者 5已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mm5kd8bq
- 此快照首次捕获于
- 2026/02/28 08:09 2 周前
- 此快照最后确认于
- 2026/03/01 20:45 上周
注意new分配数组时是没有初始化的,要在后面加个括号初始化为默认值
CPPf[v]=new ll[len[v]]();
疑问是为什么我没有初始化有90pts...
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
vector<int>e[N];
int len[N],son[N];
void dfs1(int u,int fa){
len[u]=1;
for(int& v:e[u]){
if(v==fa)continue;
dfs1(v,u);
if(len[v]>len[son[u]]){
len[u]=len[v]+1;
son[u]=v;
}
}
}
ll ans=0;
ll *f[N],*g[N];
void tdp1(int u,int fa){
if(son[u]){
f[son[u]]=f[u]+1;
g[son[u]]=g[u]-1;
tdp1(son[u],u);
}
f[u][0]=1;ans+=g[u][0];
for(int& v:e[u]){
if(v==fa||v==son[u])continue;
f[v]=new ll[len[v]]();
g[v]=new ll[len[v]<<1]();
g[v]+=len[v];
tdp1(v,u);
for(int i=0;i<len[v];i++){
if(i)ans+=f[u][i-1]*g[v][i];
ans+=f[v][i]*g[u][i+1];
}
for(int i=0;i<len[v];i++){
g[u][i+1]+=f[u][i+1]*f[v][i];
if(i)g[u][i-1]+=g[v][i];
f[u][i+1]+=f[v][i];
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
int u,v;
for(int i=1;i<n;i++){
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1,0);
f[1]=new ll[len[1]]();
g[1]=new ll[len[1]<<1]();
g[1]+=len[1];
tdp1(1,0);
cout<<ans<<'\n';
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...