
线段树
Lynstery
一只蒟蒻
展开
-
[线段树] BZOJ1798: [Ahoi2009]Seq 维护序列seq
题意维护序列,需要支持区间加,区间乘,询问区间和。题解水题,直接线段树打两种标记,分别表示乘和加。#include<cstdio> #define LL long long const int maxn=200005; struct node{ int L,R; LL sum,tag1,tag2; node(int L=0,int R=0,LL sum=0,LL tag1=0,LL原创 2017-04-01 21:36:46 · 357 阅读 · 0 评论 -
[枚举 线段树] 51Nod1494 选举拉票
直接做不太可做,我们可以枚举一个 dd 表示其他人最大值不大于 dd 时的方案数。 这样就好做多了,比 dd 大的部分就一定要全部扣掉。然后如果自己的票数不足 dd ,就需要在剩下的所有票里取最便宜的前几个,需要线段树询问前k小值的加和。#include<cstdio> #include<vector> #include<algorithm> #define Fir first #define Se原创 2017-10-24 07:54:53 · 504 阅读 · 0 评论 -
[扫描线 + 线段树] 51Nod1672 区间交
这题数列都是非负的,所以就比较简单了。 可以扫描线,枚举左端点,然后考虑覆盖了左端点的区间,挑右端点第 KK 大就好了。#include<cstdio> #include<vector> #include<algorithm> #include<cstring> #define Fir first #define Sec second #define mp(x,y) make_pair(x,y)原创 2017-10-20 20:46:22 · 323 阅读 · 0 评论 -
[线段树+哈希] Codeforces 452F. Permutation
要注意到这是一个排列,1~n每个数都出现一次,不用上这个条件就做不了。对于一个数 xx , 所有的x−k, x+kx-k,\ x+k 一定在 xx 的同一侧,否则就输出YESYES 。所以就有了这样的解法:从左到右扫描序列,设当前到ii , 已经把 11 到 i−1i-1 的数都丢到权值线段树中了。若此时x−k, x+kx-k,\ x+k 有一个是1,有一个是0,则说明找到了。也就是只要比较一下权值原创 2017-10-06 15:01:04 · 340 阅读 · 0 评论 -
[Hall定理 + 线段树] LibreOJ#6062. 「2017 山东一轮集训 Day2」Pair
可以先对 BB 排序,然后 AA 中的每个数能匹配的 BB 中的元素都是一个后缀的形式。 对于一个 AA 元素的集合是否与 BB 有完美匹配呢? 可以考虑Hall定理,随便选一个B中的集合S: 由于图的特殊性,N(S)=N(S中从下标最小的元素开始的后缀)N(S)=N(S中从下标最小的元素开始的后缀) ,也就是说只要所有后缀都满足 N(S)≥|S|N(S)\ge |S|,则任意集合都满足。 这原创 2017-10-10 21:46:51 · 1047 阅读 · 0 评论 -
[均摊复杂度线段树] Codeforces #438D. The Child and Sequence
水~~~#include<cstdio> #include<algorithm> using namespace std; const int maxn=200005; typedef unsigned long long uLL; struct node{ node* ch[2]; uLL sum,_max; node(uLL t1=0,uLL t2=0,node原创 2017-09-28 11:33:50 · 333 阅读 · 0 评论 -
[线段树] BZOJ2957: 楼房重建
经典题,线段树维护上升序列。#include<cstdio> #include<algorithm> #include<cstring> #define Max(p) p->_max #define lenL(p) p->lenL #define lenR(p) p->lenR using namespace std; inline char gc(){ static char buf[10原创 2017-09-25 21:19:48 · 311 阅读 · 0 评论 -
[线段树] CodeChef Count on a Treap
要求两点距离,只需做到能求两点 lcalca 和任意一点的深度即可。 Treap其实是一棵笛卡尔树,构造过程就是对于 keykey 递增的序列,每次选 ww 最大的作为根,然后两边分为左右子树递归。 那么x,y的 lcalca 实际上就是 [x,y][x,y] 中 ww 最大的,比较显然。 然后就是怎么求深度,考虑一个节点 xx 的父亲,它一定是序列中离 xx 最近的且 ww 大于 w(x)原创 2017-09-25 20:48:33 · 324 阅读 · 0 评论 -
[均摊 线段树] UOJ#228. 基础数据结构练习题
题意题解先膜一下九老师 %%% 可以先感性理解一下,不断进行区间开根号操作,整个序列会不断“趋近于一致“。比如说: 3123 42 5 --> 55 6 2 --> 7 2 1 --> 2 1 1 --> 1 1 1 就算数字之间相差很大,搞几下就很接近了。 由于有区间加操作,所以可以想到从相邻数的差进行考虑。 区间加操作体现到差分数组上只是两个点的改变。 所以就有这样一种想法,不断的原创 2017-05-20 19:43:54 · 642 阅读 · 0 评论 -
[树链剖分+李超线段树] BZOJ4515: [Sdoi2016]游戏
先进行转化,把路径分成两条链,a(deps−depi)+b=(−a)∗depi+a∗deps+ba(dep_s-dep_i)+b=(-a)*dep_i+a*dep_s+b…类似这样变形一下,就转化成和 k∗depi+bk*dep_i+b 的形式。depidep_i 是递增的,所以可以看做是一次函数 y=kx+by=kx+b 在某些离散的点上有定义。 现在需要实现区间插入线段,求区间最小值。这个问题原创 2017-12-02 06:19:04 · 423 阅读 · 0 评论