AT2112 Non-redundant Drive
题目:https://www.luogu.org/problemnew/show/AT2112
对于这种找路径的就直接上点分治就好。
分治时,算出每一个点到分治重心的后能剩多少油,从分治重心走到每个点最少需要多少起始油量。
对这两个数组排序后合并即可。
注意,合并的时候要保证不属于同一棵子树,这个可以利用boruvka时用到的那个技巧来实现。
#include<bits/stdc++.h>
#define N 220000
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline ll read()
{
char ch=0;
ll x=0,flag=1;
while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*flag;
}
const ll inf=1e9;
struct edge{ll to,nxt,w;}e[N*2];
ll num,head[N];
inline void add(ll x,ll y,ll z){e[++num]=(edge){y,head[x],z};head[x]=num;}
bool vis[N];
ll rt,ans,size,cnt1,cnt2,w[N],sz[N],bal[N];
struct node{ll x,w,k;}f[N],g[N];
bool cmp(node a,node b){return a.x<b.x;}
bool operator<(node a,node b){return a.w<b.w;}
void get_rt(ll x,ll fa)
{
sz[x]=1;bal[x]=0;
for(ll i=head[x];i!=-1;i=e[i].nxt)
{
ll to=e[i].to;
if(vis[to]||to==fa)continue;
get_rt(to,x);sz[x]+=sz[to];
bal[x]=max(bal[x],sz[to]);
}
bal[x]=max(bal[x],size-sz[x]);
if(bal[rt]>bal[x])rt=x;
}
void get_sz(ll x,ll fa)
{
sz[x]=1;
for(ll i=head[x];i!=-1;i=e[i].nxt)
{
ll to=e[i].to;
if(vis[to]||to==fa)continue;
get_sz(to,x);sz[x]+=sz[to];
}
}
void cal1(ll x,ll k,ll t,ll fa,ll dep,ll flag)
{
if(fa==rt)flag=x;
if(w[x]>=k)f[++cnt1]=(node){t+w[x],dep,flag};
for(ll i=head[x];i!=-1;i=e[i].nxt)
{
ll to=e[i].to,v=e[i].w;
if(vis[to]||to==fa)continue;
cal1(to,max(v,k+v-w[x]),t-v+w[x],x,dep+1,flag);
}
}
void cal2(ll x,ll k,ll t,ll fa,ll dep,ll flag)
{
if(fa==rt)flag=x;
g[++cnt2]=(node){k,dep,flag};
for(ll i=head[x];i!=-1;i=e[i].nxt)
{
ll to=e[i].to,v=e[i].w;
if(vis[to]||to==fa)continue;
cal2(to,max(k,v-t),t-v+w[to],x,dep+1,flag);
}
}
void solve(ll x)
{
bal[rt=0]=inf;get_rt(x,x);get_sz(rt,rt);vis[rt]=true;
cnt1=0;cal1(rt,0,0,rt,1,rt);sort(f+1,f+cnt1+1,cmp);
cnt2=0;cal2(rt,0,0,rt,0,rt);sort(g+1,g+cnt2+1,cmp);
node a={0,-inf,0},b={0,-inf,0};
for(ll i=1,j=0;i<=cnt1;i++)
{
while(j!=cnt2&&g[j+1].x<=f[i].x)
{
j++;
if(g[j].k==a.k)a=max(a,g[j]);
else
{
b=max(b,g[j]);
if(a<b)swap(a,b);
}
}
if(f[i].k!=a.k)ans=max(ans,f[i].w+a.w);
else ans=max(ans,f[i].w+b.w);
}
for(ll i=head[rt];i!=-1;i=e[i].nxt)
{
ll to=e[i].to;
if(vis[to])continue;
size=sz[to];solve(to);
}
}
int main()
{
ll n=read();
for(ll i=1;i<=n;i++)w[i]=read();
num=-1;memset(head,-1,sizeof(head));
for(ll i=1;i<n;i++)
{
ll x=read(),y=read(),z=read();
add(x,y,z);add(y,x,z);
}
ans=1;size=n;solve(1);printf("%lld\n",ans);
return 0;
}
AT2112 Non-redundant Drive的更多相关文章
- AHCI: Failed to attach drive to Port1 (VERR_GENERAL_FAILURE).
在mac操作系统下,安装VirtualBoxVm虚拟机,虚拟机里面安装wind7操作系统.在启动虚拟机的时候报错:AHCI: Failed to attach drive to Port1 (VERR ...
- Windows Azure Storage (17) Azure Storage读取访问地域冗余(Read Access – Geo Redundant Storage, RA-GRS)
<Windows Azure Platform 系列文章目录> 细心的用户会发现,微软在国外和国内的数据中心建设都是成对的,比如香港数据中心(Asia East)和新加坡的数据中心(Sou ...
- vmware安装win7提示No CD-ROM drive to use:GCDROM not loaded
今天安装win7 64位的操作系统到vmware虚拟机,以为一切事如此的简单,因为自己以前经常拿vmware来装系统,结果确出现下面莫名其妙的错误: 提示说没有CD-ROM,可是我明明在vmware的 ...
- Ignite 配置更新Oracle JDBC Drive
如果使用Oracle 12C 作为Ignite 的Repository的话,在Repository Createion Wizard的配置过程中,会出现ORA-28040:No matc ...
- 网盘的选择,百度网盘、google drive 还是 Dropbox
我是国内用户,需要越过Chinawall 我使用的是一枝红杏,用着还行 如果要买,结账时输入'laod80' 一枝红杏官网:官网地址 Dropbox: 稳定,速度快 Dropbox官网:链接 操作十分 ...
- POJ 3177 Redundant Paths(边双连通的构造)
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13717 Accepted: 5824 ...
- UEFI Bootable USB Flash Drive - Create in Windows(WIN7 WIN8)
How to Create a Bootable UEFI USB Flash Drive for Installing Windows 7, Windows 8, or Windows 8.1 In ...
- Create a SQL Server Database on a network shared drive
(原文地址:http://blogs.msdn.com/b/varund/archive/2010/09/02/create-a-sql-server-database-on-a-network-sh ...
- 【转】Expire Google Drive Files 让Google Docs云盘共享连接在指定时间后自动失效
最近在清理Google Docs中之前共享过的文件链接,发现Google Docs多人协作共享过的链接会一直存在,在实际操作中较不灵活.正好订阅的RSS推送了Pseric写的这篇文章 - Expire ...
随机推荐
- ununtu 18.04 163 mirror
deb http://mirrors.163.com/ubuntu/ bionic main restricted deb http://mirrors.163.com/ubuntu/ bionic- ...
- php的__autoload和php的__call
首先, __call是php语言自身就具有的一种语言features...,不是thinkphp的语言特征. 关于__call参考: http://love-love-l.blog.163.com/b ...
- Win10 使用命令修复系统坏死点
我的电脑win10系统升级多次以后,经常会出现所有设置有时点不开的情况 解决: C:\WINDOWS\system32>sfc /SCANNOW 开始系统扫描.此过程将需要一些时间. 开始系统扫 ...
- 密码发生器|2012年蓝桥杯B组题解析第八题-fishers
(10')密码发生器 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如果写在纸上,担心纸张被别人发现 ...
- 【C#】扩展方法浅谈
C#3 引入的扩展方法这一个理念. 扩展方法最明显的特征是在方法参数中第一个参数有this声明. 其实C#库中有很多已经是扩展方法了.比如linq中对序列使用的查询语句, where, select等 ...
- Tag Helpers in forms in ASP.NET Core
Tag Helpers in ASP.NET Core Tag Helpers in forms in ASP.NET Core HTML Form element ASP.NET Core buil ...
- jquery.validate使用详解
一.简单应用实例: 1.用class样式进行验证,用法简单,但不能自定义错误信息,只能修改jquery-1.4.1.min.js中的内置消息,也不支持高级验证规则. <script type=& ...
- ASP.NET —— Web Pages
为简单起见,新建一个空的web工程,再新建一个MVC的视图(.cshtml),因为WP是单页面模型,所以以后就在这个页面中进行试验. Razor语法简介: 变量可用var或者其确切类型声明. 遍历fo ...
- 点击返回上一页 wx.navigateTo不管用了
做跳转的时候,发现想返回上一页,但是这个上一页又是tab上的页面,返回不了怎么办呢 wx.navigateTo({ url: '../search/search', }) 解决方法: wx.reL ...
- eureka 和zookeeper 区别 优势【转】
作为服务注册中心,Eureka比Zookeeper好在哪里 著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的, ...