这个应该还不是正解,明天看一下正解到底是什么...

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)$ 做法的更多相关文章

  1. [IOI2011]Race

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...

  2. 2599: [IOI2011]Race

    2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...

  3. BZOJ2599 [IOI2011]Race

    传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...

  4. BZOJ2599——[IOI2011]Race

    0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的 ...

  5. bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race

    两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...

  6. [Luogu4149][IOI2011]Race

    BZOJ权限题qwq Luogu sol 树上路径当然是淀粉质辣! 考虑所有过重心的路径.开一个\(10^6\)大小的数组\(t\)表示某一路径长度的最小边数,初始化为\(inf(i>0)\), ...

  7. Luogu4149:[IOI2011]Race

    题目 bzoj权限题... Luogu Sol 点分治辣,边权非负,k>=1,开个\(1e6\)的桶就好辣 # include <bits/stdc++.h> # define RG ...

  8. P4149 [IOI2011]Race

    对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...

  9. bzoj千题计划160:bzoj2599: [IOI2011]Race

    http://www.lydsy.com/JudgeOnline/problem.php?id=2599 点分治 mi[i] 记录边权和为i时的最少边数 先更新答案,再更新mi数组,换根时清空mi # ...

随机推荐

  1. EXTJS之DATA PROXY READER

    这是不依赖于STORE的读取.我测试了很久,原来在新版本的EXTJS里.modelmanager.getmodel之类的不用了. 更改为静态的LOAD办法. <!DOCTYPE html> ...

  2. 洛谷—— P2647 最大收益

    https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,……,n.你可以在这当中任意选择任意多个物品.其中第i个物 ...

  3. PHP扩展开发--实验成功

    原文:http://kimi.it/496.html http://blog.csdn.net/u011957758/article/details/72234075 ---------------- ...

  4. HDOJ1796 How many integers can you find(dfs+容斥)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  5. 【cl】java变量

    知识点一: 变量:有声明,有初始化! 变量作用域:变量在声明的地方开始,到块结束(其中一对{}叫块) 变量不能重复声明(声明=定义):在同一个作用域中不能重复声明变量! 在作用域中如果已经有变量了,就 ...

  6. ios设计一部WindowsPhone手机

    ios设计一部WindowsPhone手机 main.m #import <Foundation/Foundation.h> #import "WindowsPhone.h&qu ...

  7. Android requires compiler compliance level 5.0 or 6.0. Found &#39;1.4&#39; instead的解决的方法

    今天在eclipse里报这个错误:   Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead. Plea ...

  8. C# Log4Net简单使用方法

    log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 使用log4net,一个很明显的好处 ...

  9. 从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化

    从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化 神经网络在训练过程中,为应对过拟合问题,可以采用正则化方法(regularization),一种常用的正则化方法是L2正则化. 神经网络中 ...

  10. 【转】Java的可变类与不可变类

    1.可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当你获得这个类的一个实例引用时,你可以改变这个实例的内容. 不可变类:当你获得这个类的一个实例引 ...