题解:

zhcs的那个题基本上就是抄这个题的,不过背包的分数变成了70分。。

不过得分开来写。。因为两个数组不能同时满足

背包的话就是

$f[i][j][0/1]$表示考虑i子树,取j条链,能不能向上扩展的最大值

然后辅助数组$g[i][j][0/1/2/3]$表示考虑i子树,不取根,取根,取根连一条向下链,取根连两条向下链

然后代码非常好写(边界情况注意一下就可以了)

另外这个的时间复杂度$nk$分析是个比较套路的东西

我们转移的时候需要给j这一维$min$一个子树大小,不然就是$n*k^2$的了

由于看时间比较宽松。。我写的常数巨大。。感觉稍微卡卡可以快4-5倍

正解很简单,但是wqs二分用的不多应该不太会想到。。

因为感觉上这个是可以用其他来优化的

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rint register int
  4. #define IL inline
  5. #define rep(i,h,t) for(int i=h;i<=t;i++)
  6. #define dep(i,t,h) for(int i=t;i>=h;i--)
  7. #define ll long long
  8. #define me(x) memset(x,0,sizeof(x))
  9. #define mep(x,y) memcpy(x,y,sizeof(y))
  10. #define mid (t<=0?(h+t-1)/2:(h+t)/2)
  11. namespace IO{
  12. char ss[<<],*A=ss,*B=ss;
  13. IL char gc()
  14. {
  15. return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
  16. }
  17. template<class T> void read(T &x)
  18. {
  19. rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
  20. while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
  21. }
  22. char sr[<<],z[]; ll Z,C1=-;
  23. template<class T>void wer(T x)
  24. {
  25. if (x<) sr[++C1]='-',x=-x;
  26. while (z[++Z]=x%+,x/=);
  27. while (sr[++C1]=z[Z],--Z);
  28. }
  29. IL void wer1()
  30. {
  31. sr[++C1]=' ';
  32. }
  33. IL void wer2()
  34. {
  35. sr[++C1]='\n';
  36. }
  37. template<class T>IL void maxa(T &x,T y) {if (x<y) x=y;}
  38. template<class T>IL void mina(T &x,T y) {if (x>y) x=y;}
  39. template<class T>IL T MAX(T x,T y){return x>y?x:y;}
  40. template<class T>IL T MIN(T x,T y){return x<y?x:y;}
  41. };
  42. using namespace IO;
  43. const int N=;
  44. const int N2=1.5e5;
  45. const int INF=1e9;
  46. struct re{
  47. int a,b,c;
  48. }e[N2*];
  49. int l,head[N2];
  50. int f[N][N][],g[N][N][],g1[N][],num[N],n,m,k;
  51. void arr(int x,int y,int z)
  52. {
  53. e[++l].a=head[x];
  54. e[l].b=y;
  55. e[l].c=z;
  56. head[x]=l;
  57. }
  58. struct query2{
  59. int f[N2][][],g[N2][][],g1[][],num[N2];
  60. void dfs(int x,int y)
  61. {
  62. num[x]=;
  63. g[x][][]=g[x][][]=g[x][][]=-INF;
  64. for (rint u=head[x];u;u=e[u].a)
  65. {
  66. int v=e[u].b;
  67. if (v!=y)
  68. {
  69. dfs(v,x);
  70. rep(i,,MIN(k,num[x]))
  71. g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][];
  72. dep(i,MIN(k,num[x]),)
  73. dep(j,MIN(k,num[v]),)
  74. if (i+j-<=k)
  75. {
  76. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  77. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  78. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  79. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  80. if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
  81. if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
  82. }
  83. num[x]+=num[v];
  84. }
  85. }
  86. rep(i,,MIN(num[x],k))
  87. f[x][i][]=MAX(g[x][i][],g[x][i][]),
  88. f[x][i][]=MAX(g[x][i][],g[x][i][]);
  89. }
  90. }S;
  91. void dfs(int x,int y)
  92. {
  93. num[x]=;
  94. g[x][][]=g[x][][]=g[x][][]=-INF;
  95. for (rint u=head[x];u;u=e[u].a)
  96. {
  97. int v=e[u].b;
  98. if (v!=y)
  99. {
  100. dfs(v,x);
  101. rep(i,,num[x])
  102. g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][];
  103. dep(i,MIN(k,num[x]),)
  104. dep(j,MIN(k,num[v]),)
  105. if (i+j-<=k)
  106. {
  107. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  108. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  109. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  110. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  111. if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
  112. if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
  113. }
  114. num[x]+=num[v];
  115. }
  116. }
  117. rep(i,,MIN(num[x],k))
  118. f[x][i][]=MAX(g[x][i][],g[x][i][]),
  119. f[x][i][]=MAX(g[x][i][],g[x][i][]);
  120. }
  121. int main()
  122. {
  123. read(n); read(k);
  124. rep(i,,n-)
  125. {
  126. int x,y,z;
  127. read(x); read(y); read(z);
  128. arr(x,y,z); arr(y,x,z);
  129. }
  130. if (k==)
  131. {
  132. S.dfs(,);
  133. cout<<MAX(S.f[][k][],S.f[][k][])<<endl;
  134. } else
  135. {
  136. dfs(,);
  137. cout<<MAX(f[][k][],f[][k][])<<endl;
  138. }
  139. return ;
  140. }
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rint register int
  4. #define IL inline
  5. #define rep(i,h,t) for(int i=h;i<=t;i++)
  6. #define dep(i,t,h) for(int i=t;i>=h;i--)
  7. #define ll long long
  8. #define me(x) memset(x,0,sizeof(x))
  9. #define mep(x,y) memcpy(x,y,sizeof(y))
  10. #define mid (t<=0?(h+t-1)/2:(h+t)/2)
  11. namespace IO{
  12. char ss[<<],*A=ss,*B=ss;
  13. IL char gc()
  14. {
  15. return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
  16. }
  17. template<class T> void read(T &x)
  18. {
  19. rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
  20. while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
  21. }
  22. char sr[<<],z[]; ll Z,C1=-;
  23. template<class T>void wer(T x)
  24. {
  25. if (x<) sr[++C1]='-',x=-x;
  26. while (z[++Z]=x%+,x/=);
  27. while (sr[++C1]=z[Z],--Z);
  28. }
  29. IL void wer1()
  30. {
  31. sr[++C1]=' ';
  32. }
  33. IL void wer2()
  34. {
  35. sr[++C1]='\n';
  36. }
  37. template<class T>IL void maxa(T &x,T y) {if (x<y) x=y;}
  38. template<class T>IL void mina(T &x,T y) {if (x>y) x=y;}
  39. template<class T>IL T MAX(T x,T y){return x>y?x:y;}
  40. template<class T>IL T MIN(T x,T y){return x<y?x:y;}
  41. };
  42. using namespace IO;
  43. const int N=;
  44. const int N2=3.1e5;
  45. const int INF=1e9;
  46. struct re{
  47. int a,b,c;
  48. }e[N2*];
  49. int l,head[N2];
  50. int f[N2][N][],g[N2][N][],g1[N2][],num[N2],n,m,k;
  51. void arr(int x,int y,int z)
  52. {
  53. e[++l].a=head[x];
  54. e[l].b=y;
  55. e[l].c=z;
  56. head[x]=l;
  57. }
  58. void dfs(int x,int y)
  59. {
  60. num[x]=;
  61. g[x][][]=g[x][][]=g[x][][]=-INF;
  62. for (rint u=head[x];u;u=e[u].a)
  63. {
  64. int v=e[u].b;
  65. if (v!=y)
  66. {
  67. dfs(v,x);
  68. rep(i,,MIN(k,num[x]))
  69. g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][];
  70. dep(i,MIN(k,num[x]),)
  71. dep(j,MIN(k,num[v]),)
  72. if (i+j-<=k)
  73. {
  74. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  75. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  76. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  77. maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
  78. if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
  79. if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
  80. }
  81. num[x]+=num[v];
  82. }
  83. }
  84. rep(i,,MIN(num[x],k))
  85. f[x][i][]=MAX(g[x][i][],g[x][i][]),
  86. f[x][i][]=MAX(g[x][i][],g[x][i][]);
  87. }
  88. int main()
  89. {
  90. freopen("1.in","r",stdin);
  91. freopen("1.out","w",stdout);
  92. read(n); read(k); k++;
  93. rep(i,,n-)
  94. {
  95. int x,y,z;
  96. read(x); read(y); read(z);
  97. arr(x,y,z); arr(y,x,z);
  98. }
  99. dfs(,);
  100. cout<<MAX(f[][k][],f[][k][])<<endl;
  101. return ;
  102. }

[八省联考2018]林克卡特树lct的更多相关文章

  1. [八省联考2018]林克卡特树lct——WQS二分

    [八省联考2018]林克卡特树lct 一看这种题就不是lct... 除了直径好拿分,别的都难做. 所以必须转化 突破口在于:连“0”边 对于k=0,我们求直径 k=1,对于(p,q)一定是从p出发,走 ...

  2. LuoguP4383 [八省联考2018]林克卡特树lct

    LuoguP4383 [八省联考2018]林克卡特树lct https://www.luogu.org/problemnew/show/P4383 分析: 题意等价于选择\(K\)条点不相交的链,使得 ...

  3. 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)

    题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做“LCT” 的挑 ...

  4. 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)

    题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...

  5. P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分

    $ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...

  6. 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分

    题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...

  7. [BZOJ5252][八省联考2018]林克卡特树lct

    bzoj(上面可以下数据) luogu description 在树上选出\(k\)条点不相交的链,求最大权值. 一个点也算是一条退化的链,其权值为\(0\). sol 别问我为什么现在才写这题 首先 ...

  8. P4383 [八省联考2018]林克卡特树lct

    题目链接 题意分析 一句话题意就是 : 让你选出\((k+1)\)条不相交的链 使得这些链的边权总和最大 (这些链可以是点) 我们考虑使用树形\(DP\) \(dp[i][j][0/1/2]\)表示以 ...

  9. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

随机推荐

  1. Windows Server 2016 服务器总是有暴力破解密码导致的审核失败

    最近看了一下公司服务器的日志,在安全里,总是有审核失败,特别烦人,尝试密码特别弱智,总是用Administrator做用户名,不停的变换密码,真的烦,用户里面根本就没有Administrator,早就 ...

  2. ObjectARX® for Beginners: An Introduction

    转:ObjectARX® for Beginners: An Introduction Lee Ambrosius – Autodesk, Inc.         CP4164-L    Objec ...

  3. Day 3 下午

    依旧是组合数问题 先来看一道题 如图,一个n*m的方格中,从原点开始,每次只能向上走或者向右走,求走到点(n,m)共有多少种走法 一般做法: 一个一个写,每一个节点的种数=它左边的数量+右边的数量 显 ...

  4. python selenium简单安装及使用

    1.安装 pip install selenium 2.下载浏览器对应的Driver 链接地址:https://sites.google.com/a/chromium.org/chromedriver ...

  5. HMM隐马尔科夫算法(Hidden Markov Algorithm)初探

    1. HMM背景 0x1:概率模型 - 用概率分布的方式抽象事物的规律 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测. 概率模型(p ...

  6. 分布式监控系统开发【day37】:填充表配置项目(三)

    一.注册站点初始化数据库 1.目录结构 2.初始化数据库 python3 manage.py makemigrations python3 manage.py migrate #django2.0之前 ...

  7. LCA(Tarjan)

    时间复杂度:dfs为O(N),dfs过程中处理所有查询对为O(M),总时间复杂度O(N+M) #include<iostream> #include<cstdio> using ...

  8. 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)

    一. 监视锁(Monitor和lock) 1. Monitor类,限定线程个数的一把锁,两个核心方法: Enter:锁住某个资源. Exit:退出某一个资源. 测试案例:开启5个线程同时对一个变量进行 ...

  9. django - 总结 - cnblog 知识点

    1.图像预览 点击头像------>点击input img和input重合; img在label,input-->display:none $("#avatar").c ...

  10. 【Java】Java随手记

    System.out.printf() : System.out.printf("%d",x);               输出整数 System.out.printf(&quo ...