首页 > 其他分享 >P6554题解

P6554题解

时间:2024-01-19 15:34:11浏览次数:35  
标签:ch Lef int 题解 Modified P6554

P6554 Promises I Can't Keep

题目传送门

题解

看题解都有些做烦了,就来发一篇。

换根 dp。第一遍 dfs 处理出 \(Lef_u\) 表示 \(u\) 子树内的叶子个数(包含自己),然后求出以 \(1\) 为根时的答案 \(\sum Lef_u*val_u\),注意特判根为叶子的情况。

第二遍 dfs 大力换根就好了,从根 \(u\) 换到根 \(v\) 时真正有变化的只有 \(Lef_u\) 和 \(Lef_v\),于是可以直接修改再回溯,同步更新从根到所有叶子的权值和,然后对于每一个根,答案就是好计算的。

代码:

/*
 * @Author: operator_ 
 * @Date: 2023-11-23 08:55:31 
 * @Last Modified by: operator_
 * @Last Modified time: 2023-11-23 09:34:33
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd() {
    int s=0,m=0;char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
    while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
    return m?-s:s;
}
int n,a[500005],d[500005],Lef[500005],Sl,f[500005],Sum;
double Ans=-1e12;
int h[500005],Cnt;
struct Graph {int u,v,Nxt;} e[1000005];
void Add(int u,int v) {e[++Cnt]={u,v,h[u]},h[u]=Cnt;}
void Dfs1(int u,int p) {
    if(d[u]==1) Lef[u]=1;
    for(int i=h[u];i;i=e[i].Nxt) {
        int v=e[i].v;
        if(v==p) continue;
        Dfs1(v,u);
        Lef[u]+=Lef[v];
    }
    Sum+=Lef[u]*a[u];
}
void Dfs2(int u,int p) {
    if(d[u]==1) Ans=max(Ans,(Sum-a[u])*1.0/(Sl-1));
    else Ans=max(Ans,Sum*1.0/Sl);
    for(int i=h[u];i;i=e[i].Nxt) {
        int v=e[i].v;
        if(v==p) continue;
        Sum-=Lef[u]*a[u]+Lef[v]*a[v];
        Lef[u]=Sl-Lef[v];
        Lef[v]=Sl;
        Sum+=Lef[u]*a[u]+Lef[v]*a[v];
        Dfs2(v,u);
        Sum-=Lef[u]*a[u]+Lef[v]*a[v];
        Lef[v]=Sl-Lef[u];
        Lef[u]=Sl;
        Sum+=Lef[u]*a[u]+Lef[v]*a[v];
    }
}
signed main(){
    cin>>n;
    for(int i=1;i<n;i++) {
        int u=rd(),v=rd();
        Add(u,v),Add(v,u);
        d[u]++,d[v]++;
    }
    for(int i=1;i<=n;i++)
        a[i]=rd();
    Dfs1(1,0);
    Sl=Lef[1];
    Dfs2(1,0);
    printf("%.4lf",Ans);
    return 0;
}

标签:ch,Lef,int,题解,Modified,P6554
From: https://www.cnblogs.com/operator-/p/17974769

相关文章

  • P9744题解
    P9744「KDOI-06-S」消除序列题目传送门题解记错时间错过模拟赛的sb来也。题目中的最关键信息就是\(a_i,b_i,c_i\ge0\),这意味着多做无用的操作一定不优,所以有:结论\(1\):优先进行\(1\)操作。这是因为我们不管我们在\(1\)操作前做什么操作都会被其推平覆盖,是无用操......
  • P8047题解
    P8047[COCI2015-2016#4]GALAKSIJA题目传送门题解显然是要删边变加边的,然后联通性也是显然要用并查集维护的,就是路径异或和需要一个数据结构来维护。发现:加边删边不影响两个点的路径异或和。所以我们可以处理出每个点到\(1\)号节点的路径异或和\(d\),于是\(Path_{u,v}=d_u......
  • P8034题解
    P8034[COCI2015-2016#7]Ozljeda题目传送门题解评橙差不多了。手玩一下样例,很容易发现\(x\)的循环节为\(K+1\),每一段分别为\(a_1,a_2,a_3,\dots,a_K,\bigoplus_{i=1}^Ka_i\)这几项,然后恰好循环节的异或值为\(0\),所以就可以直接维护前缀异或值,然后取模求答案。代码:#i......
  • [AGC048D] Pocky Game 题解
    题目链接点击打开链接题目解法好难的题,想不出来一点!!!首先给出一个第一个结论:最优策略下,每个人每次只会取一个石子或者取完一堆石子题解区都没有严谨证明,\(at\)的\(editorial\)也没证,所以我只能感性理解:下面以先手为例。如果最左边的石子数\(>\)其余所有堆的石子数,那么先......
  • 题解 WD与数列
    P5161WD与数列可以想到原条件是一个差分形式,所以我们对原数组差分。然后发现答案其实就是\(\sum_{i<j}\min(lcp(i+1,j+1)+1,j-i)\)。这个东西先跑SA,然后建笛卡尔树。考虑对于一个区间,其值为\(x\)。那么相当于是求\(\sum_{l\inS,r\inT}\min(|sa_{l}-sa_{r}|,x)\)。笛......
  • AT_arc115_b [ARC115B] Plus Matrix 题解
    AT_arc115_b[ARC115B]PlusMatrix题解题意给定矩阵\(C_{n\timesn}\),求两个数列\(A_n,B_n\),使得\(C_{i,j}=A_i+B_j\)。分析画出一个表格来:213243502131324可以看出来,对于任意一列\(j\),\(C_{*,j}\)都存在有\(B_j\)的贡献。那么我们......
  • ELK之Filebeat自动断开问题解决
     自动断开命令 解决自动断开命令nohup./filebeat-e-cfilebeat.yml>./filebeat.log 2>&1& disown 其他的方式(目前我没有使用) 在linux操作系统/etc/systemd/system目录下创建一个filebeat.service文件,写入如下内容需要注意替换文件的位置以及版本[Unit]D......
  • GDKOI 2024 题解
    鸽了一些题。匹配先抽出来一个完美匹配,然后尝试调整。调整相当于:找一个偶环,满足匹配的边和未匹配的边交错,且偶环的总异或和为\(0\),是不是写个暴力就好了?发现冲过去了,很牛逼,复杂度\(O(n^3)\)(?),Code。不休陀螺一个区间可以被打出的条件是:令\(\Delta_i=b_i-a_i\),则\(x=\sum......
  • P2580 于是他错误的点名开始了题解
    “普及/提高-”这个难度很有意思。说明这题可能需要用到提高组当中比较基础的内容。它的名字叫做map。map,其实相当于一个超大数组,但它真实的作用是:映射。比如a[7]=5;就是用a数组把7和5关联了起来,这个操作就叫映射。map这东西NB的地方在于,它能这么写:score["Leo201......
  • P9012 [USACO23JAN] Moo Operations B题解
    第1道赛场AC的题,必须发篇题解记录一下。Tips:\(1\le|S|\le100\)——题目才100,这就可以随便整活了。如果你稍微懂点英语,就会知道第\(2\sim4\)个点的\(S\)都最多只有\(3\)个字符,而目标“MOO”也是\(3\)个字符,所以只需要模拟就可以了。intcheck(string......