# UOJ Round48:Goodbye Wuxu C. 新年的小黄鸭

35 pts:

设\(f[i][j]\)表示在\(i\)节点,当前重链顶端到当前点距离为\(j\)的最优方案。

复杂度是\(O(n^2)\)

100 pts:

自己的理解可能跟题解有点偏差。

考虑dp的一个\(f[i][j]\) 一定会转移到0之后才对非\(j-1\)的位置造成贡献。

我们转换一下,即每个位置所在的重链一定会通向叶子节点。

考虑我们能不能直接通过数据结构找出那个叶子节点。考虑这一条链,我们将这一条链每个点的权值设置为这个点的父亲的其他儿子到达这条链时的\(f\),选这条链得到的答案就是这条链上的权值和再加上走这条链的贡献了。

然后我们考虑这一条链上的值。我们在每个节点\(2^i+1\)级祖先打上这个点的标记,这样总共\(n\log\)个标记。

这\(n\log\) 个标记可以直接区间加到叶子节点上,这题就可以两个log做出来了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int anc[N][17],n;
int hed[N],to[N<<1],nxt[N<<1],cnt,deg[N];
inline void adde(int u,int v){
    ++cnt;to[cnt]=v,nxt[cnt]=hed[u];hed[u]=cnt;deg[u]++;
}

int t[N<<2],lzy[N<<2];
inline void Add(int x,int l,int r,int ql,int qr,int sum){
    if(ql<=l&&qr>=r){t[x]+=sum,lzy[x]+=sum;return ;}
    int mid=(l+r)>>1;
    if(ql<=mid)Add(x<<1,l,mid,ql,qr,sum);
    if(qr>mid)Add(x<<1|1,mid+1,r,ql,qr,sum);
    t[x]=min(t[x<<1],t[x<<1|1])+lzy[x];
}
inline int qry(int x,int l,int r,int ql,int qr){
    if(ql<=l&&qr>=r)return t[x];
    int mid=(l+r)>>1;
    if(qr<=mid)return qry(x<<1,l,mid,ql,qr);
    if(ql>mid)return qry(x<<1|1,mid+1,r,ql,qr);
    return min(qry(x<<1,l,mid,ql,qr),qry(x<<1|1,mid+1,r,ql,qr))+lzy[x];
}

vector<int> Down[N];

int in[N],out[N],dfn;
int sz[N];

inline void dfs(int x,int pre){
    anc[x][0]=pre;
    in[x]=dfn+1;sz[x]=1;
    if(pre)Down[pre].push_back(x);
    for(int i=1;i<17;i++)anc[x][i]=anc[anc[x][i-1]][i-1];
    for(int i=0;i<17;i++)Down[anc[anc[x][i]][0]].push_back(x);
    if(deg[x]==1&&pre)++dfn;
    for(int i=hed[x];i;i=nxt[i])if(to[i]!=pre){
        int v=to[i];dfs(v,x);sz[x]+=sz[v];
    }
    out[x]=dfn;
}

int f[N];

inline void dfs2(int x,int pre){
    int sum=0;
    for(int i=hed[x];i;i=nxt[i]){int v=to[i];if(v==pre)continue;dfs2(v,x);}
    for(int i=hed[x];i;i=nxt[i]){
        int v=to[i];if(v==pre)continue;
        sum+=f[v]+sz[v];
    }
    for(int i=hed[x];i;i=nxt[i]){
        int v=to[i];if(v==pre)continue;
        Add(1,1,dfn,in[v],out[v],sum-f[v]-sz[v]);
    }
    for(size_t i=0;i<Down[x].size();i++){int v=Down[x][i];
        Add(1,1,dfn,in[v],out[v],sz[v]);
    }
    f[x]=qry(1,1,dfn,in[x],out[x]);
    for(size_t i=0;i<Down[x].size();i++){int v=Down[x][i];
        Add(1,1,dfn,in[v],out[v],-sz[v]);
    }
}

int main()
{
    cin >> n;
    for(int i=1;i<n;i++){
        int u,v;scanf("%d%d",&u,&v);
        adde(u,v),adde(v,u);
    }
    dfs(1,0);dfs2(1,0);cout << f[1] << endl;
}

原文地址:https://www.cnblogs.com/weiyanpeng/p/11053816.html

时间: 2024-10-29 10:52:58

# UOJ Round48:Goodbye Wuxu C. 新年的小黄鸭的相关文章

小黄鸭调试法

小黄鸭调试法(又称橡皮鸭调试法,黄鸭除虫法)是软件工程中使用的调试代码方法之一.此概念是参照于一个来自<程序员修炼之道>书中的一个故事.传说中程序大师随身携带一只小黄鸭,在调试代码的时候会在桌上放上这只小黄鸭,然后详细地向鸭子解释每行代码. 许多程序员都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题,就在解释的过程中击中了问题的解决方案.一边阐述代码的意图一边观察它实际上的意图并做调试,这两者之间的任何不协调会变得很明显,并且更容易发现自己的错误.如果没有玩具小鸭子也可以考虑向其它

制作一个小黄鸭转圈跳舞的页面。

我们来制作一个小黄鸭转圈跳舞的页面. 分析一下 1.分析一下这个页面,要完成这些效果,一共需要3步: 把鸭子都放到一个盒子当中 在盒子里,把每个鸭子的位置摆好 让盒子旋转 2.让鸭子在盒子中的位置摆好,需要怎么做: 先让鸭子站在圆心的位置(需要先了解父相子绝定位方式) 沿一个方向移动一个半径的距离(3d) 每个鸭子旋转一个角度,让鸭子均匀的分布一圈 开始写代码 要用到的知识包括几个HTML标签和一部分的css知识. 先把图片放到页面里边. 先来在页面中添加一个img标签,将小黄鸭跳舞的gif图放

Cyberduck 小黄鸭 跨平台的 FTP 软件

简介 1.Cyberduck是一款带图形界面的FTP客户端软件,目前有windows版和mac版. 2.支持文件下载,上传,删除等操作 3.官网地址:https://cyberduck.io/ 用途 对于记不住命令的小伙伴,你们的福音来了.使用该软件,完全图形化的操作,可以满足大部分需求.再也不用担心记不住命令了.像windows系统,资源管理器本身就完美支持ftp,用该软件很多余,该软件主要用于mac.很多其他的同类型软件,在mac上是收费的,这款软件完全免费,而且可以在github找到源码,

微信小程序相关三、css写小黄人

小程序上课第三天,因为今天院里有活动,所以没去上课,第四天上午又因为要召开入党转正大会,又耽误了一上午,下午去上课,要了资料.这两天讲了一些零零碎碎的东西,做的实例有上面这个小黄人 都是用的css,基本上都是用border,transform:rotate(),animation,和一些细节做的,左边的对话框那里的小尖头也是一个重点细节 下面附上代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset=&quo

Quartz2D练习 -- 小黄人

Main.storyboard <?xml version="1.0" encoding="UTF-8" standalone="no"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5053" systemVers

成唯一正式进入美国市场单车企业:ofo小黄车凭何出海?

共享单车在中国市场已经走过了数年光阴,在这场蓬勃发展的共享经济浪潮中,不同品牌的共享单车各使神通.竞相竞技. 然而在短短数年时间的市场洗礼中,不同品牌的共享单车也迎来了结局各异的局面,一些本着风口逐利的品牌已经烟消云散,而一些自始至终坚持服务.技术与创新的共享单车品牌,却得到了市场的青睐并成为这场浪潮的决胜者.在这场更迭的浪潮中,ofo小黄车以及一些其他共享单车品牌,是这股浪潮的引领者与推动者. 而日前有报道称ofo小黄车已获西雅图共享单车运营许可.成为唯一一家正式进入美国市场的中国共享单车企业

css3实现小黄人

效果就像这样: 不废话,直接上代码! hrml代码: <!DOCTYPE html> <html> <head lang="zh"> <meta charset="UTF-8"> <title>纯CSS3画出小黄人并实现动画效果</title> <Link href="index.css" type="text/css" rel="styl

iOS开发 - Quartz2D绘制小黄人

Quartz2D绘制小黄人 - (void)drawRect:(CGRect)rect { // 1.上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.身体 drawBody(ctx, rect); // 3.嘴(微笑) drawMouth(ctx, rect); // 4.画眼睛 drawEyes(ctx, rect); } /** * 眼睛 */ void drawEyes(CGContextRef ctx, CGRect

小绿人小红人和小黄人

(2016/4/14 看了昨天的锵锵三人行继续谈王小波,子东提到一个有趣的观点.路遥和王小波的对照.一个返乡农村青年为成为城市人的奋斗,一个下放青年以普通人的姿态谈自由. 两位都是我喜欢的作家.王小波更是我最喜欢的作家.子东的对照让我想起平等和自由,路遥的苦苦追求能够理解为底层人向往的平等,王小波戏谑地展示的则是一个精神贵族觉得的最可贵的东西,自由.由两者的关系又引发了以下的想象.当然,路遥追求的平等绝不是以下小红人理解的那种. ) 从前有个国家,那里的人分为两种:一种是小绿人,一种是小红人.