线段树
jinglinxiao
这个作者很懒,什么都没留下…
展开
-
HDU-1754-I hate it (线段树RMQ)
建树,修改,求值。。#include#include#define LL(x) x<<1#define RR(x) x<<1|1using namespace std;const int maxn=2e5+7;const int INF=-1e9+7;int a[maxn<<2];void build(int now,int l,int r){ if(l==r)原创 2017-01-15 12:05:03 · 257 阅读 · 0 评论 -
Codeforces - 811E - Vladik and Entertaining Flags(线段树+并查集)
题目连接:Codeforces - 811E - Vladik and Entertaining Flags线段树结点[L,R][L,R]维护区间 [L,R][L,R] 的答案和第 LL 列与第 RR 列中所有结点的连通关系。 两个相邻区间 [L1,R1][L_1,R_1] 和 [L2,R2][L_2,R_2] 合并时,第 R1R_1 列与第 L2L_2 列相邻的结点颜色相同的用并查集连接起来,同原创 2017-06-02 14:47:32 · 443 阅读 · 0 评论 -
HDU - 6070 - Dirt Ratio(二分+线段树)
题目链接:HDU - 6070 - Dirt Ratio要求存在一个区间使得 size(l,r)r−l+1≤ans\frac{size(l,r)}{r-l+1} \leq ans 。整理得 size(l,r)+l∗ans≤ans(r+1)size(l,r)+l*ans \leq ans(r+1) 。左边一项只与 ll 有关,另一项可以通过 rr 的移动进行区间 +1+1 维护。因此二分 ansans原创 2017-08-03 21:57:58 · 123 阅读 · 0 评论 -
HDU - 1542 - Atlantis (线段树扫描线求矩形并)
题目连接: HDU - 1542 - Atlantis大佬博客讲解通过观察可以发现,以y轴为扫描线从下往上扫,若一个区间下边数量大于上边,则扫描的过程中这部分肯定算面积的,因此用线段树维护这样的区间就行了。#include<bits/stdc++.h>using namespace std;typedef double ld;const int N=207;int n,m;struct L原创 2017-08-11 16:59:24 · 230 阅读 · 0 评论 -
BZOJ - 1568 - Blue Mary开公司(线段树标记永久化)
BZOJ - 1568 - Blue Mary开公司题意是给定若干条直线,然后有若干个询问,每个询问求该坐标所有直线的最大值。 标记永久化的思想就是当且仅当要更新的值优于该区间的所有值时才更新,否则下放。单点询问时取叶子结点到根的最值。 这题更新直线有3种情况: 1. 完全优于,直接更新就行了,O(1)O(1) 2. 部分优于,仅左/右半边需要一直递归,另一个不递归或变成1情况,O(logn原创 2017-08-25 19:15:02 · 318 阅读 · 0 评论 -
Codeforces - 794F - Leha and security system(线段树)
Codeforces - 794F - Leha and security system• 给n个数,两种操作 • 1. 将[l, r]上所有数中数位为x的都改为y • 2. 求[l, r]上所有数的和我们可以对每一个0~9每一个数位用线段树维护它的和(如 9791997919 中数位9的和是 1010110101 ) ,求答案的时候就是∑数位×数位的和\sum 数位 \times 数位的和 。原创 2017-08-26 16:53:19 · 412 阅读 · 0 评论 -
HDU - 4747 - Mex(线段树)
HDU - 4747 - Mex用线段树维护 mex(l,1),mex(l,2),...mex(l,n)mex(l,1),mex(l,2),...mex(l,n) 。 一开始可以预处理出 l=1l=1 的情况 。 然后删去 a[1]a[1] ,由于 mexmex 是递增的,因此只需要修改线段树上第一个比 a[1]a[1] 大的值到下一个为 11 的值这段区间改为 a[1]a[1] 即可。 算法原创 2017-08-28 21:32:42 · 287 阅读 · 0 评论 -
NOI - 2016 - 区间(双指针+线段树)
NOI - 2016 - 区间首先离散化,然后对所有区间按照区间长度排序。然后用双指针。双指针保持 [l,r][l,r] 这段的所有区间叠加后存在叠加次数为 mm 的点。然后 ansans 等于每一次合法时的最小值。这样显然是对的。因为一个合法的答案一定在某次双指针区间内计数。#include<bits/stdc++.h>#define lson (rt<<1)#define rson (rt<原创 2017-08-28 22:57:44 · 460 阅读 · 0 评论 -
HDU - 6183 - Color it (动态开点线段树+剪枝)
HDU - 6183 - Color it 考虑对每种颜色做一棵线段树,维护每个 yy 坐标上的最小 xx 值,因为每个询问的一个边界是 x=1x=1 ,所以每次询问区间 [y1,y2][y_1,y_2] 判断区间 xx 最小值是否比输入给的 xx 小即可。 复杂度是 O(50×106log106)O(50\times 10^6log10^6) ,一种剪枝方法是先读入所有操作然后离散化,这样复原创 2017-09-03 14:42:00 · 633 阅读 · 0 评论 -
线段树题集
POJ-2528线段树的区间染色。如果直接离散化染色肯定会WA。反例:[1,10],[1,3],[3,10][1,10],[1,3],[3,10] 。因此新增左端点左边一个点和右端点右边一个点,然后再离散化,可以避免这种情况。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=1原创 2017-10-18 22:22:14 · 343 阅读 · 0 评论 -
XDOJ-1009-Josephus环的复仇(线段树解约瑟夫环)
题目链接:XDOJ-1009-Josephus环的复仇用线段树维护每个点的相对位置(即该结点及该结点之前共有多少个结点),因此算出相对位置后即可用线段树 O(logn)O(logn) 找出绝对位置。 用区间修改单点查询的线段树。#include<bits/stdc++.h>using namespace std;const int maxn=2e5+7;int pre[maxn<<2],lz原创 2017-04-12 15:04:39 · 980 阅读 · 0 评论 -
Codeforces-786B-Legacy (线段树+最短路)
题目链接:Codeforces-786B-Legacy看到区间很容易就能想到线段树。 对于操作2,我们可以建立一棵线段树,线段树的某一个结点表示区间 [l,r][l,r] ,那么在图中建立一个结点 uu 表示区间 [l,r][l,r] ,新建点 uu 指向 l,l+1,l+2...rl,l+1,l+2...r 的边,权值为 00 。 当得到一个操作 (v,l,r,w)(v,l,r,w) 时,查原创 2017-03-24 19:29:41 · 1743 阅读 · 0 评论 -
POJ-3468-A Simple Problem with Integers(线段树区间修改+区间求和)
与点修改的区别就是update和query的时候,增加一个add数组,update的时候修改这个add数组。如果树上一点表示的区间在要修改的区间内,那么修改他的add和sum就行,如果这个点表示的区间部分在要修改的区间外,那么将他的add下移,并更新下移区间的sum,这样一次update中最多修改2*h(h为线段树的深度)个结点的add和sum。当左右区间update结束后,修改这个区间的sum为原创 2017-01-15 14:22:54 · 426 阅读 · 0 评论 -
HDU-1698-Just A Hook (线段树区间修改,区间查询)
#include#includeusing namespace std;typedef long long ll;const int maxn=1e5+7;int a[maxn<<2];void push_down(int now){ if(!a[now]) return ; a[now<<1]=a[now<<1|1]=a[now]; a[now]=0;}原创 2017-01-15 15:13:50 · 287 阅读 · 0 评论 -
HDU-4027-Can you answer these queries? (线段树,区间开平方,区间求和)
题目链接:HDU-4027-Can you answer these queries?一个数最多开平方8次,所以加个剪枝,当区间和等于区间元素数时,不再递归下去,然后要注意eps开大一点,因为原始数字是long long 的范围。#include#include#includeusing namespace std;typedef long long ll;const i原创 2017-01-15 18:15:09 · 438 阅读 · 0 评论 -
HDU-1540-Tunnel Warfare(线段树求最大连续子区间)
要求最大连续子区间,那么就要使用线段树维护三个东西:①区间最长连续前缀ll②区间最长连续后缀rl③区间最长子区间ml建树时,让ll,rl,ml都是r-l+1。更新时,根据要更新的结点向下,当下方结点的rl,ll,ml更新完毕后,更新当前结点的rl,ml,ll。查询时,更具要查询的结点p向下,对于某一个区间,如果p>=mid-rl+1,那么说明这个结点在左半区间的后缀部分是连续的,那么r原创 2017-01-16 16:43:09 · 415 阅读 · 0 评论 -
HDU-3974-Assign the task(线段树维护dfs序)
题目链接:HDU-3974-Assign the task题意是给定一棵树,然后一种操作是指定一个点,这个点及这个点的的子树被染色,另一种操作是指定一个点,问这个点的颜色。可以通过dfs树将这棵树放在线段上,记结点u在线段上的位置是pos[u],以结点u为根的子树的结点总数是cnt[u],那么在每次染色就是染色线段上pos[u]~pos[u]+cnt[u]-1这段区间。然后用线段树维护原创 2017-01-16 18:08:57 · 1061 阅读 · 0 评论 -
HDU-4614-Vases and Flowers(线段树)
题目链接:HDU-4614-Vases and Flowers题意是有n个花瓶在一个线段上,用0~n-1来标记,有两种操作,第一种是从x开始插花,一直向后插y个花,如果一个花瓶里已经插有花,则不能再插,求第一个插花的位置和最后一个插花的位置,如果一朵花都插不了的话,输出"Can not put any one"。第二种操作是将x到y花瓶里的花拿出来,并输出拿出来的花数。很容易想到用线段树来原创 2017-01-17 12:59:01 · 287 阅读 · 0 评论 -
HDU-4553-约会安排(线段树维护最长连续区间)
题目链接:HDU-4553-约会安排线段树维护最长连续区间,query用来找长度=dur的区间左端点,update更新区间内的ll,rr,mm,ill,irr,imm的值 。#includeusing namespace std;typedef long long LL;const int maxn=1e5+7;int ll[maxn<<2],rr[maxn<<2],mm[原创 2017-02-02 17:08:35 · 659 阅读 · 0 评论 -
中国(北方)大学生程序设计训练赛(第一周)-F(线段树)
题目链接:F 首先知道等差数列的一个性质: abs(ai−aj)=k∗dabs(a_i-a_j)=k*d ,所以一个区间的任意两个相邻项之差的绝对值的gcdgcd 应该是公差 dd ,然后通过最大值-最小值也可以确定一个公差,这两个公差相等的话,且区间内无相同元素,则表明是等差数列。特别的,当最大值==最小值也是等差数列。查询区间内是否有相同元素可以用线段树查询,pre[i]pre[i] 表示 a原创 2017-03-06 18:55:58 · 338 阅读 · 0 评论 -
POJ-2763-Housewife Wind(LCA+dfs序线段树)
题目链接:POJ-2763-Housewife Wind有边权修改的树中两点距离查询。 因为有边权修改,所以用线段树维护到根的序列。 LCA求距离。 这题有个坑点就是不能用vector#include<cstdio>#include<cstring>#include<vector>using namespace std;const int maxn=1e5+7;int a[maxn]原创 2017-03-28 21:50:53 · 466 阅读 · 0 评论 -
2015-2016 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest
2015-2016 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest大佬题解E:这题是阅读题。。。首先找到LCA,把a和b每次向上提时,将其父亲的另一个儿子加入到集合中。把a和b都提到LCA后,把LCA往上提,做同样的操作。#include <bits/stdc++.h>using namespace s...原创 2019-07-09 19:31:03 · 968 阅读 · 0 评论