记录编号 454464 评测结果 AAAAAAAAAAAAAAAA
题目名称 [IOI 2011] Race 最终得分 100
用户昵称 GravatarCooook 是否通过 通过
代码语言 C++ 运行时间 3.019 s
提交时间 2017-09-28 21:30:58 内存使用 13.48 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <stdio.h>
  5. #define MAXN 200005ul
  6. #define MAXM 1000005ul
  7. #define inf 0x3f3f3f3f
  8. int f[MAXN],mn[MAXM],size[MAXN],dis[MAXN],root,first[MAXN],Ans = inf,num,e = 1,n,k;
  9. bool vis[MAXN];
  10. template<typename _t>
  11. inline _t read(){
  12. _t x=0,f=1;
  13. char ch=getchar();
  14. for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-f;
  15. for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+(ch^48);
  16. return x*f;
  17. }
  18. struct edge{
  19. int u,v,w,next;
  20. }a[MAXN<<1];
  21. inline void push(int u,int v,int w){
  22. a[e].u = u;a[e].v = v;a[e].w = w;
  23. a[e].next = first[u]; first[u] = e++;
  24. }
  25. inline void G_root(int u,int fa){
  26. size[u] = 1;f[u] = 0;
  27. for(int i = first[u];i;i = a[i].next) {
  28. register int v = a[i].v;
  29. if(vis[v] || v == fa) continue;
  30. G_root(v,u);
  31. size[u] += size[v];
  32. f[u] = std::max(f[u],size[v]);
  33. }
  34. f[u] = std::max(f[u],num - f[u]);
  35. if(f[u] < f[root]) root = u;
  36. }
  37. inline void U(int u,int fa,int QWQ){
  38. if(dis[u] <= k)
  39. Ans = std::min(Ans,mn[k - dis[u]] + QWQ);
  40. for(int i = first[u];i;i=a[i].next)
  41. if(!vis[a[i].v] && a[i].v != fa)dis[a[i].v] = dis[u] + a[i].w, U(a[i].v,u,QWQ+1);
  42. }
  43. inline void A(int u,int fa,int QWQ){
  44. if(dis[u] <= k)
  45. mn[dis[u]] = std::min(mn[dis[u]],QWQ);
  46. for(int i = first[u];i;i=a[i].next)
  47. if(!vis[a[i].v] && a[i].v != fa) A(a[i].v,u,QWQ+1);
  48. }
  49. inline void erase(int u,int fa){
  50. if(dis[u] <= k) mn[dis[u]] = inf;
  51. for(int i = first[u];i;i = a[i].next)
  52. if(!vis[a[i].v] && a[i].v != fa) erase(a[i].v,u);
  53. }
  54. inline void Calc(int u){
  55. dis[u] = 0;
  56. for(int i = first[u];i;i = a[i].next)
  57. if(!vis[a[i].v]) dis[a[i].v] = a[i].w,U(a[i].v,u,1),A(a[i].v,u,1);
  58. for(int i = first[u];i;i = a[i].next)
  59. if(!vis[a[i].v]) erase(a[i].v,u);
  60. return;
  61. }
  62. inline void dfs(int u){
  63. vis[u] = 1; mn[0] = 0; Calc(u);
  64. for(int i = first[u];i;i = a[i].next) {
  65. register int v = a[i].v;
  66. if(vis[v]) continue;
  67. num = size[a[i].v]; root = 0;
  68. G_root(a[i].v,0);
  69. dfs(root);
  70. }
  71. }
  72. int main(){
  73. freopen("ioi2011-race.in","r",stdin);
  74. freopen("ioi2011-race.out","w",stdout);
  75. int size = 128 << 20;
  76. char *p = (char*)malloc(size) + size;
  77. __asm__("movl %0, %%esp\n" :: "r"(p));
  78. n = read<int>(); k = read<int>();
  79. for(int i = 1;i<n;i++) {
  80. int u = read<int>() + 1 ,v = read<int>() + 1,w = read<int>();
  81. push(u,v,w); push(v,u,w);
  82. }
  83. memset(mn,0x3f,sizeof mn); mn[0] = 0; num = n;
  84. root = 0;f[0] = inf; G_root(1,0); dfs(root);
  85. printf("%d\n",Ans == inf?-1:Ans);
  86. // getchar(); getchar();
  87. return 0;
  88. }