CH4908 Race
题意
4908 Race 0x49「数据结构进阶」练习
描述
给定一棵 N 个节点的树,每条边带有一个权值。
求一条简单路径,路径上各条边的权值和等于K,且路径包含的边的数量最少。
输入格式
第一行两个整数 N, K。
第2~N行每行三个整数x,y,z,表示一条无向边的两个端点x,y和权值z,点的编号从0开始。
输出格式
一个整数,表示最少边数量。如果不存在满足要求的路径,输出-1。
样例输入
4 3
0 1 1
1 2 2
1 3 4
样例输出
2
数据范围与约定
- N <= 200000, K <= 1000000
来源
IOI2011
</article>
分析
训练指南的配套代码有问题,双指针绝对是错的。学习了hzwer的做法。
开一个100W的数组t,t[i]表示权值为i的路径最少边数
找到重心分成若干子树后, 得出一棵子树的所有点到根的权值和x,到根c条边,用t[k-x]+c更新答案,全部查询完后
然后再用所有c更新t[x]
这样可以保证不出现点分治中的不合法情况
把一棵树的所有子树搞完后再遍历所有子树恢复T数组,如果用memset应该会比较慢
时间复杂度\(O(n \log^2 n)\)
代码
网上好多代码,点分治递归的时候没有重新统计以重心为根的整棵树每个节点的size,按道理找出来的重心是错的,复杂度没有保证。
但是出题人根本就不会卡这种东西,所以不用写了,反而常数小。
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std;
typedef pair<int,int> pii;
co int N=2e5+1;
int n,k,ans,sum,root,max_size;
vector<pii> e[N];
int t[1000001],s[N],d[N],c[N],v[N];
void getroot(int x){
v[x]=1,s[x]=1;
int max_part=0;
for(int i=0,y;i<e[x].size();++i){
if(v[y=e[x][i].first]) continue;
getroot(y);
s[x]+=s[y],max_part=max(max_part,s[y]);
}
max_part=max(max_part,sum-s[x]);
if(max_part<max_size) root=x,max_size=max_part;
v[x]=0;
}
void cal(int x){
v[x]=1;
if(d[x]<=k) ans=min(ans,c[x]+t[k-d[x]]);
for(int i=0,y;i<e[x].size();++i){
if(v[y=e[x][i].first]) continue;
c[y]=c[x]+1,d[y]=d[x]+e[x][i].second;
cal(y);
}
v[x]=0;
}
void add(int x,int flag){
v[x]=1;
if(d[x]<=k){
if(flag) t[d[x]]=min(t[d[x]],c[x]);
else t[d[x]]=n;
}
for(int i=0,y;i<e[x].size();++i){
if(v[y=e[x][i].first]) continue;
add(y,flag);
}
v[x]=0;
}
void work(int x){
v[x]=1,t[0]=0;
for(int i=0,y;i<e[x].size();++i){
if(v[y=e[x][i].first]) continue;
c[y]=1,d[y]=e[x][i].second;
cal(y),add(y,1);
}
for(int i=0,y;i<e[x].size();++i){
if(v[y=e[x][i].first]) continue;
add(y,0);
}
for(int i=0,y;i<e[x].size();++i){
if(v[y=e[x][i].first]) continue;
sum=max_size=s[y];
getroot(y),work(root);
}
}
int main(){
// freopen(".in","r",stdin),freopen(".out","w",stdout);
read(n),read(k);
fill(t+1,t+k+1,n);
for(int i=1,u,v,w;i<n;++i){
read(u),read(v),read(w);
e[++u].push_back(pii(++v,w)),e[v].push_back(pii(u,w));
}
ans=sum=max_size=n;
getroot(1),work(root);
if(ans==n) puts("-1");
else printf("%d\n",ans);
return 0;
}
CH4908 Race的更多相关文章
- Promise.race
[Promise.race] 返回最先完成的promise var p1 = new Promise(function(resolve, reject) { setTimeout(resolve, 5 ...
- golang中的race检测
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...
- 【BZOJ-2599】Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 2590 Solved: 769[Submit][Status ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- Codeforces Round #131 (Div. 2) E. Relay Race dp
题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...
- 【多线程同步案例】Race Condition引起的性能问题
Race Condition(也叫做资源竞争),是多线程编程中比较头疼的问题.特别是Java多线程模型当中,经常会因为多个线程同时访问相同的共享数据,而造成数据的不一致性.为了解决这个问题,通常来说需 ...
- Codeforces Round #328 (Div. 2) C. The Big Race 数学.lcm
C. The Big Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/592/probl ...
- HDU 4123 Bob’s Race 树的直径 RMQ
Bob’s Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=41 ...
- [LOJ 1038] Race to 1 Again
C - Race to 1 Again Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu D ...
随机推荐
- 每天CSS学习之transform
transform是CSS3的一个属性,其作用是用来进行2D或3D变换. 一.2D变换 1. translate(x-offset , y-offset) translate的作用就是用作位置的移动. ...
- eclipse server和tomcat的区别,将server的部署目录改到自己安装的tomcat中及如何设置tomcat用户
转:http://www.cnblogs.com/Yogurshine/archive/2013/06/05/3118525.html 一.发现问题(如果不把项目部署到tomcat的webapp目录下 ...
- java泛型讲解
原文: https://blog.csdn.net/briblue/article/details/76736356 泛型,一个孤独的守门者. 大家可能会有疑问,我为什么叫做泛型是一个守门者.这其实是 ...
- 深入理解java虚拟机---内存分配策略(十三)
转载请注明原文地址:https://blog.csdn.net/initphp/article/details/30487407 Java内存分配策略 使用的ParNew+Serial Old收集器组 ...
- bootstrapTable--4.删除和批量删除
http://blog.csdn.net/qq_26553781/article/details/78058389 ------------------------------------------ ...
- Codeforces Round #496 (Div. 3 ) E1. Median on Segments (Permutations Edition)(中位数计数)
E1. Median on Segments (Permutations Edition) time limit per test 3 seconds memory limit per test 25 ...
- python基础初识介绍以及安装
python介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承. ...
- jetty404web界面服务器信息隐藏
jetty服务器报以上的404错误时,为了信息安全必须隐藏信息错误提示 在jetty的配置文件jetty.xml添加以下内容: 重启一下jetty服务器就OK了,在验证时是这样的:
- TDate赋值给Variant时注意的问题
//Delphi 10.3.1 32bit, Win 7 32bit procedure TForm1.btnTimeToVariantClick(Sender: TObject); var d:TD ...
- springboot区分开发、测试、生产多环境的应用配置
转:https://blog.csdn.net/daguairen/article/details/79236885 springboot区分开发.测试.生产多环境的应用配置(一) Spring可使用 ...