题解:

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二分用的不多应该不太会想到。。

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

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for(int i=h;i<=t;i++)
#define dep(i,t,h) for(int i=t;i>=h;i--)
#define ll long long
#define me(x) memset(x,0,sizeof(x))
#define mep(x,y) memcpy(x,y,sizeof(y))
#define mid (t<=0?(h+t-1)/2:(h+t)/2)
namespace IO{
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T> void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
char sr[<<],z[]; ll Z,C1=-;
template<class T>void wer(T x)
{
if (x<) sr[++C1]='-',x=-x;
while (z[++Z]=x%+,x/=);
while (sr[++C1]=z[Z],--Z);
}
IL void wer1()
{
sr[++C1]=' ';
}
IL void wer2()
{
sr[++C1]='\n';
}
template<class T>IL void maxa(T &x,T y) {if (x<y) x=y;}
template<class T>IL void mina(T &x,T y) {if (x>y) x=y;}
template<class T>IL T MAX(T x,T y){return x>y?x:y;}
template<class T>IL T MIN(T x,T y){return x<y?x:y;}
};
using namespace IO;
const int N=;
const int N2=1.5e5;
const int INF=1e9;
struct re{
int a,b,c;
}e[N2*];
int l,head[N2];
int f[N][N][],g[N][N][],g1[N][],num[N],n,m,k;
void arr(int x,int y,int z)
{
e[++l].a=head[x];
e[l].b=y;
e[l].c=z;
head[x]=l;
}
struct query2{
int f[N2][][],g[N2][][],g1[][],num[N2];
void dfs(int x,int y)
{
num[x]=;
g[x][][]=g[x][][]=g[x][][]=-INF;
for (rint u=head[x];u;u=e[u].a)
{
int v=e[u].b;
if (v!=y)
{
dfs(v,x);
rep(i,,MIN(k,num[x]))
g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][];
dep(i,MIN(k,num[x]),)
dep(j,MIN(k,num[v]),)
if (i+j-<=k)
{
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
}
num[x]+=num[v];
}
}
rep(i,,MIN(num[x],k))
f[x][i][]=MAX(g[x][i][],g[x][i][]),
f[x][i][]=MAX(g[x][i][],g[x][i][]);
}
}S;
void dfs(int x,int y)
{
num[x]=;
g[x][][]=g[x][][]=g[x][][]=-INF;
for (rint u=head[x];u;u=e[u].a)
{
int v=e[u].b;
if (v!=y)
{
dfs(v,x);
rep(i,,num[x])
g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][];
dep(i,MIN(k,num[x]),)
dep(j,MIN(k,num[v]),)
if (i+j-<=k)
{
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
}
num[x]+=num[v];
}
}
rep(i,,MIN(num[x],k))
f[x][i][]=MAX(g[x][i][],g[x][i][]),
f[x][i][]=MAX(g[x][i][],g[x][i][]);
}
int main()
{
read(n); read(k);
rep(i,,n-)
{
int x,y,z;
read(x); read(y); read(z);
arr(x,y,z); arr(y,x,z);
}
if (k==)
{
S.dfs(,);
cout<<MAX(S.f[][k][],S.f[][k][])<<endl;
} else
{
dfs(,);
cout<<MAX(f[][k][],f[][k][])<<endl;
}
return ;
}
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for(int i=h;i<=t;i++)
#define dep(i,t,h) for(int i=t;i>=h;i--)
#define ll long long
#define me(x) memset(x,0,sizeof(x))
#define mep(x,y) memcpy(x,y,sizeof(y))
#define mid (t<=0?(h+t-1)/2:(h+t)/2)
namespace IO{
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T> void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
char sr[<<],z[]; ll Z,C1=-;
template<class T>void wer(T x)
{
if (x<) sr[++C1]='-',x=-x;
while (z[++Z]=x%+,x/=);
while (sr[++C1]=z[Z],--Z);
}
IL void wer1()
{
sr[++C1]=' ';
}
IL void wer2()
{
sr[++C1]='\n';
}
template<class T>IL void maxa(T &x,T y) {if (x<y) x=y;}
template<class T>IL void mina(T &x,T y) {if (x>y) x=y;}
template<class T>IL T MAX(T x,T y){return x>y?x:y;}
template<class T>IL T MIN(T x,T y){return x<y?x:y;}
};
using namespace IO;
const int N=;
const int N2=3.1e5;
const int INF=1e9;
struct re{
int a,b,c;
}e[N2*];
int l,head[N2];
int f[N2][N][],g[N2][N][],g1[N2][],num[N2],n,m,k;
void arr(int x,int y,int z)
{
e[++l].a=head[x];
e[l].b=y;
e[l].c=z;
head[x]=l;
}
void dfs(int x,int y)
{
num[x]=;
g[x][][]=g[x][][]=g[x][][]=-INF;
for (rint u=head[x];u;u=e[u].a)
{
int v=e[u].b;
if (v!=y)
{
dfs(v,x);
rep(i,,MIN(k,num[x]))
g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][],g1[i][]=g[x][i][];
dep(i,MIN(k,num[x]),)
dep(j,MIN(k,num[v]),)
if (i+j-<=k)
{
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
maxa(g[x][i+j][],g1[i][]+MAX(f[v][j][],f[v][j][]));
if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
if (i>&&j>) maxa(g[x][i+j-][],g1[i][]+f[v][j][]+e[u].c);
}
num[x]+=num[v];
}
}
rep(i,,MIN(num[x],k))
f[x][i][]=MAX(g[x][i][],g[x][i][]),
f[x][i][]=MAX(g[x][i][],g[x][i][]);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
read(n); read(k); k++;
rep(i,,n-)
{
int x,y,z;
read(x); read(y); read(z);
arr(x,y,z); arr(y,x,z);
}
dfs(,);
cout<<MAX(f[][k][],f[][k][])<<endl;
return ;
}

[八省联考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. error:Microsoft Visual C++ 14.0 is required.

    1,下载14.0安装包,解压,再次执行pip install XX命令 2,安装包已经在下载文件中 3,最不行找这个网站 https://www.microsoft.com/zh-cn/downloa ...

  2. 有关swiper动态改变数据遇到的坑(不能自动滚动,自动跟新数据,切换不正常)

    以前都觉得swiper的使用很简单,那是因为使用swiper时都是写的数据,按照官网上介绍直接初始化swiper,随便丢一个地方初始化就ok了,但是在很多需求中,我们都需要动态的改变数据,这样可能就会 ...

  3. mpvue——API请求封装(小程序原生)

    前言 能用,但不是最好的方法,最好的还是fly,因为为了以后多平台的考虑,最好使用fly.js,做之前先关闭校验合法域名,因为我没在后台进行配置 后台进行配置合法域名,按着官方给的配置就OK了,这里就 ...

  4. MYSQL IN 出现的慢查询问题

    IN = https://blog.csdn.net/solmyr_biti/article/details/54293492 https://www.cnblogs.com/wxw16/p/6105 ...

  5. 「POJ2891」Strange Way to Express Integers【数学归纳法,扩展中国剩余定理】

    题目链接 [VJ传送门] 题目描述 给你\(a_1...a_n\)和\(m_1...m_n\),求一个最小的正整数\(x\),满足\(\forall i\in[1,n] \equiv a_i(mod ...

  6. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

  7. Redux Counter Vanilla example

    此示例不需要构建系统或视图框架,并且存在以显示与ES5一起使用的原始Redux API. 代码如下 <!DOCTYPE html> <html> <head> &l ...

  8. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

  9. Python之路(第十七篇)logging模块

    一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变 ...

  10. 分布式监控系统开发【day38】:报警策略设计(二)

    一.策略和动作多对多的好处坏处 1.好处: 相同服务,相同策略的服务可以不用重复写好多次触发器 2.坏处: 1.策略A给小李和小罗发邮件2.策略B给小胡和小崔发邮件3.策略A是第三部发邮件4.策略B是 ...