10月2日考试题解(待更新)

10月2日考试题解



$ T1 $ :

题意简述:

给一棵 $ n $ 个节点的树,点有非负权值,你需要找出两条点不相交的路径,使它们长度和最大。

$ n\le 10^5 $


$ solution: $

有直径的性质可知,最终两条路径只有两种情况:

  1. 两条路径其中一条为直径
  2. 两条路径都有一个端点为直径端点

于是我们两遍 $ DFS $ 找到一条直径,并记录这条直径。将这条直径标记(删掉),从直径的每个点开始向直径两边树型 $ DP $ ,找到从直径上每个点出发的最长链,以及不与直径相交的最长链(这个最长连和直径构成初始答案)。然后枚举直径上每一个点作为拐点(一条路径从这里离开直径),找到另一个最优的拐点,更新答案!


$ code: $

ll ans,tot;
int n,tt,rt,id,mx;
ll a[100005];
ll d[100005];
ll s[100005];
ll v[100005];
int t[100005];
bool vis[100005];

struct su{
    int to,next;
}b[200005];
int tou[100005],top;

inline void dfs(int i){ //找直径
    vis[i]=1; if(d[i]>d[mx]) mx=i;
    for(rg j=tou[i];j;j=b[j].next){
        rg to=b[j].to; if(vis[to])continue;
        d[to]=d[i]+a[to]; dfs(to);
    } vis[i]=0;
}

inline bool find(int i,int x){ //开栈记录最长链
    vis[i]=1; t[++tt]=i; if(i==x) return 1;
    for(rg j=tou[i];j;j=b[j].next){
        rg to=b[j].to; if(vis[to])continue;
        d[to]=d[i]+a[to]; if(find(to,x))return 1;
    } vis[i]=0; --tt; return 0; //vis数组会保留对直径的标记
}

inline void dp(int i){ //找到从每个点出发的最长链
    vis[i]=1; d[i]=0;
    for(rg j=tou[i];j;j=b[j].next){
        rg to=b[j].to; if(vis[to])continue;
        dp(to); tot=max(tot,d[to]+d[i]+a[i]); //tot记录不与直径交的最长链
        d[i]=max(d[i],d[to]);
    } vis[i]=0; d[i]+=a[i]; tot=max(tot,d[i]);
}

int main(){
    n=qr();
    for(rg i=1;i<=n;++i) a[i]=qr();
    for(rg i=1;i<n;++i){
        rg x=qr(),y=qr();
        b[++top]=su{y,tou[x]}; tou[x]=top;
        b[++top]=su{x,tou[y]}; tou[y]=top;
    } d[1]=a[1]; dfs(1); rt=mx; mx=0; //找直径端点
    d[rt]=a[rt]; dfs(rt); id=mx; mx=0; //找直径
    find(rt,id); //标记直径
    for(rg i=1;i<=tt;++i){
        rg x=t[i]; s[i]=d[x];
        for(rg j=tou[x];j;j=b[j].next){ //从直径每个点出发
            rg to=b[j].to; if(vis[to])continue;
            dp(to); v[i]=max(v[i],d[to]); //树型dp
        }
    }ans=tot+s[tt]; tot=0;
    for(rg i=1;i<=tt;++i){ //计算最终答案
        ans=max(ans,tot-s[i-1]+v[i]+s[tt]);
        tot=max(tot,s[i]+v[i]);
    }
    printf("%lld\n",ans);
    return 0;
}


$ T2 $ :

题意简述:


$ solution: $


$ code: $



$ T3 $ :

题意简述:


$ solution: $


$ code: $

原文地址:https://www.cnblogs.com/812-xiao-wen/p/11617670.html

时间: 2024-08-10 14:30:05

10月2日考试题解(待更新)的相关文章

3月21日考试 题解(数据结构+区间DP+贪心)

前言:T3写挂了,有点难受. --------------- T1 中位数 题意简述:给你一段长度为$n$的序列,分别输出$[1,2k-1]$的中位数$(2k-1\leq n)$. ------------- 其实正解是用两个堆分别为大根堆和小根堆.但我这里偷了个懒,直接由STL函数upper_bound二分查找插入数字(STL大法好 Code: #include<bits/stdc++.h> using namespace std; vector<int> v; int n; i

微信公众号智能绑定功能实现(2014年10月24日 更新)

微信公众号智能绑定功能实现(2014年10月24日 更新) 继微信企业号公布后,腾讯改动了公众号的接入方式,在之前的基础上加入了2个表单,之前版本号的智能绑定失效了! 在文章 微信公众号之智能绑定实现初始版本号  的基础上改动,新增腾讯这次添加的表单,本次新增的表单有: encoding_aeskey :EncodingAESKey(消息加解密密钥.长度43位!) callback_encrypt_mode: 消息加解密方式(0:明文模式.1:兼容模式.3:安全模式(推荐)) operation

10月28日 迅雷白金会员vip账号分享 91freevip 22:00更新

91freevip ,就要免费VIP网10月28日22:00 更新迅雷会员VIP账号: 迅雷vip账号399771799:1 密码 7757373迅雷vip账号547712294:1 密码 5515575迅雷vip账号shutiaogan:1 密码 3779737迅雷vip账号895722346:2 密码 7733399迅雷vip账号shuiyizhe:2 密码 1799379迅雷vip账号144745926:2 密码 3715951迅雷vip账号302895960:2 密码 3377179迅雷

10月8日至11月底考试安排

具体事项: 自考 2016年10月16日上午 思想道德修养与法律基础 2016年10月16日下午 办公室管理 2016年10月23日下午 企业管理概论 2016年11月19.20日考试 软考 2016年11月12日 CCF比赛 2016年11月12日截止 中止小说,德州扑克行为,全力解决以上问题

APICloud IDE 10月22日更新补丁:

APICloud   IDE  10月22日更新补丁:IDE自动更新方法:1.重启IDE2.点击更新图标 本次更新:1.解AJAX请求201状态码问题.转义字符兼容问题2.解滚动到底部事件多次回调,并与弹动冲突问题3.解监听事件中手势无法识别问题4.scanner模块:重复open偶现崩溃5.circularMenu模块:半径问题适配6.slider模块:添加lock接口7.timeSelector模块:ios界面修改 文档 case8.periodSelector模块:ios界面修改 文档 c

10月15日模拟赛题解

10月15日模拟赛题解 A 树 Description 给定一棵 \(n\) 个节点的树,每个节点有两个参数 \(a,~b\),对于每个节点,求子树中参数为 \(b\) 的所有节点的 \(a\) 之和 Limitations \(100\%\) \(1 \leq b \leq n \leq 10^5,~a \leq 1000\) \(60\%\) \(1 \leq b,n\leq 1000\) \(30\%\) \(1 \leq b, n \leq 10\) Solution 对于 \(30\%

10月18日随笔

1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<queue> 7 using namespace std; 8 typedef long long LL; 9 inline int read() 10 { 11 int x=0,f=1;char c=getchar

题目:《项目集管理标准(第三版)》发布会10月25日在京成功举办

作者:共创国际-项目管理者联盟   正文:   共创国际项目管理者联盟于2014年10月25日在电子工业出版社(华信大厦)举办了<项目集管理标准(第三版)>发布会.<项目集管理标准(第三版)>(中文版)由项目管理者联盟项目集管理研究中心翻译与审校,并由电子工业出版社出版.本次发布会的举办是项目集管理研究中心推广项目集管理三年多来的重要里程碑事件. 在来自PMI(中国).国家外国专家局培训中心.共创国际项目管理者联盟.电子工业出版社的多位领导与嘉宾的见证下,<项目集管理标准(第

[NOIP集训]10月19日

今天的文件夹:10月19日.zip 今天中午讲了一下昨天的题,还是有水平的. 下午复习搜索,居然有NOI难度的题,不过给了讲解,也有参考程序,就不多说了.主要说说第一题. T1:这是道BFS练手题,但都写不对.第一个难点是读入,虽然题目中给的读入顺序很吓人,但仔细想想,就类似于“字典序比较”了.在Pascal中可以直接这样读入: for i:=1 to l do for j:=1 to w do for k:=1 to h do read(a[i,j,k]); 读入之后,按照与读入相同的顺序进行