首页 > 其他分享 >P1351 [NOIP2014 提高组] 联合权值

P1351 [NOIP2014 提高组] 联合权值

时间:2024-07-31 16:56:03浏览次数:13  
标签:NOIP2014 val int MAX sum 权值 ans P1351

原题链接

题解

树形dp的想法,递归返回的是子树的最大联合权值以及联合权值之和。

首先,根据题目意思可以知晓该无向图构成的是一棵树。

由树形dp的遍历可知,当我们来到 root结点时,其所有孩子结点的子树 最大联合权值 和 联合权值之和 都已经知晓,我们只需要对其取 max 和 累加 即可。

but,上面是以root结点为中转结点的情况,所以我们还要考虑root结点与 其父节点的父节点 相连形成的联合权值的情况,进行特判即可。

code

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const ll mod=10007;
ll head[N],Next[N<<1],to[N<<1],w[N],cnt=1;
struct node{
    ll MAX_val,sum;
    node(ll MAX_val,ll sum): MAX_val(MAX_val),sum(sum){}
};

void build(int from,int to_){
    Next[cnt]=head[from];
    to[cnt]=to_;
    head[from]=cnt++;
}

node dfs(int root,int f,int g){
    int more=w[root]*w[g]*2;
    node ans(more/2,0);
    ans.sum=(ans.sum+more)%mod;
     
    node x(0,0);
    ll max1=0,max2=0,val=0,power=0;
    for (int i=head[root];i>0;i=Next[i]){
        if (to[i]==f) continue;
        val+=w[to[i]];
        power+=w[to[i]]*w[to[i]];
        x=dfs(int(to[i]),root,f);
        ans.sum=(ans.sum+x.sum)%mod;
        ans.MAX_val=max(ans.MAX_val,x.MAX_val);
        if (w[to[i]]>max1) max1=w[to[i]];
        else if (w[to[i]]>max2) max2=w[to[i]];
    }
    if (max1*max2>ans.MAX_val)
        ans.MAX_val=max1*max2;
    ans.sum=(ans.sum+val*val-power)%mod;
    
    return ans;
}

int main(){
    int n;
    cin>>n;
    for (int i=1,u,v;i<n;i++){
        cin>>u>>v;
        build(u,v);
        build(v,u);
    }
    for (int i=1;i<=n;i++) cin>>w[i];
    
    node x=dfs(1,0,0);
    cout<<x.MAX_val<<" "<<x.sum<<endl;
    return 0;
}

 

标签:NOIP2014,val,int,MAX,sum,权值,ans,P1351
From: https://www.cnblogs.com/purple123/p/18334992

相关文章

  • OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024
    随着预训练视觉模型的兴起,目前流行的视觉微调方法是完全微调。由于微调只专注于拟合下游训练集,因此存在知识遗忘的问题。论文提出了基于权值回滚的微调方法OLOR(OnestepLearning,OnestepReview),把权值回滚项合并到优化器的权值更新项中。这保证了上下游模型权值范围的一致性,有......
  • [NOIP2014] 解方程
    思路首先我们可以观察到\(n\)和\(m\)与\(a_i\)相比小的很多,所以我们可以考虑直接暴力求解但是\(a_i\)太大了,所以如果需要直接计算的话需要全程使用高精度算法。因为高精度算法代码量有大速度又慢我们可依考虑将\(a_i\)转化为一个极大的指数取模的结果,因为只有是模数的......
  • 中位数(权值线段树版)
    中位数题目描述给定一个长度为NNN的非负整数序列AAA,对于前奇数......
  • P2239 [NOIP2014 普及组] 螺旋矩阵
    洛谷题面:题目分析本题需要一个旋转的数字矩阵,因为填数要求,首先考虑DFS。注意写题目时,一定一定要注意数据范围!在此题中,注意数据范围对于 50%的数据,1⩽......
  • [学习笔记] 动态开点权值线段树合并 - 数据结构
    权值线段树例题【模板】普通平衡树#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+1;intn,val[N],opt[N],num[N],cnt,len,san[N],m[N],rnk[N];unordered_map<int,int>dfn;structWeightedSegmentTree{ #definels(id<<1) #define......
  • # [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    传送锚点:https://www.luogu.com.cn/problem/P1328题目背景NOIP2014提高组D1T1题目描述石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。升级版游戏在传统的石头......
  • 【NOIP2014普及组复赛】题4:子矩阵
    题3:子矩阵【题目描述】给出如下定义:1.子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。例如,下面左图中选取第2、......
  • 【NOIP2014普及组复赛】题3:螺旋矩阵
    题3:螺旋矩阵【题目描述】一个nnn行nnn列的螺旋矩阵可由如下方......
  • hdu4417(权值离散化后建立主席树)
    Problem-4417(hdu.edu.cn)马里奥是举世闻名的水管工。他“魁梧”的身材和惊人的跳跃能力让我们想起了。现在可怜的公主又遇到了麻烦,马里奥需要拯救他的爱人。我们将通往老板城堡的道路视为一条线(长度为n),在每个整数点i上都有一块高度为hi的砖。现在的问题是,如果马里奥可......
  • [蓝桥杯 2019 省赛 AB] 完全二叉树的权值
    #[蓝桥杯2019省AB]完全二叉树的权值##题目描述给定一棵包含$N$个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是$A_1,A_2,\cdotsA_N$,如下图所示:现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有......