首页 > 其他分享 >P3177 [HAOI2015] 树上染色

P3177 [HAOI2015] 树上染色

时间:2023-10-15 19:34:27浏览次数:42  
标签:sz int 染色 P3177 HAOI2015 树上

P3177 [HAOI2015] 树上染色

[P3177 HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

目录

题目大意

有一棵 \(n\) 个点的树,你可以在上面把 \(k\) 个点染成黑色,收益为黑点两两之间的距离和加上白点两两之间的距离和

求最大收益。

思路

树上背包

这种题肯定找边的贡献

设 \(f_{u , i}\) 为以 \(u\) 为根的子树内染了 \(i\) 个黑点的最大收益

\(sz_u\) 为以 \(u\) 为根的子树的节点个数

一条连接 \(u , v\) 的边, \(v\) 子树上有 \(j\) 个黑点,那么这条边的贡献为:

\[val = j * (k - j) * e[i].w + (sz_v - j) * (n - k - sz_v + j) * e[i].w \]

显然:

\[f_{u , i} = \max_{v \in son(u)} f_{v , j} +f_{u , i - j} + val (0\le j\le i \le k ) \]

实现时要倒序枚举 \(i\) 防止重复选, \(j = 0\) 的情况要提前转移一下

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
#define LL long long
using namespace std;
const int N = 2005;
int n , hd[N] , cnt , fa[N] , sz[N] , K;
LL f[N][N];
struct E {
    int to , nt;
    LL w;
} e[N << 1];
void add (int x , int y , LL z) { e[++cnt].to = y , e[cnt].nt = hd[x] , hd[x] = cnt , e[cnt].w = z; }
void dfs (int x) {
    int y;
    sz[x] = 1;
    f[x][0] = f[x][1] = 0;
    for (int i = hd[x] ; i ; i = e[i].nt) {
        y = e[i].to;
        if (y == fa[x]) continue;
        fa[y] = x;
        dfs (y);
        sz[x] += sz[y];
        fd (j , min (K , sz[x]) , 0) {
            if (f[x][j] != -1)
                f[x][j] += f[y][0] + (n - K - sz[y]) * sz[y] * e[i].w;
            fu (k , max(1 , j + sz[y] - sz[x]) , min (j , sz[y])) {
                if (f[x][j - k] == -1) continue;
                f[x][j] = max (f[x][j] , f[x][j - k] + f[y][k] + e[i].w * (K - k) * k + e[i].w * (n - K - sz[y] + k) * (sz[y] - k)); 
            } 
        }
    }
}
int main () {
    int u , v;
    LL w;
    scanf ("%d%d" , &n , &K);
    fu (i , 1 , n - 1) {
        scanf ("%d%d%lld" , &u , &v , &w);
        add (u , v , w) , add (v , u , w); 
    }
    memset (f , -1 , sizeof (f));
    dfs (1);
    printf ("%lld" , f[1][K]);
    return 0;
}

标签:sz,int,染色,P3177,HAOI2015,树上
From: https://www.cnblogs.com/2020fengziyang/p/17766016.html

相关文章

  • seqkit软件根据染色体名称从fasta文件中批量提取数据
     001、[root@pc1test1]#lsa.fachr.list[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggccc>chr3cccttt>chr4aaaaattt[root@pc1test1]#catchr.list##染色体列表chr2chr4[root@pc1test1]#seqkit-w8......
  • Linux awk给fasta中重复的染色体名做重复标记
     001、[root@pc1test1]#lsa.txt[root@pc1test1]#cata.txt##测试文件>jcf718000347055627>jcf718000347055638>jcf7180003470552496>jcf718000347054653>jcf718000347055862>jcf718000347055671>jcf718000347055085&......
  • 解题报告P2486 [SDOI2011] 染色
    P2486[SDOI2011]染色题目链接分两段,最后靠同一条重链合树剖加线段树,典中典。这题的线段树维护比较新颖。线段树中维护这个区间左右端点的颜色和颜色段数量。建树和查询和修改时要判断左区间的右端点和右区间的左端点是否颜色相同。如果不相同,直接将段数相加,否则减一。然......
  • gatk 实现基于染色体合并gvcf文件,并获取变异
     001、基于染色体合并gvcf文件gatkCombineGVCFs-Rreference.fna-Vgvcf.list-LchrN-OchrN.merged.g.vcf.gz其中:referen.fna是参考基因组;gvcf.list是将要合并的gvcf文件的列表文件,一行一个个体;格式如下:ERR2985607.g.vcfERR2985608.g.vcfERR2985609.g.vcfERR2......
  • P2486 [SDOI2011] 染色 题解
    P2486[SDOI2011]染色神仙树剖题。题意给你一棵树,每个点都有颜色,支持下面两种操作:路径染色。路径颜色段数量查询。树剖部分我们看到树上问题,不好处理,所以想办法给他树剖搞一搞,给他转化成序列的操作。我们树剖就是正常的树剖,然后我们考虑如何维护这个颜色序列。我......
  • RIdeogram染色体可视化
    Circos玩多了难免会视觉疲劳,今天换一个新工具可视化,回到直条的染色体形式。https://www.jianshu.com/p/07ae1fe18071https://cran.r-project.org/web/packages/RIdeogram/vignettes/RIdeogram.html#install.packages('RIdeogram')library(RIdeogram)library(plyr)library(dp......
  • 论文解读:《ccctc结合因子介导的染色质环形成序列模式的深度学习》
    所属分类:SCI  生物期刊名: JOURNALOFCOMPUTATIONALBIOLOGY2021年影响因子/JCR分区:1.479/Q4文章:DeepLearningofSequencePatternsforCCCTC-BindingFactor-MediatedChromatinLoopFormation|JournalofComputationalBiology代码与数据集:GitHub-BioDataLearning/......
  • AcWing 860. 染色法判定二分图
    题目给定一个$n$个点$m$条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数$n$和$m$。接下来$m$行,每行包含两个整数$u$和$v$,表示点$u$和点$v$之间存在一条边。输出格式如果给定图是二分图,则输出Yes,否则输出No......
  • sol.[APIO2011] 方格染色
    题目描述给定\(k\)个坐标的颜色\((0\)或\(1)\),用\(0\)和\(1\)两种颜色对剩下的方格染色,使得对于任意\(2\times2\)的方格中,只有\(1\)个\(1\)或\(3\)个\(1\)。求满足条件的染色方案数,答案对\(10^9\)取模。数据范围:\(2\leqslantn,m\leqslant10^5\),\(0\l......
  • 染色
    题目描述在一条数轴上有n个点,分别为1-n 。一开始所有的点都被染成黑色。接着进行m次操作,第i次操作将[l,r]这些点染成白色。请输出每个操作执行后剩余黑色点的个数。输入格式输入第一行为n和m。下面一行每行两个数l,r 。输出格式输出m行,为每次操作后......