UVA 12161 Ironman Race in Treeland (树分治)
题意:求树上的一条费用不超过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 (树分治)相关推荐
- UVA 12161 Ironman Race in Treeland
题目大意: 每一条边都有两个权值,val和路径长度d,要保证在val<=m 的条件下,求最长的d. 解题报告: 一开始想错了,后来发现还不如直接暴力点分,思想很套路.. 平时我们统计时,都会用合 ...
- 点分治(树分治)详解
作者: hsez_yyh 链接:https://blog.csdn.net/yyh_getAC/article/details/126696654 来源:湖北省黄石二中信息竞赛组 著作权 ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- bzoj 4025 二分图——线段树分治+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...
- 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)
题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...
- 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解
题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...
- POJ 1741 树分治
题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...
- uva 10627 - Infinite Race(数论)
题目链接:uva 10627 - Infinite Race 题目大意:一段路.两个人在这条路上来回走,求相遇次数 解题思路:相遇有两种,一种是追击,一种是相对 追击:t∗(u−v)=(2∗k+1)∗ ...
- POJ1741:Tree——题解+树分治简要讲解
http://poj.org/problem?id=1741 题目大意:给一棵树,求点对间距离<=k的个数. -------------------- 以这道题为例记录一下对于树分治的理解. 树 ...
- 3237: [Ahoi2013]连通图 线段树分治
题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...
最新文章
- django 模板语言之 simple_tag 自定义模板
- HTML/CSS——子元素相对于父元素固定定位解决方案
- python数据库在哪_python可以用哪些数据库
- Spring Data对Cassandra 3的支持
- 织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题
- 浅谈文字识别:新观察、新思考、新机遇
- Weblogic以及Tomcat登录认证
- vue 中样式的绑定
- CRM中复制记录的方法
- R语言ETL工程:插入与合并(add/bind)
- 阿里云centos7上yum安装并连接mysql
- iOS 9 Safari广告拦截插件
- Hybrid App基础知识
- wordcloud----canvas 绘制标签云/词云web版wordle(一)
- 如何批量下载央视CNTV的节目视频
- C++(35)——判断一个数能否同时被3和5整除
- EC20 centos7 调试_CentOS 7实现离线下载
- ArcGIS制作矢量动图
- Google的搜索来源分布跟踪解读:GGGL与GGLD,sourceid和client,rlz,rls等
- WordPress优化教程大全
热门文章
- Docker教程小白实操入门(21)--如何备份、恢复数据卷
- mysql 清除主从_mysql主从同步及清除信息
- html播放器加选集,推荐:非常详细的网页播放器之代码篇(精选集一)
- 前端----JQuery
- cactiez mysql_cactiez v11添加对mysql数据库、apache系统进行监控
- oracle设置保存时间为12或是24小时格式
- HTML5 前端原生 WebSocket 通信
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_4_练习_递归打印多级目录...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_6_File类判断功能的方法...