随笔分类 - 数据结构
摘要:思路 这个题哪里有那么费脑筋 我们可以树链剖分嘛~~LCT昨天学的时候睡着了,不是太会~~ 两遍dfs+一个5行的BIT 其实树链剖分学好了对倍增和LCT理解上都有好处 一条路径上的修改 由于一条剖出来的链是连续的,我们要选择数据结构维护 不过这里不用维护太多东西,只是区间+1 我们可以选择常数小,
阅读全文
摘要:P3178 [HAOI2015]树上操作 思路 板子嘛,其实我感觉树剖没啥脑子 就是debug 代码 cpp include define int long long define ll long long define ls rt'9'||s='0'&&s 1; build(l,mid,ls);
阅读全文
摘要:P3313 [SDOI2014]旅行 思路 有点恶心咯 每个信仰开一颗线段树记录 修改或者查询的时候去那一颗信仰线段树中查询就好 必须动态开点线段树 没有区间修改还算好写 错误 查询跳链写错了
阅读全文
摘要:[HEOI2016/TJOI2016]树 思路 做的时候也是糊里糊涂的 就是求最大值的线段树 错误 线段树写错了
阅读全文
摘要:GSS7解题报告 前言 唔,有点恶心哪,废了两个多小时debug 思路 很容易看出~~傻子都知道~~,这个是树链剖分+线段树的裸题,只不过是恶心了点,这里重点讲一下细节问题 线段树 做过GSS系列的都应该很熟悉了 线段树维护的前缀最大子段和,后缀最大子段和,和区间最大子段和 那么我们就可以很容易的写
阅读全文
摘要:树剖做法: 就是两个dfs+一个线段树 难度的取决基本==线段树的维护难度 所以对有点线段树基础的,树剖也不难做吧 这里操作有二 一:两点间路径染色 线段树的区间赋值操作 二:查询路径段的个数 考虑线段树如何做 我们发现两端区间的合并取决于他们相连接的那两个颜色 比如这张图 他两边区间合并的时候,完
阅读全文
摘要:前言 总之这个东西说起来很麻烦就是了, 思路 差分合并+后缀数组+二分(dddl) 类似于那个 "bzoj1031" 的复制子串和那个 "poj1743" 的差分 来看个例子 变成了这个(最后一个INF最好删掉吧,应该不影响的吧) 很明显,答案是min[5,10]+1=1+1=2 belong是后缀
阅读全文
摘要:前言 考试的时候居然想错了区间贡献,mdzz 思路 题目看着很方啊,难道要树套树? 但数据范围提醒我们,是nlogn的复杂度 Sort(S)的定义是不是很鬼畜 但我们~~不动脑子的~~打表容易发现 连续区间[1,n]内$a_i^2 a_{i 1}^2$为连续的奇数 (其实这里直接用初中的完全平方公式
阅读全文
摘要:题目 树上求子树内出现次数 =1且在区间【l,r】内的数 题解 这道题的最初版本是询问子树不同颜色个数, 是一道很经典的 “树比序列容易” 的题. 在树上可以这样做: 对于每一种颜色, 将这种颜色的点提取出来按 DFS 序排序; 令每个点的贡 献为 1, 相邻点的 LCA 的贡献为 −1, 于是问题
阅读全文
摘要:思路 序列中 |i | 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| | | | | | | | | | | | | |a[i]| a| b| c| L| d| e| f| R| g| h| 现逆序对为ans,要交换L,R 则$[1,3],[9,10]$这两段区间的都不会被他俩影响
阅读全文
摘要:思路 模拟就好 左偏树合并 并查集寻找 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&sval[y]) swap(x,y); ch[x][0]=merge(ch[x][0],y); if(dis[ch[x][0]]
阅读全文
摘要:思路 合并时候统计逆序对贡献 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&s 1; if(k
阅读全文
摘要:思路 又是强制在线 主席树 每一次操作建一棵树 但实际用的的rt只有n个 所以实际内存是n 2 30 我见到只开n 30的,不会, 错误 debug 以为每一秒建立一颗树 第一次 query没有递归 第二、三次 权值线段树的查询处理,就是到叶子节点的处理 代码 cpp // luogu judger
阅读全文
摘要:思路 强制在线 主席树 以1为root建主席树 (就是在树上建树,差不多) rt[i]就是1到i的路径上的一棵树的root 其实我感觉,主席树之间的运算差不多于加减 类似lca的运算 root(1到x)+root(1到y) root(lca) root(fa[lca]) 查询他们的第k小就OK 错误
阅读全文
摘要:思路 区间内x出现次数大于一半 区间内排序,则x一定会在(一半+1)的位置上出现 找到那个数,再检查一下就好 错误 快读写错了、、,又浪费了1h 代码 cpp include define FOR(i,a,b) for(int i=a;i='9'||s='0'&&s 1; if(k 1; if(to
阅读全文
摘要:前置知识: 普通主席树,树状数组 大概 待修主席树 和静态的一样 只不过还要加一颗树 来维护你修改的值 这棵树就是是树状数组,每个节点上再维护一颗动态开点线段树 (就是所说的树套树,不过没啥可怕的,就是麻烦一丢丢) 查询的时候老样子 不过要多加上树状数组中的值罢了 代码还算好些,如果 主席树,树状数
阅读全文
摘要:思路 若opt=1 则为操作1,之后有三个数l,r,k 表示查询k在区间[l,r]的排名 若opt=2 则为操作2,之后有三个数l,r,k 表示查询区间[l,r]内排名为k的数 若opt=3 则为操作3,之后有两个数pos,k 表示将pos位置的数修改为k 若opt=4 则为操作4,之后有三个数l,
阅读全文
摘要:[TOC] 思路 每个节点维护一课线段树(当然是动态开点) 线段树的作用是统计这个节点有多少种粮食型号,以及最多的粮食型号 然后树上差分,u和v点 +1,lca(u,v)和f[lca(u,v)] 1(不显然就画图喽) 并不用转化为dfs序 只需要dfs一边,自底向上合并就好 优化 删除节点不必建树
阅读全文
摘要:题目链接 "luogu" 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并、、、 看代码吧 错误 和写主席树错的差不多 都是变量写错、、、、 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&s t[maxn];
阅读全文
摘要:思路 这里的初始化就不讲了,看完操作讲解就应该明白了,再不行就去看代码 对于操作1 由于操作2的需要,vector[n]存下数 对于操作2的维护 查询相邻两个元素的之间差值(绝对值)的最小值 先把所有答案存入一个小头堆里 比如 a,c之间你要插入b 那么,你就要删除|c a|,然后加入|a b|,|
阅读全文