Solution -「CF 1303G」Sum of Prefix Sums
Description
Link.
对于一棵树,选出一条链 \((u,v)\),把链上结点从 \(u\) 到 \(v\) 放成一个 长度 \(l\) 的数组,使得 \(\sum_{i=1}^{l}\sum_{j=1}^{i}a_{j}\) 最大,\(a\) 是点权。
Solution
可以发现那个式子等价于 \(\sum_{i=1}^{l}ia_{i}\)。
考虑点分,设当前根为 \(x\)。选出来的 \(u,v\) 一定是叶子(点权为正),因为没有什么本质差别,所以可以一起算。我们把 \(x\) 在 \((u,v)\) 中的位置记作 \(o\),\((u,v)\) 的权值就为 \(\sum_{i=1}^{l}ia_{i}=\sum_{i=1}^{o}ia_{i}+l\sum_{i=o+1}^{l}a_{i}+\sum_{i=o+1}^{l}(i-l)a_{i}\),这是个一次函数,令 \(b_{1}=\sum_{i=1}^{l}ia_{i}=\sum_{i=1}^{o}ia_{i},b_{2}=\sum_{i=o+1}^{l}(i-l)a_{i},k=l\),得 \(\sum_{i=1}^{l}ia_{i}=k\times\sum_{i=o+1}^{l}a_{i}+b_{1}+b_{2}\)。
#include<bits/stdc++.h>
typedef long long ll;
#define sf(x) scanf("%d",&x)
#define ssf(x) scanf("%lld",&x)
struct Line {
ll k,b;
Line():k(0),b(0){}
Line(ll _k,ll _b):k(_k),b(_b){}
}lns[10000010];
std::vector<int> G[200010];
ll a[200010],ans,stk[6][200010];
// stk[0]: sum(i=1~l)i*a[i]
// stk[1]: sum(i=o+1~l)(i-l)*a[i]
// stk[2]: sum(i=o+1~l)a[i]
// stk[3]: all the nodes we passed and possible to be the final node
// stk[4]: l
// stk[5]: where to belong to
int n,szf[200010],tot,tr[800010],top,rt,del[200010],siz[200010],mxdep,dep[200010];
ll ff(ll x,int i){return lns[i].k*x+lns[i].b;}
ll getk(int i){return lns[i].k;}
bool chk(ll x,int i,int j){return ff(x,i)>ff(x,j);}
void ins(int l,int r,int now,int t)
{
if(l^r)
{
if(chk(l,t,tr[now]) && chk(r,t,tr[now])) tr[now]=t;
else if(chk(l,t,tr[now]) || chk(r,t,tr[now]))
{
int mid=(l+r)>>1;
if(chk(mid,t,tr[now])) tr[now]^=t^=tr[now]^=t;
if(chk(l,t,tr[now])) ins(l,mid,now<<1,t);
else ins(mid+1,r,now<<1|1,t);
}
}
else if(chk(l,t,tr[now])) tr[now]=t;
}
int find(int l,int r,int now,int t) // query line id
{
if(l^r)
{
int mid=(l+r)>>1,res;
if(mid>=t) res=find(l,mid,now<<1,t);
else res=find(mid+1,r,now<<1|1,t);
if(chk(t,res,tr[now])) return res;
else return tr[now];
}
else return tr[now];
}
void clear(int l,int r,int now)
{
int mid=(l+r)>>1;
tr[now]=0;
if(l^r) clear(l,mid,now<<1),clear(mid+1,r,now<<1|1);
}
void get_root(int now,int las,int all)
{
siz[now]=1;
szf[now]=0;
for(int to:G[now])
{
if((to^las) && !del[to])
{
get_root(to,now,all);
siz[now]+=siz[to];
szf[now]=std::max(szf[now],siz[to]);
}
}
szf[now]=std::max(szf[now],all-siz[now]);
if(szf[now]<szf[rt]) rt=now;
}
void get_value(int now,ll prf0,ll prf1,ll prf2,int wr,int las)
{
if((now^rt) && !wr) wr=now;
mxdep=std::max(mxdep,dep[now]=dep[las]+1);
bool lef=1;
for(int to:G[now]) if((to^las) && !del[to])
lef=0,get_value(to,prf0+prf2+a[to],prf1+a[to]*dep[now],prf2+a[to],wr,now);
if(lef)
++top,stk[0][top]=prf0,stk[1][top]=prf1,stk[2][top]=prf2-a[rt],
stk[3][top]=now,stk[4][top]=dep[now],stk[5][top]=wr;
}
void get_ans(int now)
{
del[now]=1;
top=mxdep=0;
get_value(now,a[now],0,a[now],0,0);
++top;
stk[0][top]=a[now];
stk[1][top]=stk[2][top]=stk[5][top]=0;
stk[3][top]=now;
stk[4][top]=1;
stk[5][top+1]=stk[5][0]=-1;
clear(1,mxdep,1);
int i=1,j;
while(i<=top)
{
j=i;
while(stk[5][i]==stk[5][j]) ans=std::max(ff(stk[4][j],find(1,mxdep,1,stk[4][j]))+stk[0][j],ans),++j;
j=i;
while(stk[5][i]==stk[5][j]) lns[++tot]=Line(stk[2][j],stk[1][j]),ins(1,mxdep,1,tot),++j;
i=j;
}
clear(1,mxdep,1);
i=top;
while(i)
{
j=i;
while(stk[5][i]==stk[5][j]) ans=std::max(ff(stk[4][j],find(1,mxdep,1,stk[4][j]))+stk[0][j],ans),--j;
j=i;
while(stk[5][i]==stk[5][j]) lns[++tot]=Line(stk[2][j],stk[1][j]),ins(1,mxdep,1,tot),--j;
i=j;
}
for(int to:G[now]) if(!del[to]) rt=0,get_root(to,now,siz[to]),get_ans(rt);
}
int main()
{
sf(n);
for(int i=1,x,y;i<n;++i)
{
sf(x),sf(y);
G[x].emplace_back(y);
G[y].emplace_back(x);
}
for(int i=1;i<=n;++i) ssf(a[i]);
szf[0]=n+1;
get_root(1,0,n);
get_ans(rt);
printf("%lld\n",ans);
return 0;
}
Solution -「CF 1303G」Sum of Prefix Sums的更多相关文章
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 156D」Clues
\(\mathcal{Description}\) link. 给一个 \(n\) 个点 \(m\) 条边的无向图 \(G\).设图上有 \(k\) 个连通块,求出添加 \(k-1\) 条边使 ...
- Solution -「CF 848D」Shake It!
\(\mathcal{Description}\) Link. 初始有一个有向图 \(G=(V,E)\),\(V=\{s,t\}\),\(E=\langle s,t\rangle\),一次操作 ...
- Solution -「CF 804F」Fake bullions
\(\mathcal{Description}\) Link. 给定 \(n\) 个点的竞赛图,第 \(i\) 个点代表了 \(s_i\) 个人,每个人(0-based)可能有真金条.此后在 ...
- Solution -「CF 1119F」Niyaz and Small Degrees
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个结点的树,边有边权,对于每个整数 \(x\in[0,n)\),求出最少的删边代价使得任意结点度数不超过 ...
- Solution -「CF 1349D」Slime and Biscuits
\(\mathcal{Description}\) Link. 有 \(n\) 堆饼干,一开始第 \(i\) 堆有 \(a_i\) 块.每次操作从所有饼干中随机一块,将其随机丢到另外一堆.求所 ...
- Solution -「CF 1391E」Pairs of Pairs
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的无向图,在其上找到一条包括不少于 \(\lceil\frac{n}2\rceil\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
随机推荐
- 尤雨溪创立 Vue.js 的心路历程纪录片
Show More 本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅 ...
- 数据科学工具 Jupyter Notebook 教程(二)
Jupyter Notebook 是一个把代码.图像.注释.公式和作图集于一处,实现可读性分析的交互式笔记本工具.借助所谓的内核(Kernel)的概念,Jupyter Notebook 可以同时支持包 ...
- 推荐一个 C#写的 支持OCR的免费通用扫描仪软件
NAPS2是一个开源免费软件,体积只有6M不到,支持运行在 Windows, Mac 和 Linux操作系统中,默认就带有简体中文界面,官方默认就提供绿色版,所以解压即可使用,直接可以从官方网站下载: ...
- java中基本数据类型和包装数据类型
基本数据类型和包装数据类型在 Java 中有着重要的区别和联系,对于 Java 程序员来说,熟悉这两种数据类型的特点和使用方法是非常必要的. 基本数据类型 Java 中的基本数据类型一共有 8 种,分 ...
- ARC114F Permutation Division
题意 给定一个 \(1 \sim N\) 的排列,Alice 把它划分成 \(k\) 段,Bob 把这 \(k\) 段任意排列.Alice 想让字典序最小,Bob 想让字典序最大.请问最后的排列. 数 ...
- 自然语言处理 Paddle NLP - 基于预训练模型完成实体关系抽取
自然语言处理 Paddle NLP - 信息抽取技术及应用 重点:SOP 图.BCEWithLogitsLoss 基于预训练模型完成实体关系抽取 信息抽取旨在从非结构化自然语言文本中提取结构化知识,如 ...
- 学习websocket,原来这么简单
简单介绍 websocket WebSocket是一种在TCP连接上进行全双工通信的协议. WebSocket通信协议于2011年被IETF定为标准. 然后WebSocket API也被W3C定为标准 ...
- 手机号码吉利数PHP检测算法代码,超级实用
手机号码吉利数理预测解读:将手机号码末尾的四个数字,先除以八十,再减去整数部分,只使用剩下的小数(小数点反面的数字)乘以八十,然后将所得结果,对表查阅,就知道吉凶.(换句话说就是余数)例如:手机尾号是 ...
- LeetCode 周赛 352(2023/07/02)一场关于子数组的专题周赛
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 350 场 · 滑动窗口与离 ...
- Python潮流周刊#10:Twitter 的强敌 Threads 是用 Python 开发的!
你好,我是猫哥.这里每周分享优质的 Python 及通用技术内容,大部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 首发于我的博客:https://pyth ...