题意:

题解:
文科生误点进来我不负责!上一篇也是!
太弱了太弱了迟早要烷
观察不到性质,只会骗分。QAQ
我们可以很容易写出50分算法:设dp[i]dp[i]dp[i]表示以i为根的子树且i为其中一个小组的起点时的最大值。
很显然我们可以在整棵子树中枚举点v,维护从v往上走到达的点、WmaxW_{max}Wmax​和WminW_{min}Wmin​、u所有子树的dp值的和。
然后就可以dp了。

50分代码(想看正解的直接往下拉):

#include<cstdio>
#include<vector>
#include<algorithm>
#define maxn 100005
#define maxm 5005
#define LL long long
using namespace std;
int n,w[maxn],deg[maxn],minx[maxn],maxx[maxn],fa[maxn];
LL dp[maxn],sumch[maxn];
struct node { int v; node *nxt; } edge[maxn],*head[maxn],*ncnt;
vector<int> ch[maxm];
void addedge(int u,int v)
{ncnt++;ncnt->v=v,ncnt->nxt=head[u];head[u]=ncnt;
}
void solve1(int u)
{minx[u]=maxx[u]=w[u],fa[u]=u;for(node *p=head[u];p;p=p->nxt){int v=p->v;solve1(v);for(int i=0,siz=ch[v].size();i<siz;i++) ch[u].push_back(ch[v][i]);ch[u].push_back(v); sumch[u]+=dp[v];}for(int i=0,siz=ch[u].size();i<siz;i++){int v=ch[u][i];minx[v]=min(minx[v],w[u]),maxx[v]=max(maxx[v],w[u]);sumch[v]+=sumch[u]-dp[fa[v]],fa[v]=u;dp[u]=max(dp[u],sumch[v]+maxx[v]-minx[v]);}
}
int main()
{scanf("%d",&n); ncnt=&edge[0];for(int i=1;i<=n;i++) scanf("%d",&w[i]);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v); deg[u]++;}if(n<=5000) solve1(1);printf("%lld\n",dp[1]);
}

然而我说了这是50%算法。
满分算法需要get到一个性质:每一条链的值应该是单调的。
感性认识:如果在a到b之间不单调,那么b后面那些数就没有贡献,完全可以把a和b断掉。
然而我觉得就算我发现了这个性质我也想不到下面的东西
于是我们可以令f[u][0/1]f[u][0/1]f[u][0/1]表示以u为根的子树,它为顶点的链不减/不增时的最大值。然后dp[u]=max⁡{f[u][0],f[u][1]}dp[u]=\max\{f[u][0],f[u][1]\}dp[u]=max{f[u][0],f[u][1]}即可。
至于如何求f?见代码啊QWQ
当w[v]&gt;=w[u]w[v]&gt;=w[u]w[v]>=w[u],那么就是这条链不减,f[u][0]=max⁡{f[u][0],sum−dp[v]+f[v][0]+w[v]−w[u]}f[u][0]=\max\{f[u][0],sum-dp[v]+f[v][0]+w[v]-w[u]\}f[u][0]=max{f[u][0],sum−dp[v]+f[v][0]+w[v]−w[u]}。不用算整条链的原因是中间的f值已经减去w[v]。可参考求数列通项的累加法
反之同理。

代码:

#include<cstdio>
#include<vector>
#include<algorithm>
#define maxn 100005
#define maxm 5005
#define LL long long
using namespace std;
int n,w[maxn],deg[maxn],minx[maxn],maxx[maxn],pos[maxn],fa[maxn],dep[maxn];
LL dp[maxn],f[maxn][2],sumch[maxn];
struct node { int v; node *nxt; } edge[maxn],*head[maxn],*ncnt;
vector<int> ch[maxm];
void addedge(int u,int v)
{ncnt++;ncnt->v=v,ncnt->nxt=head[u];head[u]=ncnt;
}
void solve1(int u)
{for(node *p=head[u];p;p=p->nxt){int v=p->v; solve1(v);sumch[u]+=dp[v];}f[u][0]=f[u][1]=sumch[u];for(node *p=head[u];p;p=p->nxt){int v=p->v;if(w[v]>=w[u]) f[u][0]=max(f[v][0]+sumch[u]-dp[v]+w[v]-w[u],f[u][0]);if(w[v]<=w[u]) f[u][1]=max(f[v][1]+sumch[u]-dp[v]+w[u]-w[v],f[u][1]);}dp[u]=max(f[u][0],f[u][1]);
}
int main()
{scanf("%d",&n); ncnt=&edge[0];for(int i=1;i<=n;i++) { scanf("%d",&w[i]); pos[i]=i; }for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v); deg[u]++,fa[v]=u;}solve1(1);printf("%lld\n",dp[1]);
}

20190105 东非大裂谷相关推荐

  1. 我要是长得和姚明一样高,是不是也能打进NBA?

    他出生时体重达5公斤,几乎是新生儿平均水平的2倍.他的父亲和祖父的身高都在2米以上.他的父母都曾是篮球运动员.小学五年级时,他的身高就超过了1.8米.他是第一个通过"选秀"进入NB ...

  2. NOIP 2018 普及组 解题报告

    比完小结 今年的题目出的有点诡异,难度跨越有点大 入门 to 普及- to(注意:前方东非大裂谷,请小心慢行) 提高+/省选- to 提高+/省选- 不过实际上没有这么难 T3.T4 一个DP 一个暴 ...

  3. Vijos——T 1082 丛林探险

    https://vijos.org/p/1082 描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,B ...

  4. 地球上这10个奇幻景观,带你踏入外太空

    全世界只有3.14 % 的人关注了 爆炸吧知识 大蓝洞 大蓝洞是灯塔礁的一部分,位于洪都拉斯伯利兹城陆地大约100公里之遥,是一个较大的完美环状海洋深洞,是当今世界最吸引人的潜水地点之一. 305米的 ...

  5. 美国签证过不了,ICLR 2020搬到埃塞俄比亚,同性恋学者:不去,保命要紧

    郭一璞 发自 北境凛冬  量子位 报道 | 公众号 QbitAI 美国签证真是越来越难搞了,尤其在川普上台后,签证没过已经成为了阻挠广大地球人民读书.学习.旅游.炼丹--的最大理由. 于是,Yoshu ...

  6. 忘了她,就像忘了一朵花

    忘了她,就像忘了一朵花 忘了她就像忘了一朵花 就像忘了哭过的青春 笑过的年华 忘了她就像忘了一幅画 就像忘了依偎的清晨 醉过的晚霞 时光慢慢如流沙 一转眼她在天涯我在天涯 不是说放下就可以放下 再回首 ...

  7. 中世纪开始在英语里也用作Affrike指非洲

    非洲 (世界七大洲之一) 百度百科 外文名称:Africa 别名:Affrike 非洲(拉丁文:Africa),全称阿非利加洲,位于东半球西部,欧洲以南,亚洲之西,东濒印度洋,西临大西洋,纵跨赤道南北 ...

  8. Everyday English(四)

    太平洋 Pacific 南北长约15900千米.东西最大宽度约19900千米.面积17968万平方千米.占世界海洋面积的48%,占地球面积的35%.是四大洋中最大^最深和岛屿\珊瑚礁最多的海洋.太平洋 ...

  9. 英语affrike非洲affrike单词

    中文名称阿非利加洲(全称) 外文名称Africa 别    名Affrike 行政区类别洲 下辖地区北非.东非.西非.中非.南非 地理位置东濒印度洋,西临大西洋,北至地中海,南至好望角 面    积3 ...

  10. Nosql - redis 的学习

    redis: 是非关系型数据库--- 性能优秀,吞吐量 能达到 10万条/s  为什么性能这么好的:   redis是直接操作内存的 redis是单线程执行的,减少线程竞争与资源的占用(IO多路复用) ...

最新文章

  1. leetcode 287. 寻找重复数(Find the Duplicate Number)
  2. MonkeyRunner在Windows下的Eclipse开发环境搭建步骤(兼解决网上Jython配置出错的问题)...
  3. hdu 1106 排序
  4. 小说不“好看”,读者就给你“好看”
  5. svn服务器如何扫描文件,基于文件仓库进行建模协作(EA+SVN)
  6. π里包含了所有可能的数字组合吗?
  7. a33 linux内核启动网卡,a33核心板启动问题 - nevermore1981的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. div中文字,图片居中对齐,兼容FF、IE
  9. STL和C++标准库
  10. linux科学计算器设计,课内资源 - Linux环境下的多项式计算器的实现
  11. SAP License:飘在SAP日子之二-售前的产生与发展
  12. 地理空间数据Geometry在MySQL中使用(一)
  13. 网站前端和后台性能优化22
  14. UVA - 10603 Fill(隐式图搜索)
  15. echart柱状图即显示数值,又显示百分比
  16. 计算机控制的仓库定位系统,(边江文档教材)智能立体仓库物品定位的plc自动控制系统.doc...
  17. 最小生成树求最大比率 UVALive - 5713
  18. 进击的开发者!第二期SWTC社区开发者大赛拉开序幕
  19. oracle中间人投毒漏洞,ORACLE远程投毒漏洞修复(RAC环境)
  20. GrabCut python实现

热门文章

  1. 机器视觉:高动态范围图像
  2. jQuery获取兄弟元素
  3. 复习JQuery validate验证规则
  4. dwcs6 mysql站点_在Dreamweaver CS6中如何新建站点的方法
  5. 挥发性有机物TVOC、VOC、VOCS气体检测+解决方案
  6. 计算机怎么切换到音乐,win10系统如何快速切换到下一首歌曲?
  7. 工作缺点和不足及措施_个人工作问题不足20条以及改进措施
  8. 针对五款IPA文件安装工具的深度评测
  9. 用Tableau制作10种漂亮的饼图
  10. 【项目技术点总结之二】微信小程序中集成antvF2进行图表开发