[IOI2011]Race $O(nlog^{2}n)$ 做法
这个应该还不是正解,明天看一下正解到底是什么...
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 500000
#define inf 0x7f7f7f
using namespace std;
char *q1,*q2,buf[1000000];
#define nc() (q1==q2&&(q2=(q1=buf)+fread(buf,1,1000000,stdin),q1==q2)?EOF:*q1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
int hd[maxn],to[maxn],nex[maxn],val[maxn],f[maxn],vis[maxn],siz[maxn],dep[maxn],ans,cur=0;
int cnt,n,k,root,sn,d[2];
void addedge(int u,int v,int c)
{
nex[++cnt] = hd[u],hd[u] = cnt,to[cnt] = v,val[cnt] = c;
}
struct Point{
int dis,tot;
Point(int dis = 0,int tot = 0):dis(dis),tot(tot){}
bool operator<(Point b)const{
return b.dis != dis ? b.dis>dis : b.tot > tot;
}
}point[2][maxn],pp[maxn];
void getdis(int u,int fa,int tot)
{
if(!u) return;
point[cur][++d[cur]]=Point(dep[u],tot);
for(int i = hd[u]; i ; i = nex[i])
{
if(vis[to[i]] || to[i] == fa) continue;
dep[to[i]] = dep[u] + val[i],getdis(to[i],u,tot + 1);
}
}
void GetRoot(int u,int ff)
{
siz[u] = 1,f[u] = 0;
for(int i = hd[u]; i ; i = nex[i])
{
if(vis[to[i]] || to[i] == ff) continue;
GetRoot(to[i],u);
siz[u] += siz[to[i]];
f[u] = max(f[u], siz[to[i]]);
}
f[u] = max(f[u], sn - siz[u]);
if(f[u] < f[root]) root = u;
}
void DFS(int u)
{
//calc
d[cur^1]=d[cur]=0,vis[u]=1;
point[cur^1][++d[cur^1]]=Point(0,0);
for(int i = hd[u],j,m,p1,p2; i ; i = nex[i])
{ if(vis[to[i]]) continue;
dep[to[i]]=val[i];
getdis(to[i],u,1);
sort(point[cur]+1,point[cur]+1+d[cur]);
m = 1;
for(j = 2;j <= d[cur]; ++j)
if(point[cur][j].dis!=point[cur][j-1].dis) point[cur][++m]=point[cur][j];
d[cur] = m,p1 = 1,p2 = d[cur^1];
while(p1 <= d[cur] && p2 >=1)
{
if(point[cur][p1].dis + point[cur^1][p2].dis == k)
ans = min(ans,point[cur][p1].tot + point[cur^1][p2].tot), ++p1,--p2;
if(point[cur][p1].dis + point[cur^1][p2].dis < k) ++p1;
if(point[cur][p1].dis + point[cur^1][p2].dis > k) --p2;
}
for(j = 1;j <= d[cur]; ++j) point[cur^1][++d[cur^1]] = point[cur][j];
sort(point[cur^1]+1,point[cur^1]+1+d[cur^1]);
m = 1;
for(j=2;j<=d[cur^1];++j)
if(point[cur^1][j].dis!=point[cur^1][j-1].dis)point[cur^1][++m]=point[cur^1][j];
d[cur^1]=m, d[cur]=0;
}
for(int i = hd[u]; i ; i = nex[i])
{
if(vis[to[i]]) continue;
root = 0,sn = siz[to[i]],GetRoot(to[i],u), DFS(root);
}
}
int main()
{ // setIO("input");
n=rd(),k=rd();
for(int i = 1,a,b,c;i < n; ++i) a=rd(),b=rd(),c=rd(),addedge(a+1,b+1,c),addedge(b+1,a+1,c);
ans = inf, vis[0] = 1,f[0] = inf,sn = n,root = 0, GetRoot(1,0);
DFS(root);
printf("%d\n",ans==inf?-1:ans);
return 0;
}
[IOI2011]Race $O(nlog^{2}n)$ 做法的更多相关文章
- [IOI2011]Race
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...
- 2599: [IOI2011]Race
2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...
- BZOJ2599 [IOI2011]Race
传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...
- BZOJ2599——[IOI2011]Race
0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的 ...
- bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race
两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...
- [Luogu4149][IOI2011]Race
BZOJ权限题qwq Luogu sol 树上路径当然是淀粉质辣! 考虑所有过重心的路径.开一个\(10^6\)大小的数组\(t\)表示某一路径长度的最小边数,初始化为\(inf(i>0)\), ...
- Luogu4149:[IOI2011]Race
题目 bzoj权限题... Luogu Sol 点分治辣,边权非负,k>=1,开个\(1e6\)的桶就好辣 # include <bits/stdc++.h> # define RG ...
- P4149 [IOI2011]Race
对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...
- bzoj千题计划160:bzoj2599: [IOI2011]Race
http://www.lydsy.com/JudgeOnline/problem.php?id=2599 点分治 mi[i] 记录边权和为i时的最少边数 先更新答案,再更新mi数组,换根时清空mi # ...
随机推荐
- redis liunx系统安装
同事总结非常好,借鉴一下 原文地址:https://www.cnblogs.com/dslx/p/9291535.html redis安装 下载redis的安装包上传到Linux服务器,安装包如下 h ...
- elasticsearch实战 中文+拼音搜索
需求 雪花啤酒 需要搜索雪花.啤酒 .雪花啤酒.xh.pj.xh啤酒.雪花pj ik导入 参考https://www.cnblogs.com/LQBlog/p/10443862.html,不需要修改 ...
- lca学习题
http://www.cnblogs.com/scau20110726/archive/2013/06/14/3135095.html
- Java 学习(8):java 方法
Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 命名规则: 1. 必须以 字母.'_'或'$'开头. ...
- Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)
1.前言 对于Long 类型的数据,如果我们在Controller层通过@ResponseBody将返回数据自动转换成json时,不做任何处理,而直接传给前端的话,在Long长度大于17位时会出现精度 ...
- 洛谷 P2728 纺车的轮子 Spinning Wheels
P2728 纺车的轮子 Spinning Wheels 题目背景 一架纺车有五个纺轮(也就是五个同心圆),这五个不透明的轮子边缘上都有一些缺口.这些缺口必须被迅速而准确地排列好.每个轮子都有一个起始标 ...
- POJ 3076
DLX算法,刚接触,是关于精确覆盖的,白书上有算法介绍. 代码模板 #include <iostream> #include <cstdio> #include <cst ...
- macOS10.9+xcode6编译ffmpeg2.4.2 for ios
近期须要用到ffmpeg开发视频相关.在网上找了些编译资源,自己摸索着,总算编译ok了. 因此,记录下苦逼的编译过程,已祭奠我为之逝去的青春. 1.准备工作 首先.到ffmpeg官网下载最新到代码. ...
- SQL SERVER读书笔记:执行计划
执行计划对性能影响甚大. 系统是怎么得出一个号的执行计划的?主要是依赖于准确的统计信息.统计信息准确的前提下,执行语句重用性高,可避免频繁编译,这也有助于提高性能. 但如果怀疑统计信息不够准确,可以强 ...
- NET中的池
NET中的各种池 在.NET中,常用到的池有四个:字符串拘留池.线程池 .应用程序池.数据库连接池. 字符串拘留池 在.NET中字符串是不可变对象,修改字符串变量的值会产生新的对象.为降低性能消耗及减 ...