Loj#6405-「ICPC World Finals 2018」征服世界【模拟费用流,左偏树】

正题

题目链接:https://loj.ac/p/6405


题目大意

给出nnn个点的一棵树,每个点有xix_ixi个军队,需要yiy_iyi个军队,你可以移动军队,求使得满足所有点要求的情况下,军队移动路径和的最小值。

1≤n≤2500001\leq n\leq 2500001n250000,军队总数和不超过10610^6106


解题思路

一看就是费用流,但是数据范围很大所有是模拟费用流。

那么考虑贪心,因为我们要贪心所以我们很难强制满流,那么我们就定义一个流量会额外带上一个−∞-\infty的权值,然后最后答案加上∞×c\infty\times c×c就好了。

那么考虑一个流量从xxx流到yyy,费用是depx+depy−deplca×2−∞dep_x+dep_y-dep_{lca}\times 2-\inftydepx+depydeplca×2,如果一个是需要军队的,那么定义valx=depx−∞val_x=dep_x-\inftyvalx=depx,否则valx=depxval_x=dep_xvalx=depx

那么就可以视费用为valx+valy−deplca×2val_x+val_y-dep_{lca}\times 2valx+valydeplca×2,那么这些答案我们就可以在lcalcalca处维护了,设它们的lcalcalcazzz

考虑用可并堆储存子树内的valxval_xvalxvalyval_yvaly,然后每次取出最小的直到valx+valy−depz×2≥0val_x+val_y-dep_z\times 2\geq 0valx+valydepz×20为止,但是我们还需要一个退流的操作,也就是可撤回的过程。这个过程我们的权值是相反的,定义新的valx′=2×depz−valyval'_x=2\times dep_z-val_yvalx=2×depzvaly,同理valy′=2×depz−valxval'_y=2\times dep_z-val_xvaly=2×depzvalx就好了。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=3e6+10,inf=1e12;
struct Heap{ll cnt,w[N],t[N][2],dis[N];ll Merge(ll x,ll y){if(!x||!y)return x|y;if(w[x]>w[y])swap(x,y);t[x][1]=Merge(t[x][1],y);if(dis[t[x][0]]<dis[t[x][1]])swap(t[x][0],t[x][1]);dis[x]=dis[t[x][1]]+1;return x;}ll Delete(ll x){return Merge(t[x][0],t[x][1]);}void Ins(ll &x,ll val){++cnt;w[cnt]=val;x=Merge(x,cnt);}
}T1,T2;
struct node{ll to,next,w;
}a[N<<1];
ll n,tot,ans,ls[N],rt1[N],rt2[N],dep[N],c[N];
void addl(ll x,ll y,ll w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return;
}
void dfs(ll x,ll fa){if(c[x]<0){for(int i=0;i<-c[x];i++)T1.Ins(rt1[x],dep[x]-inf);}if(c[x]>0){for(int i=0;i<c[x];i++)T2.Ins(rt2[x],dep[x]);}for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dep[y]=dep[x]+a[i].w;dfs(y,x);rt1[x]=T1.Merge(rt1[x],rt1[y]);rt2[x]=T2.Merge(rt2[x],rt2[y]);}while(rt1[x]&&rt2[x]){ll X=rt1[x];rt1[x]=T1.Delete(rt1[x]);T1.t[X][0]=T1.t[X][1]=0;ll Y=rt2[x];rt2[x]=T2.Delete(rt2[x]);T2.t[Y][0]=T2.t[Y][1]=0;if(T1.w[X]+T2.w[Y]-2*dep[x]<0){ll A=T1.w[X],B=T2.w[Y];ans+=A+B-2*dep[x];T1.w[X]=2*dep[x]-B;rt1[x]=T1.Merge(rt1[x],X);T2.w[Y]=2*dep[x]-A;rt2[x]=T2.Merge(rt2[x],Y);}else{rt1[x]=T1.Merge(rt1[x],X);rt2[x]=T2.Merge(rt2[x],Y);break;}}return;
}
signed main()
{scanf("%lld",&n);for(ll i=1,x,y,w;i<n;i++){scanf("%lld%lld%lld",&x,&y,&w);addl(x,y,w);addl(y,x,w);}for(ll i=1;i<=n;i++){ll x,y;scanf("%lld%lld",&x,&y);c[i]=x-y;if(c[i]<0)ans+=-c[i]*inf;}dfs(1,0);printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

兰道定理(竞赛图)

所谓兰道定理&#xff0c;就是兰道定下的道理 &#xff08;逃&#xff09; 解析 每条边被规定了方向的完全图叫做竞赛图 竞赛图中&#xff0c;设每个点的出度为uiu_iui​ 显然有&#xff1a; ∑uin(n−1)2\sum u_i\dfrac{n\times(n-1)}{2}∑ui​2n(n−1)​ 而兰道定理的内容是…

test2 3-16 2021 模拟赛two

文章目录考试复盘染色问题芬威克树礼物考试复盘 先说T1T1T1 染色&#xff0c;以为是道数学题&#xff0c;推了有一会儿的公式&#xff0c;从颜色1到颜色m&#xff0c;感觉是dpdpdp转移 发现颜色重叠的方案可以转化为另外一种相邻不重叠的染色 但是推到颜色4的时候就发现自己…

ASP.NET Core 2.2 : 扒一扒新的Endpoint路由方案

ASP.NET Core 从2.2版本开始&#xff0c;采用了一个新的名为Endpoint的路由方案&#xff0c;与原来的方案在使用上差别不大&#xff0c;但从内部运行方式上来说&#xff0c;差别还是很大的。上一篇ASP.NET Core;图解路由(2.1 earler)详细介绍了原版路由方案的运行机制&#xff…

郊区春游题解

郊区春游 题意&#xff1a; 给定一张图&#xff0c;求从某个起点出发&#xff0c;经过其中R个点&#xff08;R个点给出&#xff09;的最短路径&#xff08;每个点经过且只经过一遍&#xff09; 题解&#xff1a; 首先我们用floyed处理出任意两点的距离 dp[i][j]表示当前状态…

2021牛客暑期多校训练营3A-Guess and lies【dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11254/A 题目大意 现在有一个y∈[1,n]y\in[1,n]y∈[1,n]&#xff0c;BobBobBob每次可以选择问AliceAliceAlice是否y≥xy\geq xy≥x&#xff0c;AliceAliceAlice可以说一次谎。BobBobBob要在最少次数内确定yyy的值&#xf…

CF453C:Little Pony and Summer Sun Celebration(dfs、构造)

解析 比较巧妙的一道题 首先做一棵dfs生成树出来 尝试把它的欧拉序列作为答案 但是这样可能会有的地方不符合条件 如果x点的奇偶性不符合&#xff0c;就在序列中加入一个(x,fa) 同时改变x和fa的奇偶性 显然不会超过4*n 如果根需要改奇偶性怎么办&#xff1f; 最后一次回溯删掉…

开源中国 2018 新增开源软件最受欢迎 TOP 50

本周开源中国陆续公布了两个年度榜单&#xff0c;分别是国产新秀榜 TOP 30 和国产新增榜 TOP 50。由于两个榜单的数据来源都是国内开源项目&#xff0c;所以会有部分项目同时出现在两个榜单上。今天公布的这份榜单 —— 开源中国 2018 新增开源软件最受欢迎 TOP 50&#xff0c;…

简单环题解

简单环 题解: 题目求环的情况 如果我们直接枚举会有很多重复&#xff0c;为了避免重复&#xff0c;我们枚举起点&#xff0c;其他的点的序号都必须比起点大&#xff0c;也就是x->y&#xff0c;x一定小于y dp[i][j]表示的是以i的第一个点作为起点的链的数量&#xff0c;j是…

AT2339-[AGC011C]Squared Graph【黑白染色】

正题 题目链接:https://www.luogu.com.cn/problem/AT2339 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;然后有一张nnn\times nnn的图&#xff0c;每个点是一个二元组(a,b)(a,b)(a,b)。(a,b)(a,b)(a,b)和(c,d)(c,d)(c,d)连边当且仅当aaa和ccc有连边&#xff0c;bbb和…

[树链剖分]List wants to travel,Relief grain,hotel加强版,This world need more Zhu

文章目录B&#xff1a;Relief grainC&#xff1a;hotel加强版B&#xff1a;Relief grain 题目 将一段区间修改的标记变成差分&#xff0c;每次都是连续一段的dfndfndfn序修改 从小到大枚举dfndfndfn&#xff0c;在一段标记的最开头的dfndfndfn插入&#xff0c;最末尾的dfndf…

P4342:[IOI1998]Polygon(区间dp)

一道警钟一样的好题 解析 乍一看&#xff1a; “这不就能量项链嘛&#xff0c;这也蓝&#xff1f;” 然后就愉快的WA掉了… qwq 让我们回归本源&#xff0c;在什么时候可以动态规划&#xff1f; “局部最优解可以带动全局最优解的时候&#xff0c;我们可以使用动态规划算法”…

eShopOnContainers 知多少[8]:Ordering microservice

1. 引言Ordering microservice&#xff08;订单微服务&#xff09;就是处理订单的了&#xff0c;它与前面讲到的几个微服务相比要复杂的多。主要涉及以下业务逻辑&#xff1a;订单的创建、取消、支付、发货库存的扣减2. 架构模式如上图所示&#xff0c;该服务基于CQRS 和DDD来实…

P4229-某位歌姬的故事【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4229 题目大意 求有多少个长度为nnn的序列aaa&#xff0c;满足∀i∈[1,n],ai∈[1,A]\forall i\in[1,n],a_i\in[1,A]∀i∈[1,n],ai​∈[1,A]&#xff0c;还有QQQ个限制形如 max⁡{aj}(j∈[li,ri])mi\max\{a_j\}(j\in[l_i,r_i…

Most Powerful

Most Powerful 题意&#xff1a; n个原子&#xff0c;当其中两个原子碰撞时&#xff0c;其中一个会消失&#xff0c;产生大量能量。现在知道每两个原子的碰撞表现&#xff0c;求出产生的能量总和的最大值 题解: 设dp[i]表示i状态下所获得的能量 i为二进制&#xff0c;第x位…

[树套树] 网络管理

A&#xff1a;[CTSC2008]网络管理 此题本来是平衡树板块的&#xff0c;但俺写的是树套树&#xff0c;平衡树会多个log 题目 查询第kkk大&#xff0c;天然主席树可以维护 就不用了平衡树二分&#xff0c;多个logloglog了 将树上(u,v)(u,v)(u,v)的路径转化为 uuu到根 vvv到根…

[翻译] Entity Framework Core in Action 关于这本书

Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。 预计每两天一篇更新 PS: 翻译难免限于本人水平…

CF573E-Bear and Bowling【dp,平衡树】

正题 题目链接:https://www.luogu.com.cn/problem/CF573E 题目大意 给出一个长度为nnn的序列aaa&#xff0c;求它的一个子序列bbb&#xff0c;要求最大化 ∑i1∣b∣bii\sum_{i1}^{|b|}b_i\times ii1∑∣b∣​bi​i 1≤n≤105,∣ai∣≤1071\leq n\leq 10^5,|a_i|\leq 10^71≤n…

NC51189 Mondriaan‘s Dream

NC51189 Mondriaan’s Dream 题意&#xff1a; n * m的矩阵&#xff0c;用1 * 2和2 * 1的砖快密铺&#xff0c;问多少种方法&#xff1a; 题解&#xff1a; 方法1&#xff1a; 我们现在规定砖头的竖放的上部分为1&#xff0c;砖头的横放或者是竖放的下部分为0 我们每两层进…

CF1408D:Searchlights

解析 滥用数据结构了属于是 本题的思路和题解还是差不多的 暴力枚举灯和海盗乱搞即可 但是最后对fif_ifi​的维护我使用了树状数组&#xff0c;凭空多了个log… 尽管树状数组跑的飞快 其实直接倒着扫一遍就行了 特殊数据下我这个算法是可以跑满n方log1e6的 过2000我在想peach…

[LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史

[NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护边权 把边在LCTLCTLCT中理解为点&#xff1f;——看题解代码其实就是建虚点 出现环时 选择最大的bb…