20190105 东非大裂谷
题意:
题解:
文科生误点进来我不负责!上一篇也是!
太弱了太弱了迟早要烷
观察不到性质,只会骗分。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]>=w[u]w[v]>=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 东非大裂谷相关推荐
- 我要是长得和姚明一样高,是不是也能打进NBA?
他出生时体重达5公斤,几乎是新生儿平均水平的2倍.他的父亲和祖父的身高都在2米以上.他的父母都曾是篮球运动员.小学五年级时,他的身高就超过了1.8米.他是第一个通过"选秀"进入NB ...
- NOIP 2018 普及组 解题报告
比完小结 今年的题目出的有点诡异,难度跨越有点大 入门 to 普及- to(注意:前方东非大裂谷,请小心慢行) 提高+/省选- to 提高+/省选- 不过实际上没有这么难 T3.T4 一个DP 一个暴 ...
- Vijos——T 1082 丛林探险
https://vijos.org/p/1082 描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,B ...
- 地球上这10个奇幻景观,带你踏入外太空
全世界只有3.14 % 的人关注了 爆炸吧知识 大蓝洞 大蓝洞是灯塔礁的一部分,位于洪都拉斯伯利兹城陆地大约100公里之遥,是一个较大的完美环状海洋深洞,是当今世界最吸引人的潜水地点之一. 305米的 ...
- 美国签证过不了,ICLR 2020搬到埃塞俄比亚,同性恋学者:不去,保命要紧
郭一璞 发自 北境凛冬 量子位 报道 | 公众号 QbitAI 美国签证真是越来越难搞了,尤其在川普上台后,签证没过已经成为了阻挠广大地球人民读书.学习.旅游.炼丹--的最大理由. 于是,Yoshu ...
- 忘了她,就像忘了一朵花
忘了她,就像忘了一朵花 忘了她就像忘了一朵花 就像忘了哭过的青春 笑过的年华 忘了她就像忘了一幅画 就像忘了依偎的清晨 醉过的晚霞 时光慢慢如流沙 一转眼她在天涯我在天涯 不是说放下就可以放下 再回首 ...
- 中世纪开始在英语里也用作Affrike指非洲
非洲 (世界七大洲之一) 百度百科 外文名称:Africa 别名:Affrike 非洲(拉丁文:Africa),全称阿非利加洲,位于东半球西部,欧洲以南,亚洲之西,东濒印度洋,西临大西洋,纵跨赤道南北 ...
- Everyday English(四)
太平洋 Pacific 南北长约15900千米.东西最大宽度约19900千米.面积17968万平方千米.占世界海洋面积的48%,占地球面积的35%.是四大洋中最大^最深和岛屿\珊瑚礁最多的海洋.太平洋 ...
- 英语affrike非洲affrike单词
中文名称阿非利加洲(全称) 外文名称Africa 别 名Affrike 行政区类别洲 下辖地区北非.东非.西非.中非.南非 地理位置东濒印度洋,西临大西洋,北至地中海,南至好望角 面 积3 ...
- Nosql - redis 的学习
redis: 是非关系型数据库--- 性能优秀,吞吐量 能达到 10万条/s 为什么性能这么好的: redis是直接操作内存的 redis是单线程执行的,减少线程竞争与资源的占用(IO多路复用) ...
最新文章
- leetcode 287. 寻找重复数(Find the Duplicate Number)
- MonkeyRunner在Windows下的Eclipse开发环境搭建步骤(兼解决网上Jython配置出错的问题)...
- hdu 1106 排序
- 小说不“好看”,读者就给你“好看”
- svn服务器如何扫描文件,基于文件仓库进行建模协作(EA+SVN)
- π里包含了所有可能的数字组合吗?
- a33 linux内核启动网卡,a33核心板启动问题 - nevermore1981的个人空间 - OSCHINA - 中文开源技术交流社区...
- div中文字,图片居中对齐,兼容FF、IE
- STL和C++标准库
- linux科学计算器设计,课内资源 - Linux环境下的多项式计算器的实现
- SAP License:飘在SAP日子之二-售前的产生与发展
- 地理空间数据Geometry在MySQL中使用(一)
- 网站前端和后台性能优化22
- UVA - 10603 Fill(隐式图搜索)
- echart柱状图即显示数值,又显示百分比
- 计算机控制的仓库定位系统,(边江文档教材)智能立体仓库物品定位的plc自动控制系统.doc...
- 最小生成树求最大比率 UVALive - 5713
- 进击的开发者!第二期SWTC社区开发者大赛拉开序幕
- oracle中间人投毒漏洞,ORACLE远程投毒漏洞修复(RAC环境)
- GrabCut python实现