[BJOI2017]树的难题】的更多相关文章

题面 [BJOI2017]树的难题 题解 考虑点分治. 对于每个点,将所有边按照颜色排序. 那么只需要考虑如何合并2条链. 有2种情况. 合并路径的接口处2条路径颜色不同 合并路径的接口处2条路径颜色相同 我们分别考虑这2种情况. 维护2棵线段树,分别表示与当前接口颜色不同和颜色相同. 如果我们遍历完了一棵子树,就将这棵子树的答案加入到颜色相同的线段树里面. 如果我们遍历完了一段颜色,就将第2个线段树合并到第一个线段树里面. 当然更新答案要在上面2个操作之前. 只需要对于当前子树的每条路径,在2…
[BJOI2017]树的难题 LG传送门 点分治+线段树合并. 我不会写单调队列,所以就写了好写的线段树. 考虑对于每一个分治中心,把出边按颜色排序,这样就能把颜色相同的子树放在一起处理.用一棵动态开点线段树维护颜色不同的子树的信息,另一棵动态开点线段树维护颜色相同的子树的信息,同时按照题目要求更新答案.当子树颜色变化时,就把第二棵线段树合并到第一棵里面去就好了. 代码实现有点繁琐,我调了很久... #include<cstdio> #include<cctype> #includ…
传送门 只会线段树……关于单调队列的解法可以去看“重建计划”一题. 看到路径长度$\in [L,R]$考虑点分治.可以知道,在当前分治中心向其他点的路径中,始边(也就是分治中心到对应子树的根的那一条边)颜色相同的两条路径在拼合的时候在加上两条路径的权值之后需要减掉始边颜色的权值(因为被计算了两次),而初始边颜色不同的进行拼合就直接将两条路径的权值加起来即可.我们考虑分开维护这两种拼合. 在每一个分治中心里,我们对其引出的边按照颜色排序(目的是使得始边颜色相同的若干子树放在一起统一遍历),维护两个…
题目大意 有一棵树,\(n\)(\(n\leq2*10^5\))个点,每条边\(i\)有颜色\(w_i\),共有\(m\)(\(m\leq n\))种颜色,第\(i\)种颜色的权值是\(c_i\)(\(|c_i|\leq10^4\)) 定义一条路径的权值是该路径上所有同色段的颜色的权值之和 给定\(l,r\),求边数在\([l,r]\)中权值最大的路径的权值 题解 将每个点的所有边按颜色排序后,对这棵树进行点分治,每次统计过当前重心的路径 用线段树统计应该挺板的吧 有人用单调队列做,然而我不会,…
题目描述 题目传送门 分析 路径问题考虑点分治 对于一个分治中心,我们可以很容易地得到从它开始的一条路径的价值和长度 问题就是如何将不同的路径合并 很显然,对于同一个子树中的所有路径,它们起始的颜色是相同的 因此我们可以将一个节点的所有子结点按照颜色排序 这个可以在建图之前处理好 然后开两个权值线段树,一棵存储与当前节点起始颜色相同的所有路径,另一棵存储不同的所有路径 当节点的颜色改变时,把相同的那一堆合并到另一堆即可 时间复杂度 \(nlog^2n\) 代码 #include<cstdio>…
洛谷题面传送门 咦?鸽子 tzc 竟然来补题解了?incredible( 首先看到这样类似于路径统计的问题我们可以非常自然地想到点分治.每次我们找出每个连通块的重心 \(x\) 然后以 \(x\) 为根 DFS 一遍整个子树,我们假设 \(y\) 到 \(x\) 的距离为 \(dep_y\),\(x\to y\) 这一段上颜色的权值之和为 \(sum_y\),那么考虑怎样合并两条路径.显然对于两个在 \(x\) 不同子树内的点 \(y,z\),\(y\to z\) 路径上边的个数就是 \(dep…
题目描述 给你一棵 n 个点的无根树. 树上的每条边具有颜色.一共有 m 种颜色,编号为 1 到 m.第 i 种颜色的权值为 ci. 对于一条树上的简单路径,路径上经过的所有边按顺序组成一个颜色序列,序列可以划 分成若干个相同颜色段.定义路径权值为颜色序列上每个同颜色段的颜色权值之和. 请你计算,经过边数在 l 到 r 之间的所有简单路径中,路径权值的最大值. 题解 如果没有颜色这种东西的话,看到l~r的限制,就容易想到点分治+单调队列维护. 我们的单调队列的作用其实就是合并两颗子树. 考虑有如…
以后传数组绝对用指针... 考虑点分治 在点分的时候,把相同的颜色的在一起合并 之后,把不同颜色依次合并 我们可以用单调队列做到单次合并$O(n + m)$ 如果我们按照深度大小来合并,那么由于每次都是把大的往小的去合并 因此,合并$n$的序列最多需要$2n$的势能 因此,最终我们就能达到$O(n \log n)$的统计复杂度 然而还有排序,所以实际复杂度$O(n \log^2 n)$,排序常数很小,自然能过 #include <set> #include <vector> #in…
设$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…
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不同   用另一棵线段树维护深度以及与(当前节…
题目 题目大意 给你一棵树,每个节点有三种黑.白.灰三种颜色. 你要割掉一些边(每条边被割需要付出一定的代价),使得森林的每棵树满足: 没有黑点或至多一个白点. 思考历程 这题一看就知道是一个树形DP-- 对于每棵子树,有\(5\)种状态: 状态\(00\),表示没有黑点和白点. 状态\(01\),表示没有黑点,只有一个白点. 状态\(02\),表示没有黑点,有两个或以上个白点. 状态\(10\),表示有一个黑点,没有白点. 状态\(11\),表示有一个黑点,一个白点. 然后就是长长的状态转移方…
时间限制 : 10000 MS   空间限制 : 165536 KB 评测说明 : 1s,128m 问题描述 给出一个无根树.树有N个点,边有权值.每个点都有颜色,是黑色.白色.灰色这三种颜色之一,称为一棵三色树.可爱的Alice觉得,一个三色树为均衡的,当且仅当,树中不含有黑色结点或者含有至多一个白色节点.然而,给出的三色树可能并不满足这个性质.所以,Alice打算删去若干条边使得形成的森林中每棵树都是均衡的,花费的代价等于删去的边的权值之和.请你计算需要花费的代价最小是多少.注意,输入文件包…
题目链接 状态只与黑.白两点的颜色有关,于是用 \(f[x][i][j]\)表示当前以x为根节点,有\(i\)个黑点\(j\)个白点,使得x子树满足该条件的最小花费. 最后答案就是 \(min\{f[root][0][j],f[root][i][0/1]\}\). 把 \(i\geq 1\)的状态都看做 \(i=1\),\(j\geq 2\)的状态都看做 \(j=2\). 更新顺序同树上背包一样,用从之前子树得到的信息与当前枚举的子树合并.因为要合并后的信息所以再开一个数组记录更方便些. 转移时…
考虑点分治.对子树按照根部颜色排序,每次处理一种颜色的子树,对同色和不同色两种情况分别做一遍即可,单调队列优化.但是注意到这里每次使用单调队列的复杂度是O(之前的子树最大深度+该子树深度),一不小心就退化成O(n2).于是我们按照同颜色最大深度为第一关键字.子树深度为第二关键字排序,每次处理完一种颜色再与之前的其他颜色合并,这样每次的复杂度就是其自身深度了. #include<iostream> #include<cstdio> #include<cmath> #inc…
树形DP #include<cstdio> #include<algorithm> #define rep(i,x,y) for (int i=x; i<=y; i++) using namespace std; int cnt,last[300005],c[300005]; long long F[300005][2][3],G[2][3]; struct node{ int to,next,val; }e[600005]; void add(int a,int b,int…
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…
游荡的孤高灵魂不需要羁绊之处. 洛谷题单 点分治 前置芝士 树的重心 树分治 例题略解 P3806 [模板]点分治1 板子题,先暴力找到整棵树的重心,然后先求出重心到各点的距离,进而算出他所在树的各个节点的距离,在对应的ans数组加一;然后再接着扫子节点,并把儿子节点子树的贡献减去,最后回答询问. 然后我们愉快的\(TLE60pts\),题目上也有说明,这种做法使用于大部分不过本体比较卡时间,储存然后离线剪枝就好了. 这里给出\(60pts\)的\(code\) P2634 [国家集训队]聪聪可…
Problem Description There are a bunch of stones on the beach; Stone color is white or black. Little Sheep has a magic brush, she can change the color of a continuous stone, black to white, white to black. Little Sheep like black very much, so she wan…
淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选择一个点进行分治,对于树上路径统计类型的问题有奇效,思路很好理解,只是码量有些烦人 先来看一道模板题:CF161D 至于为什么我没有放Luogu模板题是因为那道题只会写$O(n^2logn)$的算法(然而跑得过是因为跑不满) 这道题要求在$N$个点的树上找距离为$K$的点对的数量. 因为我们是来学点…
BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难题 啥也不会,暴力点分治. 点分治的时候只有相同颜色的链合并到一起的时候会出事. 一开始以为权值非负,于是胡了个假做法-- 把边按颜色排序,每次处理一整段的相同颜色,分两棵线段树维护其他颜色/当前颜色的最大权值,然后就没了. 单调队列神仙做法不会-- 代码 LOJ #2180. 「BJOI2017」…
传送门 看到平均数最大,自然地想到二分答案.那么我们的$check$函数就是要求:是否存在一条长度在$[L,U]$的路径,满足其权值和$\geq 0$. 看到长度在$[L,U]$,自然地想到点分治求解.我们考虑如何统计答案,像树的难题那样使用线段树的话,复杂度会变成$nlog^3n$,显然是跑不过这道题的. 我们考虑:将一棵子树内的路径按照长度排序,那么从前往后依次询问子树内每一条路径的贡献的时候,在已经搜过的子树中可以匹配的长度区间是一个单调的区间.那么我们就可以使用单调队列将合并过程优化为$…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
/******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 算法: 字典树 提示: 这题压要用c++提交,G++会超内存 *******************************************************/ #include<cstdio> #include<cstr…
统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 16905    Accepted Submission(s): 7273 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前…
统计难题 Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Status Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).    Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ign…
Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提…
统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 26206    Accepted Submission(s): 10637 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的…
统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).   Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每一个提问都是一个字符串. 注意:本题仅仅有一组測试数据,处理到文件结束.  …