线段树
!
fffefw
这个作者很懒,什么都没留下…
展开
-
线段树模板
#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<cmath>using namespace std;#define maxn 100010long long sum[maxn<<2],add[maxn<...原创 2018-05-06 18:59:44 · 108 阅读 · 0 评论 -
HDU多校第六场——HDU6638 Snowy Smile(线段树区间合并)
题意:有n个点(n<=2000),每个点都有价值,求一个矩形内所有点价值和的最大值是多少一维的静态最大子段和用dp在O(n)时间内解决,带修改查询区间最大子段和可以用线段树区间合并O(nlogn)写二维的最大子矩阵和可以通过压行再dpO(n^3)写。这题对坐标离散化一下就转化为求最大子矩阵和的问题了,然后n^3肯定是不行的,然后利用离散后是2000*2000的图上有2000个点,...原创 2019-08-08 20:16:59 · 341 阅读 · 0 评论 -
C. Playlist(权值线段树查询前k大和)
https://codeforces.com/contest/1140/problem/C#include<bits/stdc++.h>using namespace std;#define ls rt<<1#define rs (rt<<1)+1typedef long long ll;#define fuck(x) cout<<#...原创 2019-07-30 14:38:16 · 341 阅读 · 0 评论 -
zoj 1301 Color the Ball 区间合并线段树
Color the Ball题意:一开始全部点为黑色,然后给n个区间染色,染色为白色或黑色,最后统计哪段区间白色最长,要最右边的。这题因为没说区间有多少个点,所以一开始不知道线段树要维护多长的区间,但是操作只有2000种,所以离散化之后点数也就4000,但是如果本来不连续的区间,离散化后可能就连续了,为了解决这个,要在把L-1,R+1也加到离散化数组里总共8000个点,然后L~R之间的线段...原创 2019-07-17 11:43:01 · 150 阅读 · 0 评论 -
poj3321(dfs序+线段树)
题意就是给一棵树,然后有2种操作,一是问以x为根节点的子树有多少苹果,二是更改某点的苹果数量。做法就是用dfs序把树形结构转化成线性结构也就是区间,然后用线段树维护。先要求出每个点的in和out值,然后就给每个点分配了一个新编号了,就是它的in[i],然后dfs序有个特点就是以x为根节点的子树里的节点的dfs序是连续的,所以in[x]~out[x]就对应着这颗子树的信息,查询的话对in[...原创 2019-07-12 09:29:55 · 402 阅读 · 0 评论 -
Coder HDU - 4288
Coder HDU - 4288 题意:你有n次操作,每次可以往集合里插入元素,删除元素,然后如果是求和操作的话,是求升序排序的情况下,pos%5==3的位置的数之和。思路:因为要开权值线段树数很大,所以先把操作离线把要用到的数都离散化了,然后线段树维护的是区间数的个数num和区间位置%5==i的位置的数之和sum[i],我们最后查询的时候要的是根节点的sum[3],这题的关键就是这个pu...原创 2019-07-16 13:34:09 · 191 阅读 · 0 评论 -
求区间不同数字的个数和和
1 Byte = 8 Bit1 KB = 1,024 Bytes1 MB = 1,024 KB = 1,048,576 Bytes一个int是4字节即4Byte.求个数和求和类似,不过是在更新的时候把1变成了这个数的值,下面就讲讲求区间不同数字的个数。首先我们思考对于右端点固定的区间(即R确定的区间),我们如何使用线段树来解决这个问题。我们可以记录每个数字最后一次出现的位置。比...原创 2019-07-16 12:46:52 · 2187 阅读 · 2 评论 -
2019中山大学程序设计竞赛(重现赛)
Triangle题意:给你n个木棒,判断其能否组成三角形。这题就是斐波那契数数列的应用,把斐波那契数列打出来,可以知道第47项就大于2^31-1了,于是的话,最长的不能构成三角形的序列的长度就是46了,若序列长度>=47,那就必有一个长度>=2的区间不满足斐波那契数列,那就可以构成,若序列长度<47就暴力判断。#include<bits/stdc++.h>...原创 2019-04-23 20:46:47 · 780 阅读 · 0 评论 -
Naive Operations HDU - 6315
传送门 题意是给一个长度为n的a,b数组,然后有2种操作,一种是a数组l~r区间+1,第二种是查询l~r区间ai/bi之和。维护区间内最大的a值和最小的b值,对一段区间进行成段更新后,如果maxa==minb说明往该节点的儿子节点更新可能会对该区间之和产生贡献,那就更新下去,往下面更新时若找到了maxa==minb的叶子节点,则该叶子节点的minb加上其初始的值(b[l]),且区间和++,比...原创 2018-09-18 17:36:18 · 113 阅读 · 0 评论 -
Can you answer these queries? HDU - 4027 (势能线段树)
势能分析线段树是这样一个东西,对于某一些操作,不滋磁打标记,只能暴力更改但操作很少次以后就不会改变结果了(最常见的就是区间开根号),我们可以维护一些东西来表示这个区间是否会改变。 题意就是给长度为n的区间,然后有2种操作,一是l~r的每个数变为原数的开方,二是查询l~r区间的和,这样更新方式和一般的加减某个数不一样了,用不了懒标记,那么如果每次更新区间时都进行单点更新的话复杂度是1e5*1e5...原创 2018-09-17 21:57:10 · 167 阅读 · 0 评论 -
D - 集训难度 CSU - 2151
这题就是有两种更新,1.l~r区间每个数加v 2.l~r区间每个数都替换成v。2种更新就要对应2种lazy标记,lazy1是第一个更新方式的,lazy2是第二种更新方式的,当rt节点的区间先是进行了第二种更新方式,然后再进行第一种更新的话,就相当于是区间的每个数都变成了lazy2+lazy1,要是更新顺序反过来的话就不一样了,这个时候对区间里的每个数加上一个lazy1,然后又要把区间里的数都...原创 2018-09-07 00:39:40 · 130 阅读 · 0 评论 -
Present CodeForces - 460C (二分+线段树)
二分最矮的花的高度即可。check函数就是判断一下花是否可以达到mid高度及以上,不能达到就给它浇水,这里还要判断浇水次数有没有超过m,超过了则mid不满足条件。然后因为每浇水一次区间值加+1,然后又需要单点查询,所以我这里用了线段树维护区间。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;...原创 2018-08-23 20:41:03 · 215 阅读 · 0 评论 -
POJ 3468
#include<stdio.h>#include<iostream>#include<string.h>using namespace std;#define maxn 100010#define ll long long#define lson rt<<1,l,mid#define rson (rt<<1)|1,mid...原创 2018-07-27 11:59:12 · 84 阅读 · 0 评论 -
hdu2528 线段树+离散化
题意就是贴海报,然后新贴的海报之间可以覆盖以前贴的,问最后可以看见多少张海报? 海报端点坐标很范围很大,但是对我们来说有用的也就是端点的坐标,例如[1000,2000],[1990,2012]我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些区间,所以我只需要1000,1990,2000,2012就够了,将其分别映射到0,1...原创 2018-07-26 09:50:58 · 191 阅读 · 0 评论 -
hdu1540 Tunnel Warfare
题目大意给你一个01串就是求每个点的最长连续值为1的区间的长度,我们可以将村庄抽象成一个点,正常下值为1,被破坏后变成0,即可将题目抽象成一个求目标节点所在的最长连续1序列的区间的长度。 这题用的是线段树区间合并的方法。对每个区间我们维护5个值l,r,lsum表示从区间的l开始的连续1的长度,rsum相同,msum表示l到r区间最长的连续1的长度。#include<stdio...原创 2018-07-25 19:24:07 · 133 阅读 · 0 评论 -
HDU4027:Can you answer these queries?
题目大意就是给你n个数,然后进行m次操作,区间更新,然后查询区间和。 这题有点特别,因为更新[l,r]时,不是常规的那种更新例如把[l,r]内的每个数换成v或把[l,r]里的每个数都增加v,而是[l,r]内的每个数都更新为其本身的二分之一次方。这样子的话我们就不能通过使用lazy标记来达到不更新到叶子节点偷懒的目的,因为一个sqrt(segtree[i].sum)不一定等于sqrt(se...原创 2018-07-24 21:30:24 · 190 阅读 · 0 评论 -
HDU - 1698 Just a Hook
模板题,区间更新,把l到r区间的每个数都换成z #include<stdio.h>using namespace std;const int maxn=100005;struct node{ int l,r; int lazy,tag; int sum;}segtree[maxn*4];void pushdown(int i){ ...原创 2018-07-24 19:19:29 · 124 阅读 · 0 评论 -
Codeforces Round #576 (Div. 2) D. Welfare State + hdu5306 Gorgeous Sequence (吉司机线段树)
存个板子,区间取最值n(logn)2\mathbb 区间取最值 n(logn)^2区间取最值n(logn)2Codeforces Round #576 (Div. 2) D. Welfare State#include<bits/stdc++.h>using namespace std;#define ls rt<<1#define rs (rt<<...原创 2019-09-10 22:37:07 · 161 阅读 · 0 评论