
数据结构
文章平均质量分 59
JK Chen
ACM退役选手,战绩4金6银
展开
-
1401F - Reverse and Swap(线段树 翻转所有2^k子区间)
http://codeforces.com/problemset/problem/1401/F题意:解析:弄一个全局的int:rev来记录所有K的是否翻转(rev与rev之间满足交换律),然后swap(k)→reverse(k+1),reverse(k)swap(k)\to reverse(k+1),reverse(k)swap(k)→reverse(k+1),reverse(k)。查询和单点修改的时候根据rev来转换一下坐标即可。代码:/* * Author : Jk_Chen *原创 2020-09-07 10:30:08 · 278 阅读 · 0 评论 -
Discovery of Cycles(动态树 LCT ST表)
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=886题意:一张无向图,q个强制在线询问,如果只用区间[l,r]的边,能否组成一个简单环解析:求出每个i,至少要扩展到ans[i]才能使[i,ans[i]]组成简单环,ans[i]是单调的。所以我们可以用尺取法来维护出ans[i],往右延时的时候加边。如果当前边两点已经在一棵树上说明可以形成环。缩短的时候需要删除边,所以使用动态树。最后区间求一个最小值原创 2020-08-13 21:14:51 · 466 阅读 · 2 评论 -
Interval(01 想法 主席树)
https://ac.nowcoder.com/acm/contest/5670/H题意:解析:对于每一个右端点,F值不同的左端点至多为30个,所以我们只需要维护30n个[l,r,k=F(l,r)][l,r,k=F(l,r)][l,r,k=F(l,r)]建立主席树,当右端点为rrr,枚举[l,r,k=F(l,r)][l,r,k=F(l,r)][l,r,k=F(l,r)]:若kkk未出现过,则直接在lll的位置+1,这样子查询[L,R][L,R][L,R]时贡献便+1。如果出现过,我们对于右端原创 2020-07-25 17:28:00 · 260 阅读 · 0 评论 -
Ch’s gift (Hard)(主席树 LCA)
turingjudge.com/contest/3/problem/1005QkCvNnnjg5题意:一棵点权树,每次询问求两个点的路径上,权值∈[a,b]\in[a,b]∈[a,b]的权值和。解析:树链剖分+主席树两个log会T,想办法一个log由于没有修改操作,所以可以用lca代替树链剖分。(s→t)=(rt→s)+(rt→t)−2(rt→lca)+lca(s\to t)=(rt...原创 2020-04-21 16:51:14 · 345 阅读 · 0 评论 -
4.2美团笔试题2(树状数组)
解析:维护一个sum(一圈下来的和),循环内,每次先把可以整圈的部分算了(除法取模)不能整圈(sum>m)的情况,显然某个前缀的sum已经>m了,所以我们二分这个前缀(动态前缀和使用树状数组维护),将第一个大于m的前缀的那个位置删掉。详情看代码:/* * Author : Jk_Chen * Date : 2020-04-02-20.14.15 */#incl...原创 2020-04-02 21:19:54 · 4185 阅读 · 3 评论 -
P5490 矩形面积并(扫描线 线段树)
https://www.luogu.com.cn/problem/P5490题意:给出多个矩形,求面积并解析:从下往上扫,遇到底边区间+1,遇到顶边区间-1,对于两条线中间的位置,我们已经知道了高度,通过线段树得到有效的宽度后就是面积了。有效的宽度为非0部分,在线段树中,我们采取标记持久化。对于一个段,如果标记非0,则有些长度为段长度,否则为两个儿子的长度和。递归下去就是区间内所有有效子...原创 2020-03-13 16:03:45 · 225 阅读 · 0 评论 -
Height Profile(线段树)
https://vjudge.net/problem/Gym-102500H题意:给出0~n点的海拔,求最长的线段,满足斜率大于等于k。可以是小数。解析:假设最后线段两头都不是端点(小数长度),那么这两条如果斜率一样,可以将一条减少,另外一条补满。如果不一样,一定有一条更优,那么这条多一些,另外一条少一些。最后还是一条布满了。所以最后的结果一定是一头停在端点上。假设现在斜率为k,那么两...原创 2020-03-08 09:27:54 · 762 阅读 · 0 评论 -
F2. Animal Observation (hard version)(线段树 dp)
http://codeforces.com/problemset/problem/1304/F2题意:n*m,每行可以放(往下)一个2行k列的长方形,问被覆盖的数字和最大是多少。(n≤50,m≤2e4,k≤mn\leq 50,m\leq 2e4,k\leq mn≤50,m≤2e4,k≤m)解析:考虑dp[i][j]dp[i][j]dp[i][j]为以(i,j)(i,j)(i,j)为左上...原创 2020-03-05 10:52:12 · 260 阅读 · 0 评论 -
F. Berland Beauty(树链剖分)
http://codeforces.com/problemset/problem/1296/F题意:一棵树,边权,给出很多条路径的信息(路径上的最小值),求一个合法的树解析:最小值为X相当于全部大于等于X。所以树链剖分,区间取最大值即可。判断不存在:按照每条边当前权值重新建树,求区间最小值。如果和之前的区间最小值不一样就是-1。(例如[1,4]=2,[1,2]=3,[2,4]=5,显然...原创 2020-02-17 17:23:38 · 365 阅读 · 0 评论 -
Traveling Merchant(线段树 求差的最大值 右边减左边)
https://vjudge.net/problem/Kattis-travelingmerchant题意:简化(开7棵树)后就是求给定的区间内,选两个数,右边的减去左边的要最大,或是求左边的减去右边的要最大。解析:感觉以前这种写过啊,怎么找不到了。。求右减左的最大值:对于一个段,可能是右边的子段减去左边的子段,或者两个子段内部自己做差。求右减左的最大值:直接求右减左的最小值,然后...原创 2020-02-06 18:44:06 · 774 阅读 · 0 评论 -
Board Game(线段树 bfs)
http://codeforces.com/problemset/problem/605/D题意:给出n个点,(a,b,c,d)(a,b,c,d)(a,b,c,d),你有两个值(x,y)(x,y)(x,y),当一个点的a≤x⋀b≤ya\leq x\bigwedge b\leq ya≤x⋀b≤y,你可以到达这个点,并且x→c,y→dx\to c,y\to dx→c,y→d。问到达最后一个点的最短...原创 2019-11-20 14:16:28 · 246 阅读 · 0 评论 -
G. Performance Review(换人 线段树)
http://codeforces.com/problemset/problem/1252/G题意:给出n个人,每个人有个唯一的能力值,你是第一个人。现在有m次轮换,将每次将KiK_iKi个能力值较小的换出,塞入KiK_iKi个新的人。有q次询问,每次更改m次中的某一次的某个人的能力值,问你是否可以生存到最后。解析:显然对于人数为KiK_iKi的这次轮换,大于你的人的个数最大为n−...原创 2019-11-18 16:02:55 · 333 阅读 · 0 评论 -
E. Rooks and Rectangles(主席树)
http://codeforces.com/problemset/problem/524/E题意: 1e6*1e6里面有1e6个棋子,给出矩形,问每个矩形中是否每一行、或者每一列都有棋子。解析:以每一行为例、每一列做主席树,维护每个点(列方向)的最近的位置。如果区间最近的点在矩形左界的左边,说明不行。代码:#include<bits/stdc++.h>using names...原创 2019-11-08 14:16:09 · 301 阅读 · 0 评论 -
E. Little Elephant and Tree(主席树区间更新)
http://codeforces.com/problemset/problem/258/E题意:给出一棵树,第i个操作选择两个节点,将这两个节点子树上的所有点的集合中加入i。最后对于每个点,输出与这个点集合有至少一个相同元素的点的数量。解析:儿子的子树的信息大于等于父亲的子树的信息,所以是一个树上递增版本的主席树,儿子从父亲转移。我们知道一棵子树的点在dfs序下连续,所以每次操作相当于两...原创 2019-11-05 16:26:17 · 271 阅读 · 0 评论 -
D. Sweets for Everyone!(dp 线段树 复杂情况考虑)
http://codeforces.com/problemset/problem/248/D题意: 有一个字符串,包含H,点和S三种字符,其中H代表人,S代表超市。你现在花了一分钟到达了最左边的点。两个点之间的移动花费一分钟。每个H需要这个糖果,每个S可以出售一个糖果。现在给出时间t,求最少的初始糖果数量,可以在规定时间内让每个H得到糖果。解析:显然二分初始值val,并且显然我到达一个H时如...原创 2019-10-31 16:43:29 · 205 阅读 · 0 评论 -
C. Trip to Saint Petersburg(线段树 区间包含 区间最大值以及位置)
http://codeforces.com/problemset/problem/1250/C题意: 有多段区间,每段区间有价值valvalval,你现在自己定义一个区间,其价值为:∑val−len∗k\sum_{val}-len*k∑val−len∗k,求最大价值。解析:经典模型,从前往后枚举点,实时维护。首先每个点花费k,所以初始化每个点-k,对于一段[L,R]val[L,R]val...原创 2019-10-31 13:09:52 · 724 阅读 · 0 评论 -
Blood Cousins Return(主席树 区间不同值的个数 二分 LCA)
http://codeforces.com/problemset/problem/241/F题意: 有一片森林,点权,每次循环某个点的第kkk层儿子中,点权的种数。解析:森林:让原坐标加一,让111成为虚点就是一棵树了。我按照层序遍历序号,将树变为数组,显然某个点的第kkk层儿子在数组中连续。怎么找这个所在的区间呢?我们知道这个点的第kkk层儿子所在层ddd,ddd层中的最小值LLL和最大...原创 2019-10-30 21:16:05 · 271 阅读 · 0 评论 -
Problem A Circuits(选两点与最多线段相交 线段树)
http://codeforces.com/gym/101987/attachments A题意: 给出多个线段,你选择两个点,与最多的线段相交(与两个点相交只算一次)。解析: 随着第一个点的后移,第二个点需要考虑的线段越来越少,如果按照左端点排序,发现每次被第一个点解除的线段从前往后。所以只需要考虑每个后缀的最优策略即可。代码:#include<bits/stdc++.h>...原创 2019-10-27 19:55:43 · 253 阅读 · 0 评论 -
ACM Tax(主席树 树上路径第k大)
http://codeforces.com/gym/101161/attachments E题意: 求树上路径中值解析: 建从上往下的主席树,两个点a、b,lca为f。那么主席树查询的时候(a−f+b−f)(a-f+b-f)(a−f+b−f)就是这条路径上的状态了。代码:#include<bits/stdc++.h>using namespace std;#define L...原创 2019-10-27 19:30:12 · 317 阅读 · 0 评论 -
C. Nikita and stack(栈操作 想法 线段树)
http://codeforces.com/problemset/problem/756/C题意: 给出n个操作,每个有一个序号。对于每个前缀,求出这些操作按照序号排序后进行操作,结果中栈顶元素是什么。解析: 考虑序号为x的操作,压入元素y,对于包含x的所有前缀,序号大于x的操作刚好完美匹配时,栈顶元素才为y。序号为x的压入操作,区间[1,x]加1。序号为x的弹出操作,区间[1,x]减1...原创 2019-10-25 15:31:56 · 262 阅读 · 0 评论 -
G. GCD Counting(树分治 路径的gcd计数)
http://codeforces.com/problemset/problem/990/G题意: 一棵2e5树,点权,对于[1,2e5],求gcd为这个数的路径的个数。解析: 符合类似求和性质的树上路径计数,典型的树分治问题。对于重心为G的一棵子树,计算出每个点到G的路径的gcd。对这些gcd离散化,两两统计答案即可。猜测gcd的种类不会很多。去不合法情况,只需要传入fa的值再开始做即可...原创 2019-10-25 15:13:40 · 1055 阅读 · 1 评论 -
前缀查询 (字符搜索树)
原题:Wannafly挑战赛14 B题意:有一下4种操作:插入新人名 x,声望为 v给定名字前缀 x 的所有人的声望值变化 v (v为任意整数)查询名字为 x 的人的声望值的和(会有重名的) 查询名字前缀为 x 的声望值的和解析:基本思路,建一棵树,每个结点代表一个字母,且往下有26路分支eg:abae,abax,abad,abb,acc的存储形式如下 每个...原创 2018-05-02 19:40:09 · 2001 阅读 · 0 评论 -
Tree(可持久化字典树 树上区间 LCA)
original link - http://acm.hdu.edu.cn/showproblem.php?pid=4757题意:给出一棵点权树,每个查询要求出两个点之间的路径上的一个点,与给出的值异或最大。解析:区间单点异或===字典树维护一个可持久化字典树,那么(x,y)(x,y)(x,y)分解为(x,lca)+(lca,y)(x,lca)+(lca,y)(x,lca)+(lca,y...原创 2019-08-16 22:01:37 · 296 阅读 · 0 评论 -
Query on A Tree(可持久化字典树)
original link - http://acm.hdu.edu.cn/showproblem.php?pid=6191题意:给出一棵点权树,每次查询求出一棵子树RtRtRt中的一个点,与valvalval异或后数最大,求这个最大的数。解析:首先,子树是一个典型的转化,按照dfsdfsdfs序排到数组中,那么一棵子树所在位置为一段连续区间。问题变为区间内,单点值问题。而单点与给出...原创 2019-08-16 21:31:44 · 288 阅读 · 0 评论 -
2019牛客暑期多校训练营(第九场)——Cutting Bamboos(主席树区间更新 标记持久化)
original link - https://ac.nowcoder.com/acm/contest/889/H题意:有很多个竹子,给出高度,每次查询一个区间,求一个高度HHH使得:区间内的竹子,低于HHH的部分长度比上高于的部分为y−x:xy-x:xy−x:x。解析:考虑从左到右每次加入一个竹子,高度hhh,我们更新[1,h][1,h][1,h]区间加1。那么对于查询[L,R][L,R...原创 2019-08-16 19:08:42 · 241 阅读 · 0 评论 -
2019牛客暑期多校训练营(第八场)Explorer(线段树 分治答案)
original link - https://ac.nowcoder.com/acm/contest/888/E题意:给出n个点,m条边,每条边上有个范围,指定范围的数字才能通过。现在点111上有[1,1e9][1,1e9][1,1e9]想要到达点nnn,问最后有多少个点可以到达。解析:直接搜应该是不行地,我们考虑分治答案。分治区间[L,R][L,R][L,R],将所有包含该区间的边都...原创 2019-08-11 21:18:02 · 318 阅读 · 2 评论 -
Yaoge’s maximum profit(树链剖分 维护两个方向的最值)
original link - http://acm.hdu.edu.cn/showproblem.php?pid=5052题意:给出一棵树,点权。每次查询要从xxx走到yyy,可以在路径之前的地方取一个值v1v_1v1,之后的地方v2v_2v2,你可以得到v2−v1v_2-v_1v2−v1,当然可以不取为0。求每次得到的最大值。走完后,路径上的点权值加上vvv。解析:考虑用树链剖...原创 2019-08-20 15:59:12 · 261 阅读 · 0 评论 -
Find the median(线段树 坐标转换技巧)
原题: https://ac.nowcoder.com/acm/contest/887/E题意:给出n次操作,每次操作[L,R][L,R][L,R],你将i∈[L,R]i\in[L,R]i∈[L,R]塞入集合(多重集,自动排序),问每次插入这些数字后,集合中间的那个数是什么。解析:我们考虑区间更新,查询第KKK大。但是这题要离散化,那么离散化之后有一个问题:比如我更新了[1,5],[3,...原创 2019-08-09 19:44:22 · 267 阅读 · 6 评论 -
Snowy Smile(线段树维护最大字段 最大子矩阵)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=6638题意:给出[−1e9,1e9][-1e9,1e9][−1e9,1e9]上的2e32e32e3个点,求最大子矩阵。解析:一般的O(N3)O(N^3)O(N3)的做法不能做了,考虑这个题的特点,虽然离散化后有2e32e32e3种横坐标,2e32e32e3种纵坐标,如果做4e64e64e6个点的方...原创 2019-08-08 21:31:37 · 633 阅读 · 0 评论 -
动态区间最大子串
原题: http://codevs.cn/problem/3981/题意:每次查询,求给定区间的最大子串。解析:维护区间和SumSumSum,区间最大串MaxMaxMax,从区间左端点开始往右的最大串LmaxLmaxLmax,从区间右端点开始往左的最大串RmaxRmaxRmax。考虑更新Max_rtMax\_rtMax_rt,两个儿子都有一段的情况为:Rmax_ls+Lmax_rsRm...原创 2019-08-08 20:48:00 · 383 阅读 · 0 评论 -
CF786B Legacy(线段树优化建树 区间与区间)
original link - https://www.luogu.org/problem/CF786B原创 2019-08-13 15:42:05 · 256 阅读 · 0 评论 -
5017: [Snoi2017]炸弹(线段树建图 强连通)
original link - https://www.lydsy.com/JudgeOnline/problem.php?id=5017题意:给出位置升序的nnn个炸弹,每个有位置PiP_iPi和爆炸范围RiR_iRi,爆炸后波及的范围为:[P−R,P+R][P-R,P+R][P−R,P+R]。当然,会连锁爆炸。设FiF_iFi为点燃炸弹iii后可以引爆的炸弹数,求∑Fi\sum F_...原创 2019-08-13 13:41:48 · 351 阅读 · 0 评论 -
Query on a graph(基环树 距离2区间更新 线段树 bfs序)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=5957题意:给出一个联通的简单图,NNN点NNN边,也就是基环树。现在有两种操作:更新离点ppp距离小于等于kkk的点,使其权值加vvv查询离点ppp距离小于等于kkk的点的权值和解析:基环树可以看成是一个环将一片森林的的根连起来。我们先拓扑一下,找到环上的点,放入根集合。然后对于每个根...原创 2019-08-05 11:00:54 · 223 阅读 · 0 评论 -
Relief grain(树链剖分 权值线段树 离线)
original link - http://acm.hdu.edu.cn/showproblem.php?pid=5029题意:给出一棵树,kkk个操作:u,vu,vu,v路径上的点的多重集合内放入一个ppp。求所有操作后,每个点的集合内最多的元素是哪个。解析:这题是所有操作结束后再查询,所以应该不需要实时更新,考虑离线。先树链剖分,将所有的链转化为区间。考虑区间更新[L,R](add...原创 2019-08-31 20:33:05 · 276 阅读 · 0 评论 -
线段树之李超树
Brief李超树是一种线段树的应用,主要应用场合为:单点集合域,区间等差插入,求单点最值。For Example - 动态地插入多条二维线段,询问某个xxx对应的yyy值的最值。 - 修改[L,R,b,k][L,R,b,k][L,R,b,k],对于第i∈[L,R]i\in[L,R]i∈[L,R]个集合,插入b+(i−L)kb+(i-L)kb+(i−L)k,询问某个集合的最大值。Proce...原创 2019-09-02 20:15:22 · 546 阅读 · 0 评论 -
Moles(笛卡尔树 Z Algorithm)
original link - http://poj.org/problem?id=4005题意:有n个数,按照给出的顺序依次插入二叉搜索树,然后从小到大遍历(从根开始往下走,最后回来),路过的点值模2构成一个01序列SSS,求这个序列中出现匹配串TTT的次数。解析:可以分为两个问题:怎么构造出树的结构、怎么查询匹配串出现次数。如果直接暴力查看是哪个点的儿子,一条链的情况下复杂度O(n...原创 2019-10-05 18:57:59 · 259 阅读 · 0 评论 -
双向链表练习题(Splay 区间翻转)
original link - https://ac.nowcoder.com/acm/contest/1099/K题意:有nnn个链表,第iii个开始时只有iii一个数。然后操作a,ba,ba,b,将bbb链表合并到aaa后面,然后翻转aaa链表。操作后bbb为空。求最后的第一个链表。解析:区间翻转等于SplaySplaySplay。先开nnn棵SplaySplaySplay树,用rt...原创 2019-10-01 16:40:40 · 618 阅读 · 2 评论 -
Splay(普通平衡树 文艺平衡树)
这里讲一下各个数组需要注意的点siz[]记录子树的大小(插入,删除,儿子发生变化时变化)cnt[]记录当前点上重复值的数量,没有重复时为1 (插入,删除)val[]记录点的值 (插入)fa[]记录父节点编号 (旋转)ch[][0]为左儿子 (旋转)ch[][1]为右儿子 (旋转)root为根(0下面的点) (旋转)laz[]为节点的标记 (更新)什么时候Pushdown:需要用到...原创 2019-09-30 20:13:52 · 259 阅读 · 0 评论 -
F. Choose a Square(线段树 区间选择)
original link - https://codeforces.com/contest/1221/problem/F题意:有一些二维平面的点,每个点有点权,可能是负数。你要选择一个正方形(a,a)(b,b)(a,a)(b,b)(a,a)(b,b),最后的值为框住的点权和减去正方形边长,求最大值。解析:对于一个点(x,y)(x,y)(x,y),选中这个点等同于a≤min(x,y),b≥...原创 2019-09-24 20:36:45 · 388 阅读 · 0 评论 -
E. Sum Queries?(线段树)
original link - http://codeforces.com/contest/1217/problem/E题意:给出一个数组,查询一个区间内的集合SSS,满足存在sumSsum_SsumS的某个十进制位,一个集合内的所有元素在相同的位置都没有相同的值。求最小的sumSsum_SsumS的SSS。要求单点修改。解析:先手玩了一下,发现只要两个数在十进制的某个位上都不是0,那...原创 2019-09-23 16:11:46 · 328 阅读 · 0 评论