随笔分类 - 数据结构 线段树
摘要:【题意】n个数划分成k段,每段的价值为段内不同数字的数量,求最大总价值 【算法】DP+线段树 【题解】 f[i][j]表示前i个数字划分成j段的最大价值。 f[i][j]=max(f[k][j-1]+value(k+1,j)),j-1<=k<i。 暴力复杂度O(n^3*k),预处理value后复杂度
阅读全文
摘要:【题意】n个数,每个数有附加属性0或1,初始全为1。m个操作,每个操作可以改变一个数字的属性为0或1。对于每次操作后的序列求有多少子序列满足要求:5个数字,中间3个数相等且属性为1,左右两个数小于等于中间三个数且属性任意。n,m<=10^5。 【算法】线段树 【题解】朴素的算法,奇妙的使用>_<!
阅读全文
摘要:【算法】Link-Cut Tree+线段树(维护DFS序) 【题解】整整三天……T_T 这篇题解比较资瓷:permui 这道题虽然树形态没有变化,但用lct写的原因在于把题目中的操作一进行了神转化:每条重链表示一种颜色,点到根的颜色数=经过的轻链数+1。 询问一个点的子树所有结点到根的代价和(的平均
阅读全文
摘要:【算法】树链剖分+线段树(区间加值,区间求和) 【题解】http://hzwer.com/3891.html 中间不要取模不然相减会出错。 血的教训:线段树修改时标记下传+上传,查询时下传。如果修改时标记不下传,下面的结果就会覆盖上面的标记上传造成的影响。 读入后全部排序(离线处理) 链剖之后按顺序
阅读全文
摘要:【算法】(manacher+贪心)||(manacher+DP+树状数组/线段树) 【题解】 manacher求回文串,后得到线段,做一点计算映射回原串线段。 然后问题转化为可重叠区间线段覆盖问题,可以贪心解决。 排序左端点,同一左端点取最长段,然后在此段中找到右端点最靠右的线段,线性更新并累加。
阅读全文
摘要:【平衡树】★平衡树 by onion_cyc 【莫队算法】 问题:给定长度为n的序列和m个区间询问,支持快速增减相邻元素维护区间信息。 将询问按左端点分块,块大小为$Q=\frac{n}{\sqrt m}$,块内按右端点排序。 然后依次回答询问,需要O(1)从(l,r)转移到(l,r+1),(l,r
阅读全文
摘要:【算法】树链剖分+线段树 【题解】 树链剖分算法:http://www.cnblogs.com/onioncyc/p/6207462.html 定义线段树结构体有l,r,lc,rc,sum,data。 lc表示左端颜色,rc表示右端颜色,sum表示颜色种类,data表示区间置为同一个数的标记。 修改
阅读全文
摘要:【算法】树链剖分+线段树 【题解】模板题,见http://www.cnblogs.com/onioncyc/p/6207462.html 调用线段数时要用新编号pos[i] !!! #include<cstdio> #include<cctype> #include<algorithm> using
阅读全文
摘要:【算法】线段树 #include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f,maxn=50010; struct tree{int l,r,mins,maxs;
阅读全文
摘要:【算法】线段树||二分+前缀和 【题解】线段树记录区间加值和区间最大值。 #include<cstdio> #include<algorithm> using namespace std; const int maxn=1e6; struct treess{int l,r,ms,delta;}t[m
阅读全文
摘要:【算法】线段树 【题解】 学自:https://vijos.org/p/1083/solution(wang_yanheng的回答) 回溯时维护一段区间的以下域: sumL:从左端点起连续区间的最大和 sumR:从右端点起连续区间的最大和 sum:整段区间的和 subSum:最大子区间和 以上域在叶
阅读全文
摘要:【算法】线段树 【题解】区间加上同一个数+区间查询最大值。注意和谐值可以是负数,初始化ans为负无穷大。 #include<cstdio> #include<algorithm> using namespace std; const int maxn=100010,ainf=-0x3f3f3f3f;
阅读全文
摘要:【题意】两种操作,[L,R]种新的树(不覆盖原来的),或查询[L,R]树的种类数。n<=50000。 【算法】树状数组||线段树 【题解】这题可以用主席树实现……不过因为不覆盖原来的,所以有更简单的方法。 括号法,对于每个K=1的操作标记左右括号的位置。 对于每个K=2的操作,答案就是right前面
阅读全文
摘要:【算法】线段树 【题解】将所有坐标按x(第一)和y(第二)从小到大排序,再按顺序插入线段树,即在线段树中将y坐标位置+1,这样就能保证每个坐标能包含的点一定先被处理了,每次询问查询1...a[i].y区间的和。 #include<cstdio> #include<algorithm> using n
阅读全文
摘要:【算法】线段树 【注意】修改或查询区间时,若区间能包含某棵子树就立即返回,否则线段树就失去了意义。 #include<cstdio> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; struct treess{in
阅读全文
摘要:【算法】线段树 #include<cstdio> #include<algorithm> using namespace std; struct treess{int l,r,ms;}t[400010]; const int maxn=200010,inf=0x3f3f3f3f; int a[max
阅读全文
摘要:【算法】 【算法】网络流 【算法】树 【算法】数学 ————【专题】生成树计数(矩阵树定理) ————【专题】计数问题(排列组合,容斥原理,卡特兰数) ————【算法专题】卡特兰数(计数数列) ————【专题】数论 ————【专题】概率和期望 【算法】动态规划 【算法】数据结构 ————【专题】平衡
阅读全文