摘要:
这题可以用并查集做,一开始统计一下记录每个点被标记了几次,除了被标记过的点外,其他节点都与其父亲所在集合合并,然后倒着做,做的时候如果有节点标记次数变为了0,则将其与其父亲合并。 代码 阅读全文
摘要:
整体二分,需要注意加的过程会爆long long,注意break掉 代码 阅读全文
摘要:
最短路,先将x排序,然后把排序后权值相邻的点连边,再把y排序,也把权值相邻的点连边,求一遍1到n的最短路就好啦。 代码 阅读全文
摘要:
后缀数组,首先先将数组反转,从后往前做,此时的后缀就等于是原串的前缀,那么每添加一个前缀,增加了多少个不同的子串,其实就是在之前添加的前缀中,排名最靠近该前缀的两个串a和b,计算出他们与该前缀的lcp,然后不同的子串数就是当前添加的前缀长度len-max(lcpa,lcpb)了。具体实现维护排名可以 阅读全文
摘要:
当序列中最大和次大都是负数的时候,其相加会是一个更小的负数,因此答案为(Σai)+(m1+m2)*k,如果最大是正数次大是负数,那么一直相加直到两个数都为正数,当最大和次大都是正数时,做一下矩阵乘法即可。 代码 阅读全文
摘要:
树链剖分,先求出每个点的dfs序区间,查询时假设当前根为x,查询点为y,他们的dfs序分别为[xl,xr],[yl,yr],有三种情况,第一种x=y那么直接输出[1,n]的最小值,第二种这两个区间分离或者[xl,xr]包含[yl,yr],那么直接查询[yl,yr]的最小值,第三种[yl,yr]包含[ 阅读全文
摘要:
可持久化trie 代码 阅读全文
摘要:
树分治。以递归的顺序建造一个重心树,每层用数组维护所有点按年龄从小到大排序后,其到当前层重心的前缀和。询问时在每一层算出需要经过该层重心才能到达查询点的距离和,累加就是答案,该操作可以用之前维护的信息来进行操作,具体看代码。复杂度O(nlogn^2) 代码 阅读全文
摘要:
主席树,先预处理出pre数组,pre[i]表示上一个ai出现的位置,然后假设区间从[1,R-1]变成了[1,R],那么区间[pre[R]+1,R]内的数字需要加上ar,我们按照右端点从小到大建主席树,然后将每个版本的线段树中的最大的元素都丢进堆中,需要记录的是最大的元素对应的线段树版本以及其在线段树 阅读全文
摘要:
比较容易想到的做法是树链剖分,每个线段树节点维护一个集合,对于一个修改路径操作,我们可以将线段树上不包含操作路径的节点的区间全部都进行一次修改,这种区间个数是logn级别的,这样询问的复杂度是O(qlogn),修改的复杂度是O(q(logn^3)),居然给卡过了。。。 代码 阅读全文