题意:求树上的一条费用不超过m的路径,使得总长度尽量大。

人参第一发树分治,紫书上思路讲得比较清晰,这里不再赘述。

实现的时候,用一个类似时间戟的东西,记录结点首次访问的时间,并保存结点序列。

合并的时候用map组织有序表。和Defense Lines类似

复杂度O(nlog^2n)

#include<bits/stdc++.h>
using namespace std;const int maxn = 3e4+5;
int n,m;
int hd[maxn], nx[maxn<<1], to[maxn<<1], dam[maxn<<1], len[maxn<<1], ec;inline void add(int u,int v,int D,int L)
{to[ec] = v;dam[ec] = D;len[ec] = L;nx[ec] = hd[u];hd[u] = ec++;
}int root, best;
int ct[maxn];
//best = n
void GetBaryCenter(int u,int f)
{ct[u] = 1;int Mx = 0;for(int i = hd[u]; ~i; i = nx[i]){if(to[i] != f){GetBaryCenter(to[i], u);ct[u] += ct[to[i]];Mx = max(Mx,ct[to[i]]);}}Mx = max(Mx,n-ct[u]);if(Mx < best){best = Mx;root = u;}
}#define MP make_pair
#define fi first
#define se second
int C[maxn], L[maxn];map<int,int> mp;
map<int,int>::iterator it;int ans;
int path[maxn];
int pre[maxn], dfs_clk;
//dfs_clk = 0, ans = 0;
void dfs(int u = root,int f = 0)
{path[dfs_clk] = u;pre[u] = dfs_clk++;C[u] = 0; L[u] = 0;for(int i = hd[u]; ~i; i = nx[i]){if(to[i] != f){int v = to[i];dfs(v,u);for(int j = pre[v]; j < dfs_clk ; j++){int x = path[j];C[x] += dam[i];L[x] += len[i];}}}//子树都访问完里以后统一处理以保证互不干扰,这样mp就可以设置为全局变量
    mp.clear();for(int i = hd[u]; ~i; i = nx[i]){int nex = nx[i];int lim = ~nex? pre[to[nex]] : dfs_clk;if(to[i] != f){int v = to[i];for(int j = pre[v]; j < lim ; j++){int x = path[j];if(C[x] <= m){ans = max(ans,L[x]);it = mp.upper_bound(m-C[x]);//找到一个key <= C[x]if(it != mp.begin()){ans = max(ans,(--it)->second+L[x]);}}}for(int j = pre[v]; j < lim ; j++){int x = path[j];if(C[x] <= m){it = mp.lower_bound(C[x]);bool swc = false;if(it == mp.begin() || (swc = true , L[x] > (--it)->se) ){if(swc) it++;while(it != mp.end() && it->se <= L[x]) mp.erase(it++);if(it == mp.end() || it->fi > C[x]) {//lower_bound可能使得it指向key == C[x] 而 val >= L[x]
                            mp.insert(MP(C[x],L[x]));}}}}}}
}//#define LOCAL
int main()
{
#ifdef LOCALfreopen("in.txt","r",stdin);
#endifint T, ks = 0; cin>>T;while(T--){scanf("%d%d",&n,&m);memset(hd+1,-1,sizeof(int)*n); ec = 0;for(int i = n; --i;){int a,b,D,L; scanf("%d%d%d%d",&a,&b,&D,&L);add(a,b,D,L); add(b,a,D,L);}best = n+1;GetBaryCenter(1,0);dfs_clk = ans = 0;dfs();printf("Case %d: %d\n",++ks,ans);}return 0;
}

转载于:https://www.cnblogs.com/jerryRey/p/4858608.html

UVA 12161 Ironman Race in Treeland (树分治)相关推荐

  1. UVA 12161 Ironman Race in Treeland

    题目大意: 每一条边都有两个权值,val和路径长度d,要保证在val<=m 的条件下,求最长的d. 解题报告: 一开始想错了,后来发现还不如直接暴力点分,思想很套路.. 平时我们统计时,都会用合 ...

  2. 点分治(树分治)详解

    作者: hsez_yyh 链接:https://blog.csdn.net/yyh_getAC/article/details/126696654 来源:湖北省黄石二中信息竞赛组        著作权 ...

  3. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  4. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  5. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  6. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  7. POJ 1741 树分治

    题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...

  8. uva 10627 - Infinite Race(数论)

    题目链接:uva 10627 - Infinite Race 题目大意:一段路.两个人在这条路上来回走,求相遇次数 解题思路:相遇有两种,一种是追击,一种是相对 追击:t∗(u−v)=(2∗k+1)∗ ...

  9. POJ1741:Tree——题解+树分治简要讲解

    http://poj.org/problem?id=1741 题目大意:给一棵树,求点对间距离<=k的个数. -------------------- 以这道题为例记录一下对于树分治的理解. 树 ...

  10. 3237: [Ahoi2013]连通图 线段树分治

    题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...

最新文章

  1. django 模板语言之 simple_tag 自定义模板
  2. HTML/CSS——子元素相对于父元素固定定位解决方案
  3. python数据库在哪_python可以用哪些数据库
  4. Spring Data对Cassandra 3的支持
  5. 织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题
  6. 浅谈文字识别:新观察、新思考、新机遇
  7. Weblogic以及Tomcat登录认证
  8. vue 中样式的绑定
  9. CRM中复制记录的方法
  10. R语言ETL工程:插入与合并(add/bind)
  11. 阿里云centos7上yum安装并连接mysql
  12. iOS 9 Safari广告拦截插件
  13. Hybrid App基础知识
  14. wordcloud----canvas 绘制标签云/词云web版wordle(一)
  15. 如何批量下载央视CNTV的节目视频
  16. C++(35)——判断一个数能否同时被3和5整除
  17. EC20 centos7 调试_CentOS 7实现离线下载
  18. ArcGIS制作矢量动图
  19. Google的搜索来源分布跟踪解读:GGGL与GGLD,sourceid和client,rlz,rls等
  20. WordPress优化教程大全

热门文章

  1. Docker教程小白实操入门(21)--如何备份、恢复数据卷
  2. mysql 清除主从_mysql主从同步及清除信息
  3. html播放器加选集,推荐:非常详细的网页播放器之代码篇(精选集一)
  4. 前端----JQuery
  5. cactiez mysql_cactiez v11添加对mysql数据库、apache系统进行监控
  6. oracle设置保存时间为12或是24小时格式
  7. HTML5 前端原生 WebSocket 通信
  8. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类...
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_4_练习_递归打印多级目录...
  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_6_File类判断功能的方法...