线段树
LowestJN
强省弱OIer
展开
-
[贪心 线段树] LOJ#2472. 「九省联考 2018」IIIDX
从1到n枚举,逐位确定。首先可以把关系树建出来,一个点的权值要大于等于父节点的权值。如果没有相同数字的,第 iii 以及它子树种的点会选择 [n−sizei+1,n][n−sizei+1,n][n-size_i+1,n] 这个区间里的数,选完后把这个区间删去,继续考虑 i+1i+1i+1如果有重复的数字,那么第 iii 个点会选择第 n−sizei+1n−sizei+1n-size_i...原创 2018-04-07 21:29:41 · 597 阅读 · 0 评论 -
[线段树] Codechef December Challenge 2017. Red and blue points
没有大腿打CC是真的累跟JOI这题一个套路#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=2010;struct pt{ int x,y,c; friend bool operator <(pt a,pt b){ return a.x<b.x || (a原创 2017-12-11 20:42:49 · 460 阅读 · 1 评论 -
[bfs序 线段树] HDU5957. Query on a graph
求出bfs序那么一个点的儿子和孙子都是在bfs序上连续的一段记一下这个区间,然后线段树维护一下因为有环,那么肯定有多出来的一条边,给这条边的两个端点以及这两个端点连出去的点打个标记就好了细节贼多#include <cstdio>#include <iostream>#include <algorithm>#include <queue>using namespace std;typedef l原创 2017-11-29 20:15:25 · 376 阅读 · 0 评论 -
[线段树 哈希] BalkanOI 2016. Haker
题目是给定一个字符串,有三种操作.一种是询问两个子串是否相同一种是区间内的 aa 变成 bb,bb变成 cc … zz 变成 aa一种是区间 [L,R][L,R] 变成原串的区间 [k,k+R−L][k,k+R-L] 的子串因为要判断是否相同,肯定就要HASH,因为第二种操作,要记一下每个字母出现的位置的hash值第三种操作的话,用前缀和记一下原串的hash,打一个标记就好了复杂度 O(nlogn×原创 2017-10-31 11:40:38 · 418 阅读 · 0 评论 -
[线段树 & 前缀 优化建图 二分 2-SAT] CF Gym100159 facebook-hacker-cup-2012 I. Unfriending
二分答案对于一个点,肯定有一个区间里的点和它不能共存这个可以用线段树优化建图,每个friend list最多只能删一个,用前缀优化建图还要一些针对随机数据什么的trick才能过…比如二分中的那个特判#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>using n原创 2017-10-21 23:20:57 · 646 阅读 · 0 评论 -
[树链剖分 线段树] Codeforces 860E. Arkady and a Nobody-men
按照深度从小大加入,就是一个很典型的熟练剖分加线段树实现路径修改、询问的模型复杂度是 O(nlog2n)O(n\log^2n)最后一个点加个标记永久化、记忆化什么的卡一卡才能过…#include <cstdio>#include <iostream>#include <algorithm>#include <cmath>#include <vector>#include <set>#in原创 2017-10-18 12:28:56 · 504 阅读 · 0 评论 -
[线段树 哈希] Codeforces452F. Permutation
考虑第 ii 位上的数 aia_i ,如果对于任意 k∈[1,min(ai−1,n−ai)]k\in[1,\min(a_i-1,n-a_i)] ,ai−ka_i-k 和 ai+ka_i+k 都在它左边或者都在它右边,那么就不会存在以 aia_i 为中位数的长度为3的等差数列。那么我们从左往右扫这个数列,用权值线段树记录哪些数出现过,那么就是判断区间 [ai−k,ai][a_i-k,a_i] 和 [a原创 2017-10-06 18:28:02 · 387 阅读 · 0 评论 -
[LCT && 主席树] BZOJ3514 .Codechef MARCH14 GERALD07 加强版
挺套路的题 如果我们对所有联通块取一棵生成树 那么联通块个数是点数减去边数(因为一棵树的点数-边数=1) 那么题目就是求这个区间里的边构成的图的生成树的边数以加入的时间为权值,用LCT维护最大生成树,如果一条边加入图中会形成环,那么肯定要把这两点间的最小边删去后再加入边,设最小边权为k,那么就是要把1~k的边都删去后这条边才会存在在生成树上。 用主席树维护和查询就好了#include <cs原创 2017-09-18 21:39:15 · 524 阅读 · 0 评论 -
[均摊复杂度线段树]Codeforces 438D. The Child and Sequence
首先一个数模一个小于它的数,肯定会变成原来的一半那么用均摊复杂度线段树的套路,记一下区间最大值,区间取模时,如果区间最大值小于模数,那么不会改变数列,直接退出,否则暴力递归。每个点最多变化log次,复杂度应该就是 O(nlog2n)O(n\log^2n)#include <cstdio>#include <iostream>#include <algorithm>using namespace原创 2017-09-25 17:04:14 · 401 阅读 · 0 评论 -
[线段树模拟Treap]Codechef COT5 .Count on a Treap
很早以前留下的坑了首先把所有点按key排序,那么这个序列就是Treap的中序遍历了。 很显然两个点之间的weight最大的点是它们的LCA那么根据 ans=depthx+depthy−2∗depthlcaans=depth_x+depth_y-2*depth_lca 只要能算出 depthxdepth_x 就行了。画画图可以知道这个值就是这个点往两边的上升序列长度之和,可以用BZOJ2957的做原创 2017-09-25 17:00:11 · 546 阅读 · 0 评论 -
[线段树模拟平衡树] HDU4942. Game on S♂play
刚开始想用Splay、Treap什么的维护dfs序…打起来贼烦 打完后vectorxj大佬说用中序遍历就好了…因为旋转后一棵树的中序遍历是不会变的,那么每次旋转就是改变了下子树在中序遍历中的区间,然后用线段树模拟一下就好了。#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int原创 2017-09-25 16:46:23 · 415 阅读 · 0 评论 -
[线段树] 「JOI Open Contest 2017」Bulldozer
老早以前的坑了题意大概是,给定平面内 n(≤2000)n(\le 2000) 个点,每个点有个可正可负的点权,求两条平行的直线,使得所在在这两条直线之间的点权和最大首先,如果我们知道这两条直线的斜率,假设这条线没有把这些点分成两个点集,那么可以把点按照距离直线的距离排序,记排序后的数列为A。转动直线,那么会有一些点对交换在A中的位置,总共有 O(n2)O(n^2) 次交换,把这些交换按极角排序,依次原创 2017-12-03 21:38:33 · 702 阅读 · 0 评论 -
[李超线段树] BZOJ3165 [Heoi2013]. Segment
李超线段树裸题#include <cstdio>#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int N=100010,MX=40000;int n,lst,cnt;inline char nc(){ static char buf[100000],*p1=buf,*p2=b原创 2017-12-12 20:44:45 · 327 阅读 · 0 评论 -
[主席树优化建图] LOJ#546. 「LibreOJ β Round #7」网格图
最简单的思路是离散化后 O(k2)O(k2)O(k^2) 搞然而对于横着的朝向,极长的横着相连的格子的答案是相同的,竖着的同理那么把极长的相连的格子也缩起来,用主席树优化建图,就可以 O(klogk)O(klogk)O(k\log k) 最短路了#include <cstdio>#include <iostream>#include <algorit...原创 2018-02-25 21:17:16 · 591 阅读 · 0 评论 -
[回文串 线段树] Codeforces Gym100032 ICL Cup 2012 K. Subpalindromes
题意是求一个区间里回文串的个数(出现位置不同的回文串算不同)用马拉车算出以每个点为中心的最长回文串长度考虑点 iii,iii点到以它为中点的最长的回文串的端点长度为 xxx那么它对一个询问的贡献是 min{i−L,R−i,x}min{i−L,R−i,x}\min\{i-L,R-i,x\}把询问的区间分成两部分 [L,mid][L,mid][L,mid],[mid,R][mid,R]...原创 2018-03-11 19:14:16 · 500 阅读 · 1 评论 -
[线段树 博弈] 一道博弈题
障碍点数和询问点数都是1e5 坐标范围为1e9(实际数据既然有大于1e9的)一个点的下方或左边存在必败点,则为必胜点,否则为必败点同一行的障碍会把这一行分成很多段,段与段之间是互不影响的。考虑同一段的点,若其中一个点为必败点,则之后的点一定是必胜点,也就是说要找到第一个必败点扫描线枚举每一行,用线段树维护每个位置是否有必败点,每一段的询问相当于在线段树上二分找到第一个没有必败点...原创 2018-03-15 10:41:14 · 396 阅读 · 0 评论 -
[dfs序 线段树] LOJ#6276. 果树
考虑相同颜色的两种节点,这两个节点会把树分成三部分(左、中、右),左部分的点不能和右部分的点组成一种方案枚举每一个点,只要求出有多少个点能和它组成合法点对就行了枚举每一对颜色相同的节点,在dfs序上搞一搞就行了#include #include #include #include using namespace std;typedef pairint,int> par;原创 2018-02-03 16:34:53 · 512 阅读 · 0 评论 -
[dfs序 主席树] HackerRank University CodeSprint 3. Simple Tree Counting
Hillan大佬神奇的idea求出树的dfs序,只要能处理加边和删边操作就行了令加入的边为 (x,y)" role="presentation">(x,y)(x,y)(x,y),不妨设 x" role="presentation">xxx 是 y" role="presentation">yyy 的父亲,令 z" role="presentation">zzz 为 x" role="pre原创 2018-01-26 16:08:53 · 371 阅读 · 0 评论 -
[主席树 链剖] LOJ#6073. 「2017 山东一轮集训 Day5」距离
刚开始想了一个很naive的分块加虚树的做法,不管时空复杂度还是代码复杂度都巨大可以把问题转发成求 ∑i∈path(u,root)dis(pi,k)\sum_{i\in path(u,root)}dis(p_i,k)再推一下式子就得到 ans=∑i∈path(u,root)dis(pi)+depthu×dis(k)−2∑i∈path(u,root)dis(lca(i,k))ans=\sum原创 2018-01-18 09:58:56 · 526 阅读 · 0 评论 -
[分治线段树 & 线性基] BZOJ4184: shallot
明显的分支线段树加线性基 我刚开始每个节点都开了个线性基,内存是满的 O(nlogm)" role="presentation">O(nlogm)O(nlogm)O(n\log m),被卡了#include #include #include #include #include #include using namespace std;const in原创 2018-01-25 08:18:36 · 456 阅读 · 0 评论 -
[长链剖分 & 线段树] BZOJ1758[Wc2010] 重建计划
学一发长链剖分 原来以前在ATCODER上做的一题就是这个套路…#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=100010;int n,U,D,cnt,dpt[N],d[N],G[N],son[N],fa[N];struct edge{ int t,nx;原创 2018-01-02 10:59:26 · 477 阅读 · 0 评论 -
[线段树]「CodePlus 2017 11 月赛」Yazid 的新生舞会
每种颜色单独做枚举右端点,另 pip_i 表示前缀 ii 中,当前颜色的个数, qiq_i 表示前缀 ii 中不是当前颜色的个数那么答案就要加上满足 pr−qr>pl−1−ql−1p_r-q_r>p_{l-1}-q_{l-1} 的 ll 的个数这个东西线段树大力搞吧……#include <cstdio>#include <iostream>#include <algorithm>#includ原创 2017-11-27 21:22:20 · 762 阅读 · 0 评论 -
[历史最值线段树] UOJ#164. 【清华集训2015】V
这种标记很强啊… UR#11 C题解#include <cstdio>#include <algorithm>#include <iostream>using namespace std;typedef long long ll;const int N=500010;const ll inf=1LL<<60;int n,m,a[N];struct tag{ ll a,b; tag(原创 2017-12-13 19:51:42 · 506 阅读 · 1 评论 -
[树链剖分 李超线段树] BZOJ4515 [Sdoi2016] 游戏
链剖以后就跟数列的做法一样了这题是区间覆盖区间查询,所以还要记一下区间里所有函数的最小值#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int N=100010;int n,m,cnt,tt,G[N],dpt[N],id[N<<2];ll原创 2017-12-13 17:43:08 · 591 阅读 · 0 评论 -
[主席树维护HASH] Codechef. Cloning
传送门直接用主席树维护HASH比较就可以了吧…#include <cstdio>#include <algorithm>#include <iostream>using namespace std;typedef unsigned long long ll;const int N=100010;const ll base=100003;int t,n,q,cnt;int a[N],rt[N]原创 2017-08-29 11:23:51 · 412 阅读 · 0 评论 -
[主席树维护HASH && SET维护DFS序] Codechef. Walks on the binary tree
传送门每次加一个串 x 会增加 n-max{LCP(x,i)},因为是树上,max{LCP(x,i)}就肯定是dfs序中跟它相邻的点,也就是它们的lca深度最深。 那么就用set维护一下dfs序,比较的话,用主席树维护hash#include <cstdio>#include <iostream>#include <algorithm>#include <set>#include <cst原创 2017-08-29 11:22:11 · 433 阅读 · 0 评论 -
[BZOJ3189][Coci2011][扫描线][线段树]Slika
首先发现LOAD和与其对应的SAVE之间的操作是没用的,所以可以O(m)扫两遍出去SAVE和LOAD操作。对于这种矩形覆盖的问题,可以用扫面线加线段树处理。 开两棵线段树,用来记录(x+y)为奇数或偶数的时候被覆盖的情况,我们不妨扫描线扫x坐标,那么随着x+1,只要交换一下两颗线段树就可以了。对于线段树中的一个结点,开一个set记录一下覆盖了这个结点表示的区间的颜色以及时间,以时间为关键字(我直接原创 2017-04-17 19:54:26 · 586 阅读 · 0 评论 -
[BZOJ3179][Coci2012][线段树][贪心]RASPORED
写几个数据就可以发现把t从小到大排序后是最优的。 那么只要用splay或线段树动态维护一下这个序列就可以了#include <cstdio>#include <iostream>#include <algorithm>#define N 200010#define X first#define Y secondusing namespace std;typedef long long l原创 2017-04-17 19:42:51 · 505 阅读 · 0 评论 -
[BZOJ2325][ZJOI2011][树链剖分][线段树]道馆之战
调了一个晚上 代码又臭又长为什么zjoi2011的题目都是代码量那么大的题…考虑在一条链上的情况,可以用线段树记录一个区间的八个值-从左端点的A往右走的最大步数 -从左端点的B往右走的最大步数 -从右端点的A往左走的最大步数 -从右端点的B往左走的最大步数 -从右端点的A到左端点的A或从左端点的A到右端点的A的最大步数 -从右端点的A到左端点的B或从左端点的B到右端点的A的最大步数 -原创 2017-03-13 21:54:40 · 855 阅读 · 0 评论 -
[BZOJ2130][均摊复杂度线段树]魔塔
%%%Hillan具体题解可以去看Claris的博客 暴力线段树复杂度摊一摊就nlogn了#include <cstdio>#include <algorithm>#include <iostream>#define N 100010using namespace std;int t,n,r;int A[N],B[N],C[N],K[N],K1[N],f[N],ca[N],cb[N],c原创 2017-03-22 21:43:53 · 704 阅读 · 0 评论 -
[BZOJ3307][线段树合并]雨天的尾巴
题意N个点,形成一个树状结构。 有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。 完成所有发放后,每个点存放最多的是哪种物品。看POPOQQQ大神的题解吧…… http://blog.csdn.net/popoqqq/article/details/45674373之前觉得线段树合并没什么用,现在打脸了……#include <cstdio>#incl原创 2017-03-03 19:02:20 · 564 阅读 · 0 评论 -
[BZOJ4127][树链剖分][线段树][乱搞]Abs
题意给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和想了半天不会做…… 搜了发题解因为d非负,所以最多n次有一个从负数变成正数,那么用线段树记录一下区间中最大的负数,当这个最大负数加上d后变成正数的时候,继续往下update,因为最多只会有n次,所以复杂度也是nlogn级别的#incl原创 2017-03-02 20:49:15 · 525 阅读 · 0 评论 -
[BZOJ4552][Tjoi2016&Heoi2016][线段树][二分]排序
题意求给定序列经过给定排序网络后的第k个元素鏼爷15年论文小例题%%%二分答案x,原数列中大于等于x的设为1,小于x的设为0。 每一次排序的区间[l,r]中,有k1个0,k2个1,那么升序就把前k1个覆盖为0,后k2个覆盖为1,降序相反。 可以用线段树维护。#include <cstdio>#include <iostream>#include <algorithm>#define N 1原创 2017-02-13 20:01:21 · 546 阅读 · 0 评论 -
[BZOJ4372][动态树分治(点分树)][动态开点线段树]烁烁的游戏
题意给一颗n个节点的树,边权均为1,初始点权均为0,m次操作: Q x:询问x的点权 M x d w:将树上与节点x距离不超过d的节点的点权均加上wdfs出点分树每个重心要记录这个重心以下的子点分树的修改信息,可以用区间覆盖单店查询的线段树维护,因为会有重复的部分,每个重心还要再开一棵线段树记录重复的部分#include <cstdio>#include <iostream>#include原创 2017-02-28 18:23:19 · 819 阅读 · 0 评论 -
[BZOJ3600][线段树][替罪羊树]没有人的算术
%%%vfk %%%陈老师本蒟蒻觉得用重量平衡树打tag像是在线的离散…… 看到这题的第一感觉也是能不能用很小的复杂度对每一次操作后离散一遍,感觉这确实是个好方法#include <cstdio>#include <iostream>#include <algorithm>#define N 600010using namespace std;struct lef{ lef *fa,原创 2017-02-16 17:10:48 · 574 阅读 · 0 评论 -
[BZOJ3038]上帝造题的七分钟2
题意给定一个数列,有两种操作,询问一段区间[l,r][l,r]内的和或者对于i∈[l,r]i\in[l,r]的xi=⌊xi−−√⌋x_i=\lfloor\sqrt{x_i}\rfloor因为xi≤1012x_i\leq10^{12},所以对每个数最多开大约6~7次根就能变成1,所以可以对已经全变成1的区间打标记,还没有全部变成1的区间暴力。#include <cstdio>#include <cm原创 2017-01-03 19:54:22 · 495 阅读 · 0 评论 -
[BZOJ4373][线段树]算术天才⑨与等差数列
%%%Claris 我比较蠢……打了三个线段树,至于preipre_i可以对于每一种权值开个set记录位置,然后搞一搞#include <cstdio>#include <iostream>#include <algorithm>#include <map>#include <set>#define N 300010using namespace std;int n,m,ttt;i原创 2017-04-05 20:36:29 · 396 阅读 · 0 评论 -
[Codeforces773E] [线段树] [找规律] Blog Post Rating
题意大概是 有一个博客,初始赞数为0,每个人会浏览这篇博客,如果这个人期望的赞数大于这边博客的赞数,他就会赞这篇博客,如果小于这篇博客,就踩一下(博客赞数-1),相同就不操作。询问对于每个i,1~i的人按照一个顺序浏览,求一种顺序使得博客最后的赞数最大,输出这个最大的赞数。先瞎猜一下,这1~i个人肯定是按照期望的赞数升序访问最优。 然后写个暴力交一下,发现T了,说明这个结论是对的那么只要维护一原创 2017-05-19 06:45:50 · 1190 阅读 · 0 评论 -
[最短路 && 主席树维护HASH] 51nod1863 Travel
把一条路径上的点值按排名顺序排序,那么路径的优劣就是字典序。相当于是求一条字典序最大的路径。 最长路然后就是老套路,用主席树来维护hash,就可以在O(log)的时间里比较两个串的字典序,然后就套最短路就可以了用对优化的DIJ复杂度就是O((N+M)lognlogn)O((N+M)\log n\log n)#include <cstdio>#include <iostream>#include原创 2017-08-29 11:13:14 · 773 阅读 · 0 评论 -
[最短路 && 主席树维护HASH]Codeforces 464E. The Classic Problem
传送门 老套路 跟51nod1863一样。 就是多了进位#include <cstdio>#include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <queue>#include <assert.h>#def原创 2017-08-29 11:16:46 · 474 阅读 · 0 评论