社区讨论

进食后入+疑问

P5904[POI 2014] HOT-Hotels 加强版参与者 5已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mm5kd8bq
此快照首次捕获于
2026/02/28 08:09
2 周前
此快照最后确认于
2026/03/01 20:45
上周
查看原帖
注意new分配数组时是没有初始化的,要在后面加个括号初始化为默认值
CPP
f[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;
}
(这是ac代码,把每个new的初始化去掉就是90pts的代码) AC记录 WA记录

回复

4 条回复,欢迎继续交流。

正在加载回复...