首页 > 其他分享 >NOIPTG联合权值

NOIPTG联合权值

时间:2023-10-10 14:11:32浏览次数:42  
标签:int max sum 权值 fa ans 联合 NOIPTG mod

P1351 [NOIP2014 提高组] 联合权值

image-20231010135928773

我们对于每个点计算它的子结点的 \(\sum w,\max w\)。

如图,发现贡献有三类:

  1. 直接计算。
  2. 需要剔除自己这个点,对于 sum 直接减去即可,对于 max 维护一个次大值,发现这个点是最大值用次大值代替。
  3. 枚举子节点,然后直接利用子节点的 \(\sum,\max\) 信息。

复杂度线性。(有点麻烦)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while

const int N=200010,M=2*N,mod=10007;
int n,w[N],mx[N],cm[N],f[N],ans_max,sum[N],ans_sum;
typedef long long ll;
int h[N],e[M],ne[M],idx;//don't forget memset h!
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
#define pls(a,b) (a+=b)>=mod&&(a-=mod)

void init(int x,int fa){
    f[x]=fa;
    Ed{
        int j=e[i];
        if(j==fa)continue;
        int var=w[j];
        pls(sum[x],var);
        if(var>=w[mx[x]])cm[x]=mx[x],mx[x]=j;
        else if(var>w[cm[x]])cm[x]=j;
        init(j,x);
    }
}
int max(int a,int b){
    // cout<<b<<'+';
    return a>b?a:b;
}
void dfs(int x){
    int gpa=f[f[x]];
    if(~gpa)
        pls(ans_sum,w[gpa]*w[x]%mod),
        ans_max=max(ans_max,w[gpa]*w[x]);
    int fa=f[x];
    if(~fa)pls(ans_sum,(sum[fa]-w[x]+mod)*w[x]%mod);
    ans_max=max(w[mx[fa]==x?cm[fa]:mx[fa]]*w[x],ans_max);
    Ed{
        int j=e[i];
        if(j==fa)continue;
        pls(ans_sum,sum[j]*w[x]%mod);
        ans_max=max(ans_max,w[mx[j]]*w[x]);
        dfs(j);
    }
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    memset(h,-1,n*4+4);
    E(i, n-1){
        int a,b;
        cin>>a>>b;
        add(a,b),add(b,a);
    }
    E(i, n)cin>>w[i];
    init(1,-1);
    // E(i, n)cout<<sum[i]<<' '<<mx[i]<<' '<<cm[i]<<'\n';
    dfs(1);
    cout<<ans_max<<' '<<ans_sum<<'\n';
    return 0;
}

标签:int,max,sum,权值,fa,ans,联合,NOIPTG,mod
From: https://www.cnblogs.com/wscqwq/p/17754535.html

相关文章

  • union联合体
    联合体只有一个成员,所以可以在一个联合体用不同的方式定义一个成员这一个成员站得内存都是一个内存联合体可以是匿名的也可以是有名字的structVector2{ floatx,y;};structVector4{ union{ struct{ floatx,y,z,w; }; struct{ Vector2a,b; }; ......
  • 首位中国大陆学者!周志华当选新任国际人工智能联合会(IJCAI)理事会主席
    TOP前言“TOP大学来了”小编按,8月25日,在IJCAI2023闭幕式上,IJCAI执行委员会宣布欧洲科学院外籍院士、南京大学周志华教授当选为新一届的国际人工智能联合会理事会(IJCAITrustee)主席。“TOP大学来了”小编按,8月25日,在澳门举行的IJCAI2023闭幕式上,IJCAI执行委员会宣布欧洲科学院外......
  • chisel安装和使用+联合体union的tagged属性+sv读取文件和显示+sv获取系统时间+vcs编译
    chisel安装和使用sbt:scalabuildtool,是scala的默认构建工具,配置文件是build.sbt。mill:一个新的java/scala构建工具,运行较快,与sbt可以共存,配置文件是build.sc。chisel的安装可以参考这篇文章。安装过程务必联网,而没有联网情况下的安装,按照其它的说明,如移动缓存文件等,并无法正常......
  • 权值线段树 学习笔记
    8月集训学了权值线段树,当时没怎么加强训练。国庆刚好开始有时间,巩固巩固。补上学习笔记。首先介绍权值树。其本质是一个记录每个数出现次数的线段树,也就是由桶建成的树。接下来介绍各种操作。1.插入。由于统计的是出现次数,从这个数往上依次加1即可。voidinsert(intx,int......
  • 华为再放大招!联合伙伴发布AI新人类,助力场景化大模型商用落地
    原创|文BFT机器人随着人工智能技术的不断发展,我们正迎来一个全新的智能时代。在这个时代里,人工智能将在各个领域发挥重要作用,为人类带来更智能、便捷和高效的生活体验。为了加速人工智能的商用落地,华为联合伙伴发布了系列AI新新人类,致力于推动场景化大模型的应用和发展。这一系......
  • 强强联合!天翼云与神州信息共助银行数字化转型升级!
    近日,天翼云与神州信息完成神州信息银行分布式核心系统与天翼云4.0云平台及TeleDB数据库的适配认证工作,标志着双方联合推出的“银行核心业务系统联合解决方案”生产环境投产成功。此次适配认证工作,是双方基于金融行业的监管要求,在银行的实际业务生产环境下,开展核心应用系统各项应......
  • 【转载】联合发布|面向眩晕诊疗的中文医疗对话大模型MedChat发布!
    原文地址:https://mp.weixin.qq.com/s/XrddDDpDXHKBcEueH8YXcA  =============================================  大连人工智能计算中心携手大连理工大学软件学院、大连市中心医院联合打造“MedChat:面向眩晕诊疗的中文医疗对话大模型”,于9月22日在昇腾AI开发者创享日......
  • VS2015 与 ctypes 联合编程
    Python使用的版本是3.7-32bit,使用 VS2015开发dll文件。 32bit要求VS编译工程的时候必须要选择使用的是x86或者是win32. 发现的问题:使用vs2015默认的dll项目模板,标注的是Windows通用的,生成的dll不可用,在Pycharm中报126的错误,网络上有提醒可以用De......
  • golang 有没有 类似 typescript 的 联合类型?
    Go语言(Golang)不像TypeScript那样直接支持联合类型(UnionTypes)。在TypeScript中,联合类型允许一个变量具有多个不同的数据类型,而在Go中,通常使用接口(interfaces)和具体类型来处理类似的情况。以下是在Go中处理联合类型的一些方法:使用接口:Go中的接口可以用于定义一组方法的契约,而不是特......
  • VS2015 QT5.9.4 联合编译报错:提示找不到rc.exe
    解决方案:参考链接1、在C:\ProgramFiles(x86)\WindowsKits\10\bin\10.0.19041.0\x64路径下,找到rc.exe和rcdll.dll两个文件,并复制;2、粘贴到MicrosoftVisualStudio14.0\VC\bin对应目录下;3、重新编译运行程序即可。......