Atcoder
vjudge

这标题好长...


\(Description\)

给定一棵\(n\)个点的树。在每个点\(i\)你可以补充\(g_i\)的油量,经过一条边需要花费边长的油量。你可以选择从任意一个点出发,任意在树上走直到油量耗尽或不能走(不能重复经过同一个点)。求最多能经过多少个点。
\(n\leq10^5\)。

\(Solution\)

点分治。对每个分治重心\(rt\),求出从\(rt\)到子树内某个点至少需要多少初始油量、从子树内某个点到\(rt\),会剩下多少油量。然后sort一下合并即可。注意不要合并来自同一棵子树内的路径,记两个来自不同子树的最大值就行了。


//129ms 14336KB
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 400000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5,INF=1<<30;int Ans,Enum,H[N],nxt[N<<1],to[N<<1],len[N<<1],A[N],Min,root,sz[N],cnt1,cnt2;
bool vis[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Node
{int s,dep,bel;bool operator <(const Node &x)const{return s<x.s;//按s排序啊(我怎么按dep了mdzz)}
}f[N],g[N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now;
}
inline void AE(int w,int u,int v)
{to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, len[Enum]=w;to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, len[Enum]=w;
}
void FindRoot(int x,int fa,int tot)
{int mx=0; sz[x]=1;for(int i=H[x],v; i; i=nxt[i])if(!vis[v=to[i]]&&v!=fa) FindRoot(v,x,tot), sz[x]+=sz[v], mx=std::max(mx,sz[v]);mx=std::max(mx,tot-sz[x]);if(mx<Min) Min=mx, root=x;
}
void DFS(int x,int fa,int need,int need2,int sum,int dep,int anc)
{//need:v->x当前点至少需要要有多少油量 rest:v->x会剩下多少油量 need2:x->v最少需要多少起始油量 sum:x->v一共多少油量 rest=A[root]+sumg[++cnt2]=(Node){need2,dep,anc}, sum+=A[x];if(A[x]>=need) f[++cnt1]=(Node){sum,dep+1,anc};for(int i=H[x],v,w; i; i=nxt[i])if(!vis[v=to[i]]&&v!=fa)w=len[i], DFS(v,x,w+std::max(0,need-A[x]),std::max(need2,w-sum),sum-w,dep+1,anc);
}
void Solve(int x)
{vis[x]=1, cnt1=cnt2=1, f[1]=(Node){0,1,0}, g[1]=(Node){0,0,0};for(int i=H[x],v; i; i=nxt[i])if(!vis[v=to[i]]) DFS(v,x,len[i],len[i],-len[i],1,v);for(int i=1,a=A[x]; i<=cnt1; ++i) f[i].s+=a;std::sort(f+1,f+1+cnt1), std::sort(g+1,g+1+cnt2);Node a=(Node){0,0,0},b=a;int res=0; g[cnt2+1].s=INF;for(int i=1,j=1; i<=cnt1; ++i){while(g[j].s<=f[i].s){if(g[j].dep>a.dep)if(g[j].bel!=a.bel) b=a, a=g[j];else a=g[j];else if(g[j].dep>b.dep && g[j].bel!=a.bel) b=g[j];++j;}if(f[i].bel!=a.bel) res=std::max(res,f[i].dep+a.dep);else res=std::max(res,f[i].dep+b.dep);}Ans=std::max(Ans,res);for(int i=H[x],v; i; i=nxt[i])if(!vis[v=to[i]]) Min=N, FindRoot(v,x,sz[v]), Solve(root);
}int main()
{int n=read();for(int i=1; i<=n; ++i) A[i]=read();for(int i=1; i<n; ++i) AE(read(),read(),read());Ans=1, Min=N, FindRoot(1,1,n), Solve(root), printf("%d\n",Ans);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10576150.html

JAG Practice Contest for ACM-ICPC Asia Regional 2016.K.Non-redundant Drive(点分治)相关推荐

  1. [Contest]2017 ACM/ICPC Asia Regional Shenyang Online(01 03 07 09 10 11待补)

    1001 string string string 题意 给定一个字符串$s$,求其中出现$k$次的子串的个数. 题解 后缀自动机. 代码 1002 cable cable cable 题意 给定$M ...

  2. The 36th ACM/ICPC Asia Regional Dalian Site 1006 Dave

    Dave Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65768/65768K (Java/Other) Total Submissi ...

  3. Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online

    网络赛:2017 ACM/ICPC Asia Regional Shenyang Online 题目来源:cable cable cable Problem Description: Connecti ...

  4. 2015 ACM/ICPC Asia Regional Shenyang Online题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABCFGJL A. Traversal AC的C++语言程序: #include <bits/stdc++. ...

  5. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

  6. 2014 ACM/ICPC Asia Regional Guangzhou Online C题Wang Xifeng's Little Plot(dfs)

    Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. HDU 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)...

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...

  8. The 37th ACM/ICPC Asia Regional HangZhou Site Online Contest - F

    本题通过率相当低....原因是绝大多数队都是直接贪心吧...找出A最小且B不为0的怪作为入口..可以将所有的B不为0的怪连起来...而中间的间隔可以把 B为0的怪干掉....最后再一一消灭 B 为0的 ...

  9. 2013 ACM/ICPC Asia Regional Chengdu Online We Love MOE Girls 字符串STL 的应用

    题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=4730 分析1:string s.substr(pos, n) 从 pos 开始 截取n个 字符 代码 ...

最新文章

  1. CocoaPods详解之----使用篇
  2. 寻求最佳开发模式,免得落得“精”尽人亡
  3. 5、MySQL修改数据库:ALTER DATABASE用法简介
  4. Boost:向上对齐align up integral的测试程序
  5. java todo error_java.sql.SQLException: sql injection violation, syntax error: TODO UNIQUE unique
  6. 大数据时代,如何用数据驱动精准营销
  7. c++语言中for循环语句,C++ 循环
  8. Android系统(96)---Android 数据交换解析框架Gson使用详解
  9. 直接拿来用!Google 新推 AI 模型打破了现有 CNN 技术壁垒
  10. Arcgis javascript那些事儿(十六)——GP服务的发布与使用
  11. 在内核中实现URL重定向
  12. H5 Laya 字体
  13. centos 7单网卡实现双路由,同时访问内外网
  14. excel 图表 保持矢量图格式 粘贴进word
  15. 路由器DNS被劫持的解决办法,dns被劫持怎么办?
  16. TDD--01--ATDD、UTDD
  17. 使用python爬取中国电影票房数据并写入csv文件
  18. ps照片处理器怎么打文字_什么是文字处理器?
  19. usdt钱包地址查询_钱包开发 - USDT - 一、Omni本地钱包安装
  20. 【渝粤题库】陕西师范大学210003幼儿保健学作业(高起专、专升本)

热门文章

  1. 数据库开发——MySQL——基本操作
  2. 【Linux系统编程】特殊进程之孤儿进程
  3. 【Linux网络编程】并发服务器的三种实现模型
  4. 【Ubuntu】ubuntu物理机安装方法:wubi
  5. ARM指令寻址方式之: 内存访问指令寻址
  6. 怎么判断前轮左右的位置_如何判定汽车前面左右轮的位置?大家有什么经验?...
  7. python中classmethod的用法_Python中的@classmethod是如何使用的?
  8. 语言的顺序表的合拼_2020语文中考专题五:语言运用和综合性学习。掌握基础题五种题型...
  9. mac m1下编译spring框架
  10. 记录kubesphere的安装与使用