很有趣的一道题。

首先可以对每个叶子进行编号。按照DFS到的顺序即可。(假设从 $1$ 到 $k$)

然后对每个点求出它管辖的所有叶子的编号。因为是DFS序所以这一定是个区间。设点 $u$ 的这个区间是 $[l_u,r_u]$。

区间加操作,考虑差分,那么每个点的操作就变成了 $l_u$ 加一个数,$r_u+1$ 减一个数。(此时也要考虑 $k+1$)

那么题目要求就变成了所有数都变成 $0$。

感受一下,把 $(l_u,r_u+1,c_u)$ 看做一条带权边,那么当且仅当选择的边构成连通图时满足要求。

那么就变成最小生成树了。

时间复杂度 $O(n\log n)$。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
struct edge{
int u,v,w,id;
bool operator<(const edge &e)const{
return w<e.w;
}
}e[maxn];
int n,c[maxn],el,head[maxn],to[maxn*],nxt[maxn*],el2;
int lft[maxn],rig[maxn],dfn[maxn],dfs_clock,ccc,fa[maxn],at[maxn],sss[maxn],al;
bool good[maxn];
ll ans;
inline void add(int u,int v){
to[++el]=v;nxt[el]=head[u];head[u]=el;
}
int getfa(int x){
return x==fa[x]?x:fa[x]=getfa(fa[x]);
}
void dfs(int u,int f){
dfn[u]=++dfs_clock;
lft[u]=n+;rig[u]=;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==f) continue;
dfs(v,u);
lft[u]=min(lft[u],lft[v]);
rig[u]=max(rig[u],rig[v]);
}
if(!rig[u]) lft[u]=rig[u]=++ccc;
}
int main(){
n=read();
FOR(i,,n) c[i]=read();
FOR(i,,n-){
int u=read(),v=read();
add(u,v);add(v,u);
}
dfs(,);
FOR(i,,n) e[++el2]=(edge){lft[i],rig[i]+,c[i],i};
sort(e+,e+el2+);
FOR(i,,ccc) fa[i]=i;
FOR(i,,el2){
int j=i;
while(j<=el2 && e[j].w==e[i].w) j++;
j--;
FOR(k,i,j){
int u=e[k].u,v=e[k].v;
u=getfa(u);v=getfa(v);
if(u!=v) good[e[k].id]=true,al++;
}
FOR(k,i,j){
int u=e[k].u,v=e[k].v;
u=getfa(u);v=getfa(v);
if(u!=v) fa[u]=v,ans+=e[k].w;
}
i=j;
}
cout<<ans<<" "<<al<<endl;
FOR(i,,n) if(good[i]) printf("%d ",i);
}

CF1120D Power Tree(构造题,差分,最小生成树)的更多相关文章

  1. CF1120D Power Tree

    沙发~~ 题意简述 给你一棵有根树,定义叶子为度数为1的点. 你可以以$ w_x \(的代价控制\)x\(点.选择控制之后可以给它的子树里的叶子加 上\)t (t \in Z )$. 你要以最小的总代 ...

  2. 【构造题 贪心】cf1041E. Tree Reconstruction

    比赛时候还是太慢了……要是能做快点就能上分了 Monocarp has drawn a tree (an undirected connected acyclic graph) and then ha ...

  3. HDU 5573 Binary Tree 构造

    Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...

  4. CF1110E Magic Stones(构造题)

    这场CF怎么这么多构造题…… 题目链接:CF原网 洛谷 题目大意:给定两个长度为 $n$ 的序列 $c$ 和 $t$.每次我们可以对 $c_i(2\le i<n)$ 进行一次操作,也就是把 $c ...

  5. AIM Tech Round 4 (Div. 1) C - Upgrading Tree 构造 + 树的重心

    C - Upgrading Tree 我发现我构造题好弱啊啊啊. 很明显能想到先找到重心, 然后我们的目标就是把所有点接到重心的儿子上,让重心的儿子子树变成菊花图, 这个先把重心到儿子的边连到 i , ...

  6. cf251.2.C (构造题的技巧)

    C. Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabyt ...

  7. hdu4671 Backup Plan ——构造题

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4671 其实是不难的那种构造题,先排第一列,第二列从后往前选. #include <iostrea ...

  8. Educational Codeforces Round 7 D. Optimal Number Permutation 构造题

    D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...

  9. Codeforces 482 - Diverse Permutation 构造题

    这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ....... ...

随机推荐

  1. mosquitto 常用命令

    原文:https://www.cnblogs.com/smartlife/articles/10182136.html 常用命令 订阅主题 mosquitto_sub -h 192.168.0.1 - ...

  2. 将Python源程序打包成可独立执行的文件

    有时候需要将编写好的脚本发送给别人,但是在没有安装运行环境或依赖库的情况下,Python脚本程序无法执行.PyInstaller工具可以快速的将python脚本打包成一个二进制可执行的exe程序,并且 ...

  3. 线程---Day22

    并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生) 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单CPU系 ...

  4. HighChat 动态绑定数据(二)

    也是对最近几天的折线图搞得烦心,看了好多前辈的文章,也总结了一下. 1.先看后台程序,这是我模拟的一些参数 就是一个字符串.没啥好说的 public ActionResult Index2() { s ...

  5. 解决Eclipe安装不上android的ADT的办法

    Eclipse,https://dl-ssl.google.com/android/eclipse/安装不上去,ADT在线安装装不了,用离线包又出问题时会不会疯掉. 显然,国内网络和谐掉了google ...

  6. 中国工业的下一个十年在哪里?APS系统或将引领智能化转型

    为什么众多的ERP软件公司没有推出相关产品,当然可以肯定的是并非客户没有此观念,如果一定要说,也只能说目前的需求还不是非常强烈,从ERP厂商非常急切的与APS公司合作,甚至有高价购买APS公司代码的情 ...

  7. AIX运维常用命令

    目前传统的磁盘管理仍有不足:如果下Unix系统中的存储容量需要扩展,文件系统就必须停止运行,然后通过重构分区的手段来进行分区和文件系统的扩容.一般采用的方法是先备份该文件系统并删除其所在的分区,然后重 ...

  8. mysql 连接数用完,root也无法登陆的处理方法

    gdb -p $(pidof mysqld) -ex "set max_connections=1500" -batch 使用 gdb 临时调大 参数 max_connection ...

  9. SpringMVC中控制器接收JSP页面表单的参数接收方式详解及细节注意(400错误)

    控制器方法中参数的接收 (1)以前的参数接收: String  param = req.getParameter(name): (2)SpringMVC简化这个操作,只需要给控制器方法添加参数即可 a ...

  10. Docker搭建Nexus(Maven私库)

    0.镜像的查找:docker search nexus 1.拉取官方镜像:docker pull sonatype/nexus3 2.创建了自己的目录 (/opt/nexus/nexus-data) ...