【JZOJ3347】树的难题】的更多相关文章

题面 [BJOI2017]树的难题 题解 考虑点分治. 对于每个点,将所有边按照颜色排序. 那么只需要考虑如何合并2条链. 有2种情况. 合并路径的接口处2条路径颜色不同 合并路径的接口处2条路径颜色相同 我们分别考虑这2种情况. 维护2棵线段树,分别表示与当前接口颜色不同和颜色相同. 如果我们遍历完了一棵子树,就将这棵子树的答案加入到颜色相同的线段树里面. 如果我们遍历完了一段颜色,就将第2个线段树合并到第一个线段树里面. 当然更新答案要在上面2个操作之前. 只需要对于当前子树的每条路径,在2…
[BJOI2017]树的难题 LG传送门 点分治+线段树合并. 我不会写单调队列,所以就写了好写的线段树. 考虑对于每一个分治中心,把出边按颜色排序,这样就能把颜色相同的子树放在一起处理.用一棵动态开点线段树维护颜色不同的子树的信息,另一棵动态开点线段树维护颜色相同的子树的信息,同时按照题目要求更新答案.当子树颜色变化时,就把第二棵线段树合并到第一棵里面去就好了. 代码实现有点繁琐,我调了很久... #include<cstdio> #include<cctype> #includ…
题目 题目大意 给你一棵树,每个节点有三种黑.白.灰三种颜色. 你要割掉一些边(每条边被割需要付出一定的代价),使得森林的每棵树满足: 没有黑点或至多一个白点. 思考历程 这题一看就知道是一个树形DP-- 对于每棵子树,有\(5\)种状态: 状态\(00\),表示没有黑点和白点. 状态\(01\),表示没有黑点,只有一个白点. 状态\(02\),表示没有黑点,有两个或以上个白点. 状态\(10\),表示有一个黑点,没有白点. 状态\(11\),表示有一个黑点,一个白点. 然后就是长长的状态转移方…
description analysis 比较麻烦树形\(DP\) 不过这个我还是不算很懂-- 下次要注意思考,不要怕麻烦 code #pragma GCC optimize("O3") #pragma G++ optimize("O3") #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #define MAXN 3000…
设$f[x][i][j]$表示以$x$为根的子树,与$x$连通部分有$i$个黑点,$j$个白点,不联通部分都是均衡的最小代价.若$i>1$,则视作$1$:若$j>2$,则视作$2$. 然后进行树形DP即可,转移的时候如果不要那棵子树,那么那棵子树的状态必须满足$!i||j<2$. 时间复杂度$O(n)$. #include<cstdio> #define rep(i,n) for(int i=0;i<n;i++) typedef long long ll; const…
传送门 只会线段树……关于单调队列的解法可以去看“重建计划”一题. 看到路径长度$\in [L,R]$考虑点分治.可以知道,在当前分治中心向其他点的路径中,始边(也就是分治中心到对应子树的根的那一条边)颜色相同的两条路径在拼合的时候在加上两条路径的权值之后需要减掉始边颜色的权值(因为被计算了两次),而初始边颜色不同的进行拼合就直接将两条路径的权值加起来即可.我们考虑分开维护这两种拼合. 在每一个分治中心里,我们对其引出的边按照颜色排序(目的是使得始边颜色相同的若干子树放在一起统一遍历),维护两个…
Description Solution 看到这种路径统计问题,一般就想到要用点分治去做. 对于每个重心\(u\),统计经过\(u\)的合法的路径之中的最大值. 第一类路径是从\(u\)出发的,直接逐个子树深搜统计就可以了.第二类路径是由两棵不同子树中的两条第一类路径拼接而成的. 如果仅仅是统计长度在\([l,r]\)之间的路径有多少条,经典的统计+容斥做法就可以解决.然而现在的问题比较复杂,一来不好容斥,二来两两路径配对需要有判定条件:两条路径的接口边颜色是否相同. 我们可以采用一种不需要容斥…
Description 给你一棵 n 个点的无根树.树上的每条边具有颜色. 一共有 m 种颜色,编号为 1 到 m.第 i 种颜色的权值为 ci.对于一条树上的简单路径,路径上经过的所有边按顺序组成一个颜色序列,序列可以划分成若干个相同颜色段 . 定义路径权值为颜色序列上每个同颜色段的颜色权值之和.请你计算,经过边数在 l 到 r 之间的所有简单路 径中, 路径权值的最大值. Input 第一行, 四个整数 n, m, l, r. 第二行, n 个整数 c1, c2, --, cm,由空格隔开.…
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4860 题解 点分治 设当前重心为v 假设已经把所有边按照出发点第一关键字, 颜色第二关键字排序 对于当前的v 我们顺次考虑他的出边 设当前出边(v,nw) 颜色 col 我们枚举nw的出边 对于一条nw的出边而言, 分为两种情况 1. 颜色与col相同   用线段树维护深度及对应的最值,查询到最大值即可 (v,nw)没有贡献 2. 颜色与col不同   用另一棵线段树维护深度以及与(当前节…
题目大意 有一棵树,\(n\)(\(n\leq2*10^5\))个点,每条边\(i\)有颜色\(w_i\),共有\(m\)(\(m\leq n\))种颜色,第\(i\)种颜色的权值是\(c_i\)(\(|c_i|\leq10^4\)) 定义一条路径的权值是该路径上所有同色段的颜色的权值之和 给定\(l,r\),求边数在\([l,r]\)中权值最大的路径的权值 题解 将每个点的所有边按颜色排序后,对这棵树进行点分治,每次统计过当前重心的路径 用线段树统计应该挺板的吧 有人用单调队列做,然而我不会,…