对于确定的$K$,问题也可以看作每一个点最多选$K$条出边,并最大化选择的边权和

关于这个问题,有如下的树形dp——

令$f_{k,0/1}$表示以$k$为根的子树中,根节点选择不超过$K/K-1$个儿子的最大边权和,转移为
$$
\begin{cases}f_{k,0}=\sum_{x\in son_{k}}f_{x,0}+\max_{S\subseteq son_{k},|S|\le K}\sum_{x\in S}(f_{x,1}+val_{k,x}-f_{x,0})\\f_{k,1}=\sum_{x\in son_{k}}f_{x,0}+\max_{S\subseteq son_{k},|S|<K}\sum_{x\in S}(f_{x,1}+val_{k,x}-f_{x,0})\end{cases}
$$
(其中$son_{k}$为$k$儿子的集合,$val_{x,y}$表示边$(x,y)$的边权)

对于后者,我们可以维护一个数据结构,支持加入一个元素和查询最大的$K$(或$K-1$)个元素之和

可以使用平衡树/权值线段树实现,单次复杂度为$o(\log n)$,总复杂度为$o(n\log n)$

记$deg_{k}$为节点$k$的度数,将所有边$(x,y)$分为三类:

1.$deg_{x},deg_{y}\le K$,这一类边一定可以选择,直接将$val_{(x,y)}$加入答案并删除

2.$deg_{x}\le K<deg_{y}$,这一类边实际上仅在$y$上有限制,我们可以在求$f_{y,0/1}$时的平衡树中先加入此边权即可

另外,为了维护,在dp结束后要删除$f_{x,1}+val_{k,x}-f_{x,0}$,如果直接在multiset中删除会导致节点个数

3.$deg_{x},deg_{y}>K$,这一类边用之前的dp即可

由此,每一次dp的节点数只有$deg_{k}>K$的节点,而$\sum_{K=0}^{n-1}\sum_{deg_{k}> K}1=o(n)$,总复杂度即$o(n\log n)$

(另外注意搜索时,$deg_{k}>K$的点的出边中要删除$deg_{k}\le K$的点,来保证复杂度)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define ll long long
5 #define pii pair<int,int>
6 #define mid (l+r>>1)
7 struct Edge{
8 int nex,to,len;
9 }edge[N<<1];
10 vector<pii>G[N];
11 vector<ll>ans,v[N];
12 int E,V,n,tmp,r[N],id[N],head[N],work[N],vis[N],rt[N],ls[N*100],rs[N*100],sz[N*100];
13 ll sum,f[N*100],dp[N][2];
14 bool cmp1(int x,int y){
15 return r[x]<r[y];
16 }
17 bool cmp2(pii x,pii y){
18 return r[x.first]>r[y.first];
19 }
20 void update(int &k,int l,int r,int x,int y){
21 if (!k)k=++V;
22 sz[k]+=y,f[k]+=x*y;
23 if (l==r)return;
24 if (x<=mid)update(ls[k],l,mid,x,y);
25 else update(rs[k],mid+1,r,x,y);
26 }
27 ll query(int k,int l,int r,int x){
28 if (l==r)return 1LL*min(x,sz[k])*l;
29 if (sz[rs[k]]>=x)return query(rs[k],mid+1,r,x);
30 return f[rs[k]]+query(ls[k],l,mid,x-sz[rs[k]]);
31 }
32 void add(int x,int y,int z){
33 edge[E].nex=head[x];
34 edge[E].to=y;
35 edge[E].len=z;
36 head[x]=E++;
37 }
38 void dfs(int k){
39 vis[k]=1;
40 dp[k][0]=dp[k][1]=0;
41 for(int &i=work[k];i!=-1;i=edge[i].nex)
42 if (r[edge[i].to]>tmp)break;
43 for(int i=work[k];i!=-1;i=edge[i].nex)
44 if (!vis[edge[i].to]){
45 dfs(edge[i].to);
46 dp[k][0]+=dp[edge[i].to][0];
47 ll s=dp[edge[i].to][1]+edge[i].len-dp[edge[i].to][0];
48 if (s>0){
49 update(rt[k],1,1e9,s,1);
50 v[k].push_back(s);
51 }
52 }
53 dp[k][1]=dp[k][0];
54 dp[k][0]+=query(rt[k],1,1e9,tmp);
55 dp[k][1]+=query(rt[k],1,1e9,tmp-1);
56 for(int i=0;i<v[k].size();i++)update(rt[k],1,1e9,v[k][i],-1);
57 v[k].clear();
58 }
59 vector<ll> minimum_closure_costs(int n,vector<int>u,vector<int>v,vector<int>w){
60 memset(head,-1,sizeof(head));
61 for(int i=0;i<=n-2;i++){
62 u[i]++,v[i]++;
63 G[u[i]].push_back(make_pair(v[i],w[i]));
64 G[v[i]].push_back(make_pair(u[i],w[i]));
65 sum+=w[i];
66 }
67 for(int i=1;i<=n;i++){
68 id[i]=i;
69 r[i]=G[i].size();
70 }
71 sort(id+1,id+n+1,cmp1);
72 for(int i=1;i<=n;i++){
73 sort(G[i].begin(),G[i].end(),cmp2);
74 for(int j=0;j<G[i].size();j++)add(i,G[i][j].first,G[i][j].second);
75 }
76 memcpy(work,head,sizeof(work));
77 ans.push_back(sum);
78 for(int i=1,j=1;i<n;i++){
79 while ((j<=n)&&(r[id[j]]<=i)){
80 for(int k=head[id[j]];k!=-1;k=edge[k].nex){
81 if (vis[edge[k].to])sum-=edge[k].len;
82 else update(rt[edge[k].to],1,1e9,edge[k].len,1);
83 }
84 vis[id[j++]]=1;
85 }
86 tmp=i;
87 ans.push_back(sum);
88 for(int k=j;k<=n;k++)
89 if (!vis[id[k]]){
90 dfs(id[k]);
91 ans[i]-=dp[id[k]][0];
92 }
93 for(int k=j;k<=n;k++)vis[id[k]]=0;
94 }
95 return ans;
96 }

[luogu7600]封闭道路的更多相关文章

  1. P7600-[APIO2021]封闭道路【堆,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P7600 题目大意 给出\(n\)个点的一棵树,边有边权,对于每个\(k\)求去掉最小边权和的点使得每个点的度数都不 ...

  2. Dalvik虚拟机Java堆创建过程分析

    文章转载至罗升阳CSDN社区博客,原地址: http://blog.csdn.net/luoshengyang/article/details/6557518 近年来,手机移动平台越来越火爆.打开自己 ...

  3. Apollo框架试玩

    2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...

  4. Apollo自动驾驶框架试玩

    2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...

  5. Google Waymo自动驾驶安全技术报告(二)

    Waymo的技术在公开道路上.封闭测试场.仿真器进行了广泛的测试,所以可以保证自动驾驶系统的每一部分在其ODD内都有强大.可靠.安全的处理能力. Waymo的自动驾驶系统由三个相互独立.严格测试的子系 ...

  6. AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…

    ​前言:又到春招季!作为国民级出行服务平台,高德业务快速发展,大量校招/社招名额开放,欢迎大家投递简历,详情见文末.为帮助大家更了解高德技术,我们策划了#春招专栏#的系列文章,组织各业务团队的高年级同 ...

  7. “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标 想做一个面对中小企业的专业上游软件供应商 台湾联发科技颠覆掉的是一个封闭的手机产业系统 解决方案,即AgileHIS.NET数字化医院基础方案

    “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标   我们做中国医疗信息化行业之中的联发科 ---我们在医疗行业中的定位及目标 从我个人来讲,我从2001年到现在这10年之间基本上一直在 ...

  8. 自动驾驶汽车数据不再封闭,Uber 开源新的数据可视化系统

    日前,Uber 开源了基于 web 的自动驾驶可视化系统(AVS),称该系统为自动驾驶行业带来理解和共享数据的新方式.AVS 由Uber旗下负责自动驾驶汽车研发的技术事业群(ATG)开发,目前该系统已 ...

  9. 免费道路 bzoj 3624

    免费道路(1s 128MB)roads [输入样例] 5 7 21 3 04 5 13 2 05 3 14 3 01 2 14 2 1 [输出样例] 3 2 04 3 05 3 11 2 1 题解: ...

随机推荐

  1. 100台机器上海量IP如何查找出现频率 Top 100?

    场景题 有 100 机器,每个机器的磁盘特别大,磁盘大小为 1T,但是内存大小只有 4G,现在每台机器上都产生了很多 ip 日志文件,每个文件假设有50G,那么如果计算出这 100 太机器上访问量最多 ...

  2. JOIN US | SphereEx 精英集结

    新环境.新气象,SphereEx 欢迎志同道合的你加入! 关于 SphereEx 北京思斐软件技术有限公司(sphere-ex.com),是一家致力于构建新型分布式数据基础设施的公司,秉承开源.共享. ...

  3. SSM框架项目的mvc拦截器

    为了防止用户在不登录的情况下通过并接请求直接访问系统,我们需要通过session和拦截器来防止这样的情况. 拦截器的配置: 为拦截器建立一个包:interceptor,并在包里建立 LoginInte ...

  4. 1. SSTI(模板注入)漏洞(入门篇)

    好久没更新博客了,现在主要在作源码审计相关工作,在工作中也遇到了各种语言导致的一些SSTI,今天就来大概说一下SSTI模板注入这个老生常谈的漏洞 前言 模板引擎 模板引擎(这里特指用于Web开发的模板 ...

  5. 【原创】Linux v4l2框架分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  6. 【UE4 C++】Slate 初探: Editor UI 与 Game UI

    概述 名词区分 Slate Slate 是完全自定义.与平台无关的UI框架 应用 可用于编辑器UI,编辑器的大部分界面都是使用 Slate 构建的 可做为游戏UI 可作为独立应用开发 只能 C++ 开 ...

  7. Scrum Meeting 14

    第14次例会报告 日期:2021年06月07日 会议主要内容概述: 汇报了已完成的工作,明确了下一步目标,正在努力赶进度. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wi ...

  8. Noip模拟22 2021.7.21

    T1 d 简化题意就是找到相对平均长宽的偏移量较大的矩形给他删掉 可以说是个贪心,按照a,b分别为第一关键字排序 然后假装删去要求的那么多个按a排序的较小的,然后再去b中, 找到 删去的a中的那几个矩 ...

  9. Noip模拟5 2021.6.7

    T1 string(线段树优化) 看到数据范围就必须要想到优化,那么如何把26×M∗N 的复杂度降低呢?? 用到那个我们最不想打的数据结构--线段树...... 然而,这个线段树与往常不同,他只需要用 ...

  10. 字符串匹配(kmp+trie+aho-corasic automaton+fail tree)

    目录 kmp 那么怎么快速求最长前缀后缀呢 trie aho-corasic automaton fail tree kmp 对于一个字符串\(s_{0\dots n}\),称\(s_{0\dots ...