【SPOJ】1825. Free tour II(点分治)】的更多相关文章

题意: 给出一颗边带权的数,树上的点有黑色和白色.求一条长度最大且黑色节点不超过k个的最长路径,输出最长的长度. 分析: 说一下题目的坑点: 定义递归函数的前面要加inline,否则会RE.不知道这是什么鬼,=_=|. ans要初始化为0,而不是一个绝对值很大的负数,因为我们可以选择只有一个顶点的路径,这样权值就是0. 题解请戳这,还有这. #include <cstdio> #include <cstring> #include <algorithm> #includ…
题目链接 Free tour II 题意:有$N$个顶点的树,节点间有权值, 节点分为黑点和白点. 找一条最长路径使得 路径上黑点数量不超过K个 这是树的点分治比较基本的题,涉及树上启发式合并……仰望了黄学长的博客之后稍微有点明白了(还没有很深入地理解) #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b)…
http://www.spoj.com/problems/FTOUR2/ After the success of 2nd anniversary (take a look at problem FTOUR for more details), this 3rd year, Travel Agent SPOJ goes on with another discount tour. The tour will be held on ICPC island, a miraculous one on…
原题 给出一颗有n个点的树,其中有M个点是拥挤的,请选出一条最多包含k个拥挤的点的路径使得经过的权值和最大. 正常树分治,每次处理路径,更新答案. 计算每棵子树的deep(本题以经过拥挤节点个数作为deep),然后记录mx[i]为当前为止经过i个拥挤节点所达到的最大价值,tmp[i]为当前所在树中经过i个拥挤节点所达到的最大价值,用于更新答案即可. #include<cstdio> #include<algorithm> #include<cstring> #inclu…
http://www.spoj.com/problems/FTOUR2/ 先前看了一会题解就自己yy出来了...对拍过后交tle.................. 自己造了下大数据........tle......................... what? 首先来看经过当前点的路径: 设g[x,i]表示第x个孩子能得到的路径上黑点最多有i个(注意是最多)的最大长度,因为遍历的节点最坏为n个(第一层),因此在每一层都是$O(n)$的,可以承受. 考虑转移答案 $$ans[x]=max\{…
After the success of 2nd anniversary (take a look at problem FTOUR for more details), this 3rd year, Travel Agent SPOJ goes on with another discount tour. The tour will be held on ICPC island, a miraculous one on the Pacific Ocean. We list N places (…
求树上最长路径使得经过的拥挤节点个数不超过K //欢迎访问这个博客!http://www.cnblogs.com/luyouqi233/p/8036828.html #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #define N 200010 using namespace std; typedef long long ll; typedef pair<…
Description 有些黑点,问你选择不超过 \(k\) 个黑点的路径,路径权值最大是多少. Sol 点分治. 这是qzc的论文题,不过我感觉他的翻译好强啊...我还是选择了自己去看题目... 点分治每次至少分一半,所以层数不超过过 \(logn\) 每次分治只考虑过根节点的情况. 我们想想如何统计答案. \(f[i][j]\) 表示 \(i\) 节点的子树拥有 \(j\) 个黑点最大的边权. \(g[i][j]\) 表示 \(i\) 节点的子树拥有不超过 \(j\) 个黑点的最大边权. \…
题意翻译 给定一棵n个点的树,树上有m个黑点,求出一条路径,使得这条路径经过的黑点数小于等于k,且路径长度最大 Code: #include <bits/stdc++.h> using namespace std; #define pr pair<int, int> #define mp make_pair const int maxn = 2000003; const int inf = 1000000000; void setIO(string a) { string in =…
题意: 边权可能为负 思路: 感觉我自己写的还是太过僵硬了,可以灵活一点,比如可以多写几个不同的dfs求出不同的信息,而不是压到同一个dfs里 #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<iostream> #include<algorithm> #include<map> #include<set>…
每一次枚举到重心 按子树中的黑点数SORT一下 启发式合并 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ], nxt[MAXM << ], Head[MAXN], ed = ; ]; ; inline void addedge(int u, int v, int c) { to[++ed] = v; cost[ed] = c; nxt[ed]…
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description After the success of 2nd anniversary (take a look at problem FTOUR for more details), this 3rd year, Travel Agent SP…
http://www.spoj.com/problems/FTOUR2/en/ 题目大意:给一棵黑白染色的树,求边权和最大且经过黑点不超过K的路径. ———————————————————— 前排膜拜hzwer,借(抄)鉴(袭)了神犇的代码与思路,要看简洁的思路的话:http://hzwer.com/5984.html 然而……就算是抄了代码,还是没懂这题怎么做怎么办? 别着急,这道神神神题慢慢来. —————————————————————— 首先判断我们要放什么板子,很显然我们想到的是和树有…
Longest Common Substring II Time Limit: 2000ms Memory Limit: 262144KB A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecutive sequenc…
题意 luogu的翻译 给定一棵n个点的树,树上有m个黑点,求出一条路径,使得这条路径经过的黑点数小于等于k,且路径长度最大 Sol 点分治辣 如果是等于\(k\)的话,开个桶取\(max\)就好了 而小于等于\(k\),就可以把桶换成树状数组,求前缀\(max\) 很慢能过 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a))…
题链: http://www.spoj.com/problems/LCS2/题解: 后缀自动机. 对第一个串建立后缀自动机, 然后把后面的每个串分别与该串的自动机去匹配,求出相应的数组val*[s]: 表示第*个串与第一个串的自动机的状态s的最大匹配长度, (求法就是两个串用后缀自动机求LCS这一过程): 对于当前已经匹配的子串T,长度为now,此刻在状态s,现在要匹配第i个字符x, 若trans(s,x)!=0,则s=trans(s,x),now++,i++,并更新val*[s]=max(va…
题目链接 一道神奇的点分治 貌似有很多做法,我觉得BIT要好些一些(雾 要求经过黑点数<k就用BIT区间查询前缀 对于每个点用  BIT[0,k-经过黑点数]的最大值+路径长度 使用点分治做到O(n*log22n) 貌似还有O(nlog2n)的做法(雾 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #in…
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 6 3 9 9 8 7 7 6 样例输出 3 题解 CDQ分治+树状数组 一道经典的二维偏序问题. 由于限制条件有2维,所以我们可以使用CDQ分治处理第一维,用树状数组维护第二维. 具体地,按照CDQ分治的思路,先处理左半部分的答案,再处理左边对右边的影响,最后再处理右半部分的答案. 处理左边对右边的影响时…
传送门 题目翻译的很清楚……似乎点分治的题题目描述都非常简洁. 还是那个操作,一条路径要么全部在一棵子树中,要么经过当前的重心,所以考虑点分治. 首先dfs求出重心的每一棵子树中,有i个黑点的最长路径长度(这个没什么难度),之后我们只要考虑一下怎么在子树之内合并信息即可. 首先我们肯定是枚举所有的子树,用已经枚举过的s-1个子树的答案去和当前子树的答案合并更新新的答案,并且更新当前最大值.但是直接合并的复杂度很大,需要进行启发式合并.我们可以首先记录一下每棵子树的最大深度,之后把他们按照最大深度…
# \(SP1825\) 看到没有人用老师的办法,于是自己写一下思路 思路第一步:排除旧方法 首先这道题和\(4178\)不一样,因为那道题是计数,而这道题是求最值,最值有个坏处,就是对于来自相同子树的信息没法高效剔除,比如容斥用不了,举例来说,对于这道题,如果我们继续用尺取法维护黑点个数,对于一组刚好使\(cnt_l+cnt_r\leq k\)的\(l,r\),且\([l+1,r]\)所在子树都与\(l\)不同时就可以选取\(l~and~x\in [l+1,r]\),我们要使\(dis_l+d…
题面 Description 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. Input Output Sample Input 8 1 3 3 2 1 1 4 5 6 3 9 9 8 7 7 6 Sample Output 3 HINT 数据范围100000 解题思路 CDQ分治.其实跟模板题的思路差不多,就是用树状数组维护\(dp\)最大值.注意一下更新的顺序,就是要从左边往右边更新,所以应该先向左分治,…
传送门 后缀自动机基础题. 给出10个串求最长公共子串. 我们对其中一个建一个samsamsam,然后用剩下九个去更新范围即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; int T=0,n; char s[N]; struct SAM{ int rt,tot,last,len[N],lz[N],cnt[N],rk[N],val[N],link[N],s…
题目连接:戳我 题目大意:求n个字符串的最长公共子串. 它的简化版--这里 当然我们可以用SA写qwq,也可以用广义SAM写qwq 这里介绍纯SAM的写法...就是对其中一个建立后缀自动机,然后剩下的N-1个往上面匹配. 设\(sum[i]\)表示到以节点i为根的子树中,最长能够匹配到的最长的子串的长度. 匹配和它的弱化版基本一样,就是注意每次在parent tree上要用拓扑序从下往上更新答案. 注意每个点最大的匹配不能超过它所在类的longest 代码如下: #include<iostrea…
/* ----------------------- [题解] https://www.luogu.org/blog/IRving1-1/solution-sp1825 ----------------------- O(Nlog^2)做法,vjudge上写的是时限100ms,过2e5数据 ----------------------- 统计tmp[i]为有i个黑点的最长路径,进行转移 合并的顺序很巧妙,也很重要,这里倒序枚举当前子树的j(tmp[j]),则可以做到控制维护之前子树cur(max…
Code: #include <cstdio> #include <algorithm> #include <cstring> #define maxn 200000 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,ans[maxn],hh[maxn]; inline void getmax(int &a,int b){ if(b&…
点分治 点分治的例题2(本题代码结果为TLE……) 强烈谴责卡时限QAQ,T了无数次啊无数次…… 不过在N次的静态查错中倒是加深了对点分治的理解……也算因祸得福吧(自我安慰一下) TLE后的改进:每棵子树在重算f数组的时候,不要完全清空,而是清到最深深度即可.——>WA //SPOJ 1825 #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include…
点分治题单(来自XZY) 静态点分治 [x] 洛谷 P3806 [模板]点分治1 [x] 洛谷 P4178 Tree [x] 洛谷 P2634 [国家集训队]聪聪可可 [x] 洛谷 P4149 [IOI2011]Race [ ] [Luogu2664]树上游戏 [ ] [WC2010]重建计划 [ ] [HDU4812]D Tree [ ] [SPOJ1825]Free tour II [ ] [HDU5977]Garden of Eden [ ] [HDU5909]Tree Cutting […
这题好神啊……正解方向是分治,据我所知的分治方法有:I.离线后直接对多边形以及所有的询问进行分治 II.建立多边形的分治结构(对于三角形来说类似线段树,对于对角线来说类似平衡树),然后每次在这个分治结构上进行查询 III.将原图转为其对偶图(利用拓扑),发现是一棵树,然后在这棵树上进行分治(似乎也有离线分治和在线建立分治结构两种方法)我用的是第二种方法,感觉写起来不是很容易,但是也并不恶心,具体实现以及具体问题的处理方法见代码.感觉这样分治的复杂度是log的,实际证明最坏情况下存在使得任意一侧的…
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3648 基环树分治,结合了点分和边分的思想. 先随便拆掉环上一条边,我们先称它为基边,把它当做树做一遍,跟Free Tour II差不多. 剩下的问题就是如何统计经过基边的路径条数了.我们将基边连着的两个点分别成为\(st\)和\(ed\),\(st\)的顺时针方向是\(ed\),\…
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1758 先来讲讲部分分吧. 对于\(20\)%的数据 我们可以对于每个点为根\(dfs\)一遍,然后用\(deep\)在\([L,R]\)之间的点与当前根的距离除以深度来更新答案: 时间复杂度:\(O(n^2)\) 空间复杂度:\(O(n)\) 对于另外\(30\)%的数据 因为是一…