HDU 5293 Tree chain problem [树链剖分+线段树+树形DP]

HDU 5293 Tree chain problem(树形DP+树链剖分) 题意:一颗n节点树上有m条链,每条链有权重,求一个链的集合使权重和最大且两两不相交。 解析:令dp[i]为以i为根的子树的最大权重和。 如果i不在链上,则有dp[i] = sigma(dp[k]) k为i的子节点 如果i在某一条链(u,v,w)上,那么dp[i] = w + sigma(dp[k]) k为链上所有节点的子节点。对于该值,我们可以统计统计链上节点的所有子节点dp的和 - 链上节 阅读详情

Description

Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n. 
There are m chain on the tree, Each chain has a certain weight. Coco would like to pick out some chains any two of which do not share common vertices. 
Find out the maximum sum of the weight Coco can pick 


题意:给出N个点的树,M条树链,树链有权,问在取出的树链互不相交的情况下,权值和最大是多少。

解法:可以这么考虑,若某点作为一个点对X,Y的LCA,那么如果取了这条链,其子树的解最大是多少呢?

设DP[x]表示以x为根的子树中,取完以此点为lca的链后能取得的最大值。那么可以知道,取了某条链后(此链的lca为x)其能获得的最大值为 Σ DP[{son}] +W 其中{son}是此链的儿子集合(不包括链本身),那么我们可以dfs处理,dfs到某一个点x,处理以x点为lca的所有链,计算出取了每条链后能获得的值的最大值,将其赋值给dp[X]。

那么怎么求Σ DP[{son}] ? 我们可以这么处理:每次求出一个dp[X],将 -dp[X] 加到X点的VAL[],+dp[X]加到X点的父亲的VAL[],那么 Σ VAL[链上的点] 就是所求的答案。很明显,求链上点权和 可以用树链剖分+线段树写,复杂度为N*logN*logN。(实际上,因为此题没有修改,可以DFS序+树状数组快速处理 O(N*logN))

代码:(ZKW线段树 1200+MS)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#pragma comment(linker, "/STACK:1024000000,1024000000")
template <class T>
bool scanff(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
#define inf 1073741823
#define llinf 4611686018427387903LL
#define PI acos(-1.0)
#define lth (th<<1)
#define rth (th<<1|1)
#define rep(i,a,b) for(int i=int(a);i<=int(b);i++)
#define drep(i,a,b) for(int i=int(a);i>=int(b);i--)
#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)
#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)
#define mem(x,val) memset(x,val,sizeof(x))
#define mkp(a,b) make_pair(a,b)
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

#define NN 100100

struct node{
    int x,y,w;
}a[NN];
vector<node> q[NN];
int son[NN],sz[NN],top[NN],pos[NN],dep[NN],f[NN][20],pn;
int ptx[NN],lnum,dp[NN];
int n,qn;
struct edge{
    int v,next;
    edge(){}
    edge(int v,int next){
        this->v=v;
        this->next=next;
    }
}ed[NN*2];
void addline(int x,int y){
    ed[lnum]=edge(y,ptx[x]);
    ptx[x]=lnum++;
}
void init(int n){
    pn=lnum=0;
    rep(i,1,n)ptx[i]=-1;
    rep(i,1,n)q[i].clear();
}
//tree chain divide
int getson(int x,int fa){
    int val=0;
    son[x]=0;
    sz[x]=1;
    f[x][0]=fa;
    dep[x]=dep[fa]+1;
    gson(i,x){
        int y=ed[i].v;
        if(y==fa)continue;
        sz[x]+=getson(y,x);
        if(sz[y]>val){
            val=sz[y];
            son[x]=y;
        }
    }
    return sz[x];
}
void getchain(int r,int x,int fa){
    top[x]=r;
    pos[x]=++pn;
    if(son[x])getchain(r,son[x],x);
    gson(i,x){
        int y=ed[i].v;
        if(y==fa||y==son[x])continue;
        getchain(y,y,x);
    }
}
int lca(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    drep(i,16,0)if(dep[f[x][i]]>=dep[y])x=f[x][i];
    if(x==y)return x;
    drep(i,16,0)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
    return f[x][0];
}
//segment tree
int m,val[NN*4];
void build(int n){
    for(m=1;m<n+3;m<<=1);
    rep(i,1,m<<1)val[i]=0;
}
int query(int l,int r){
    int sum=0;
    for(l=l+m-1,r=r+m+1;l^r^1;l>>=1,r>>=1){
        if(~l&1)sum+=val[l^1];
        if(r&1) sum+=val[r^1];
    }
    return sum;
}
inline void update(int pos,int v){
    for(pos=pos+m;pos;pos>>=1)val[pos]+=v;
}
//solve
void calc(int z){
    int sz=q[z].size()-1;
    rep(i,0,sz){
        int x=q[z][i].x;
        int y=q[z][i].y;
        int w=q[z][i].w;
        while(top[x]!=top[y]){
            if(dep[top[x]]<dep[top[y]])swap(x,y);
            w+=query(pos[top[x]],pos[x]);
            x=f[top[x]][0];
        }
        if(dep[x]>dep[y])swap(x,y);
        w+=query(pos[x],pos[y]);
        dp[z]=max(w,dp[x]);
    }
    update(pos[z],-dp[z]);
    if(f[z][0])update(pos[f[z][0]],dp[z]);
}
void solve(int x,int fa){
    dp[x]=0;
    gson(i,x){
        int y=ed[i].v;
        if(y==fa)continue;
        solve(y,x);
        dp[x]+=dp[y];
    }
    calc(x);
}
int main(){
    tdata{
        scanff(n);scanff(qn);
        init(n);
        build(n);
        rep(i,1,n-1){
            int x;scanff(x);
            int y;scanff(y);
            addline(x,y);
            addline(y,x);
        }
        getson(1,0);
        getchain(1,1,0);
        rep(k,1,16)
        rep(i,1,n)f[i][k]=f[f[i][k-1]][k-1];
        rep(i,1,qn){
            scanff(a[i].x);
            scanff(a[i].y);
            scanff(a[i].w);
            q[lca(a[i].x,a[i].y)].pb(a[i]);
        }
        solve(1,0);
        printf("%d\n",dp[1]);
    }
}



极化码理论及算法研究6-SCL、CA-SCL及matlab仿真 极化码译码算法5——SCL/CA-SCL译码算法系列目录1、引言2、串行抵消列表(SCL)译码算法2.1、路径度量PM 系列目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 1、引言 在上一节中,介绍了经典的SC译码算法的理论原理以及其matlab仿真代码,SC译码算法具有较低的译码复杂度,但是由于每个译码的比特信息都依赖于前面所有的比特信息的译码结果,得 阅读详情

相关推荐

Unsloth Desktop 本地大模型微调量化实战指南

大语言模型的本地化定制正在成为开发者与内容创作者的重要需求,而微调与量化则是其中最关键的两项技术。LoRA 与 QLoRA 通过仅训练少量低秩矩阵,大幅降低显存占用和训练成本,让消费级 GPU 也能完成模型适配;GGUF 格式则打通了训练与推理的边界,使微调后的模型可直接接入 Ollama、llama.cpp 等主流推理引擎。本文以 Unsloth Desktop 为切入对象,从其底层加速原理出发,梳理了环境准备、模型加载、对话测试、量化导出、微调验证及 API 批量调用的完整链路,并针对显存优化、端口冲突

weixin_29055137的博客 397

HDU 5293 树链剖分 + 树形DP

题目链接题意: 给定有nn个节点的树和mm条链(链连接两个顶点,且有权值),要求选出一部分链,使连接以后图的每个圈没有公共节点,问能够选出的链的权值和最大为多少?考虑树形DP。对于当前顶点uu,假设dp[u]dp[u]为以uu为根节点的子树所能够达到的最大目标值。 另外定义: 1.ww为当前考虑的链权值。 2.sum[u]=∑dp[k]sum[u] = \sum dp[k](kk为uu的子节

新熊君的博客 538

告别瞎猜!用通达信L2资金流向函数,手把手教你识别主力动向(附实战公式)

本文详细解析通达信L2资金流向函数,手把手教你构建主力动向监控系统。通过分档数据解析、委买委卖攻防解读及实战公式应用,帮助投资者精准识别主力建仓与虚假拉升信号,提升股票交易决策效率。

weixin_26908317的博客 2075

HDU 5293(树链剖分)

(http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106364#problem/A) 题意:给定一棵树,一些链,选出最多的链不相交。 解法:定义 sum[u] = sim(dp[v]) ( v = son[u] ) dp[u]为u这颗子树,最多能选的链数。 当有一条链a,b,lca(a,b)=u

r_clover的博客 384

OpenWrt路由开启DDNS+端口转发进行外网访问

OpenWrt路由开启DDNS+端口转发进行外网访问(LuCI界面实现)--开篇一、准备工作二、开机!三、连接--结尾 –开篇 本篇适用于一切装有OpenWrt系统的路由器/软路由,只要你保证有WAN接口和一个光猫,甚至你不需要有LAN接口(当然前提是你能连接路由器的WIFI进后台,不然你只能通过LAN进后台咯)。所有的配置过程都是基于LuCI界面来的,当然大神们一般都通过SSH登陆路由使用命令配置,但我也不会啊,只能给个有GUI界面的教程了。 一、准备工作 一个装有OpenWrt系统的路由器/软路由并

秋之颂的博客 9万+

DINOv2 基于自定义数据集进行图片分类预测

(前提是安装好pytorch)1. pip安装2. 下载dinov2提供的预训练模型,需要自行前往网站上查找dinov2模型进行下载。模型需要下载三个文件:下载完成后将上述三个文件放置在本地一个名为dinov2_base的文件夹中即可。

sinat_34770838的博客 6665

HDU 5293(Tree chain problem-树链剖分)

Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 940    Accepted Submission(s): 248 Problem Description Coco has a tr

nike0good |Oier&ACMer | 熟能生巧 1099

4.DJI-PSDK云台x-port控制:

使用PSDK 的“云台控制”功能,开发者需要先设计负载设备的云台并开发出控制云台的程序,将云台的控制函数注册到PSDK 指定的接口后,用户通过使用DJI Pilot、基于MSDK 开发的移动端App 及遥控器即可控制基于PSDK 开发的具有云台功能的负载设备,同时获得负载设备的相关信息,如姿态等。云台的姿态如 图2.云台姿态 所示,根据用户的控制指令,云台能够调整姿态;云台的关节如 图1.云台关节 所示,云台关节是云台上带动负载设备转动的结构件:云台电机,云台关节角即云台电机转动的角度。

哒宰的博客 856

树形DP - hdu5293 Tree chain problem

题目: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给定一棵树,再给出若干树上的链,每条链拥有一个权值,问如何挑选这些链能使得权值之和最大,且被选中的链没有公共结点,求最大权值 思路: 看题解的过程中有看到用离线lca+时间戳+树形dp解法的,感觉那种解法会更加高大上...嗯不会离线lca所以这题用了树链剖分+线段

Keith_windniw的专栏 429

SAR图像去斑(Despeckling)研究的主流开源数据集

这些数据集专门用于训练监督学习去斑模型,提供了配对的含斑SAR图像和对应的无噪声参考图像(Ground Truth)。这些数据集主要用于目标检测/识别,但包含原始SAR图像,可用于。由于缺乏真实无噪声SAR图像,许多研究采用。

VectorShift的博客 128

YOLOv11 改进 - 注意力机制 | HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模

本文介绍了局部自注意力机制(HaloAttention)在YOLOv11中的结合应用。局部自注意力通过关注输入数据局部区域来捕捉特征关系,能降低计算复杂度、增强局部特征捕捉,且可与CNN结合。其计算时先定义局部窗口,再计算注意力权重并加权求和。我们将HaloAttention集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,改进后的模型在目标检测和实例分割等任务中表现更佳,证明了自注意力模型在传统卷积主导领域的有效性。

魔改工程师的博客 1140

HDU 5293 Tree chain problem 树形DP+LCA+树链剖分+线段树

Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,

JYZ's Blog 550

NR TA

这篇是NR TA的笔记,之前有对R17 NTN TA进行了简单总结,但是也仅仅局限在NTN部分,其他TA基本过程没有涉及,这篇是针对R16版本协议对NR TA相关内容做的总结。和PUSCH power control过程类似,NR TA也可以分为开环 和闭环调整,相关内容分散在38.300,38.211,38.213,38.321,38.133和38.331。后面就按照38.300 TA相关概念,38.211中有关TA定义,38.213 TA 相关内容,38.321 TA控制过程,38.133 Timi

ModemProtocol的博客 768

HDU 5293 Tree chain problem (树链剖分+LCA+树形DP)

#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define debug cout<<"YES\n"; #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #de...

满月照亮的路 233

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

hdu5293 Tree chain problem 树形dp+线段树

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5293 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大。 比赛的时候以为是树链剖分就果断没去想,其实是没思路。 看了题解,原来是树形dp,话说多校第一场树形dp还真多。。。。 维护d[i],表示以i为根节点的子树的最优答案。 sum[i]表示i的儿子节点(只能是

alpc_wt的专栏 1677

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

2015多校第一场1006 hdu 5293 Tree chain problem

题意:给定一棵树,然后在给定一些链,链放在树上某条路径上,每条链有价值,要求取链,并且所取的链不能相交,使得取得的链的总价值最大。 做法:树上做动态规划,开个dp[i]表示第i个点为根的子树里面的取链最大价值,sum[i]表示i的儿子节点的dp值得和。考虑取一条链时,把一条链的路径上的所有sum[i]-dp[i]加起来(lca那点只需把sum[i]加进去就好了)再加上这条链的价值,这样做的目的是

ZJiaQ1994的博客 531

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【HDU5293】Tree chain problem | 树形dp、LCA、树剖

题目大意: 给出一棵树,这棵树上分布着m条链,每条链都有一个权值,询问在保证选的链互不相交的情况下,最大的权值是多少 题目思路: en .. 卡了一晚上,卡到了lca,吐啦 首先将这m条链的lca求出来,把每条链的两个端点放到lca里面。 之后就可以进行树形dp了 令dp[i]表示,以i为根的子树选出不重复链的最大权值 那么对于一个根节点u,选择经过u的链,和不经过u的链两种选择: 如果不选择经过u的链:那么对于子树无限制,所以sum += dp[e] //e是u的孩子 如果选择经过u的

一只酷酷光儿的博客 571

【HDU5293】Tree chain problem(树形DP,树状数组)

Description 给定一棵树和很多条链,每条链有一个价值,要求选择一些不相交的链使得价值和最大。 Solution 设dp[u]dp[u]dp[u]为子树uuu内的答案,设sum[u]=∑v∈children(u)dp[v]sum[u]=∑v∈children(u)dp[v]sum[u]=\sum_{v\in children(u)}dp[v]。 考虑每条链在LCA处理。 ...

დ♂Hany01's Blog Space♂ღ 379

HDU 5293 Tree chain problem【树形DP】

树形DP dp[i]dp[i]:表示以节点i为根的子树的最有情况 sum[i]sum[i]:表示∑dp[k]\sum dp[k](其中k是i的儿子) 转移情况有两种: 一是:dp[i]=sum[i]dp[i]=sum[i] 二是:选取一条链p,其中p的两个端点的LCA为节点i dp[i]=max(dp[i],val[p]+∑(sum[k])−∑(dp[k]))dp[i]=\max(dp[

Mr.Phoebe的专栏 722

hdu_5293_Tree chain problem(DFS序+树形DP+LCA)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5293 被这题打蹦了,看着题解写的,很是爆炸,确实想不到,我用的DFS序+LCA+树形DP,当然也可以写树剖,不过这里DFS序更简单,因为都是对点到根的操作 1 #include<cstdio> 2 #include<vector> 3 #include&l...

weixin_30539835的博客 106

hdu5293

题意:已知树上的若干链< u,v>,每条链有一个权值w,求链不相交的最大权值和集合。

acmer的随记 1063

hdu 5293 Tree chain problem【树状dp+dfs序+树状数组】

题目大意:在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大。解题思路:树形DP。设dp[i]表示i的子树下的最优权值和,sum[i]表示不考虑i点时子树的最优权值和,即(j是i的儿子),显然dp[i]>=sum[i]。那么问题是考虑i点时dp[i]的值是多少,假设有一条链通过i,且端点a和b都在i的子树里,即LCA(a,b)=i,如果考虑加上这条链的权值,那么a->i, b->i的

cdsszjj的博客 492

【HDU 5233】Tree chain problem (树形DP+树剖+线段树|树状数组)最大权不相交树链集...

【题目】 Tree chain problem Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are m chain on the tree, Each chain has a certain weight. Coco would l...

weixin_30821731的博客 190

hdu5293 Tree chain problem

题目 题解 题意:有m条链,每条链链接两个顶点,链存在一个权值w,现在想要挑选一些链,挑选的链中不能出现相同的节点,问可以挑选出的最大的权重是多少 Solution 设dp[i]dp[i]dp[i]为以第iii个点位根节点的子树的最优解,sum[i]sum[i]sum[i]表示表示iii节点的所有子节点的dpdpdp和(注意:不包括iii) 1.第iii个节点上不出现链,那么dp[i]=∑(dp[...

xumingyang0的博客 389

hdu5293(2015多校1)--Tree chain problem(树状dp)

Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 262    Accepted Submission(s): 59 Problem Description Coco has a

随风的专栏 2944

刷题总结——Tree chain problem(HDU 5293 树形dp+dfs序+树状数组)

题目: Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are m chain on the tree, Each chain has a certain weight. Coco would like to pick out some chai...

banzhangzhi8819的博客 235
上一篇: BZOJ 8843 染色 [树链剖分+区间线段树]
下一篇: FZU 2113 Jason的特殊爱好 [数位DP]
GrassTreeFlower
博客等级 码龄11年 14粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值