线段树
文章平均质量分 60
帐下幕僚
我只是一个普普通通的大学学生,我来到这里是想获得我在学校所不能得到的知识。
展开
-
poj2352题解
线段树经典入门题,线段树本弱是一个半月前听的课,没练题,今天第一次做线段树,一个半小时。。。。 这道题由于数据给出是按y递增的,所以难度降低了,否则应该是先根据y大小由小到大来排序。刚开始我不知道要维护那些数据,翻了一下当时的课件,才渐渐理解只需记录元素个数。。。。tree数组要比maxn大两倍(理论上好像是,一般直接三倍)#include <stdio.h>#include <string.h原创 2016-05-23 19:49:52 · 363 阅读 · 0 评论 -
cf-64d(Parking Lot)成段更新+区间合并
题目看了一个小时,想了半个小时,敲了一个小时,debug将近三个半小时。。。。。。//还是看数据的 将停车分成两个操作,先找出停车的起始点位置,然后再成段更新。 这里用线段树维护区间最多能停多长的车(包括前距和后距) 找其实点时,先判断能否放在起点,此时它要放的长度只需lth(+f也无妨), 如果可以,就找到了。 否则要放的长度需要lth+b+f(当放在末尾时,其实不需要+f,但为了方便,原创 2016-09-06 23:09:02 · 407 阅读 · 0 评论 -
线段树进阶学习(例题)--树状数组学习+离散化+成端更新+区间合并+扫描线
树状数组一、树状数组简介 树状数组(Binary Indexed Trees,简称BIT)是一种特殊的数据结构,这种数据结构的时空复杂度和线段树相似,但是它的系数要小得多。它可以方便地查询出一段区间中的数字之和。其查询和修改的时间复杂度均为O(lbN),并且是一个在线的数据结构,可以随时修改并查询。我接下来用一道题目来介绍树状数组的几个基本操作。 【引例】 假设有一列数{Ai}(1<=i<原创 2016-07-26 17:39:41 · 2191 阅读 · 0 评论 -
poj3468(A simple Problem with Integers)(线段树成段增减)
利用懒惰标记使更新延迟到下一次需要更新or询问时。#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>#include <stdlib.h>using namespace std;#define ms(X) memset(X,0,sizeof(X));typedef long long原创 2016-06-28 21:35:33 · 263 阅读 · 0 评论 -
hdu1698Just a Hook(线段树+懒惰标记)
这是一道成段更新的典型例题。成段更新需要用到懒惰标记。简单来说就是每次更新的时候先不更新到底,用懒惰标记使更新延迟到下一次要更新or询问时。(P.S. 大数据输出和读取不要用cin,cout,今天手残,没事做,tle,tle,。。。)#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>原创 2016-06-28 20:37:22 · 502 阅读 · 0 评论 -
hdu1754 i hate it(题解)
这道题果然是i hate it,虽然是线段树的最最基础题,但我tle了30,40发,debug一个月多才知道tle在哪里。 由于我是用纯C写的,没有max函数,我就自己用预处理宏,写了一个,对,tle就在这里,如果你是用c++里面的max就ac了。 我tle的代码#include <stdio.h>#define mMax(X,Y) ((X)>(Y)?(X):(Y))int tree[800原创 2016-06-03 21:28:28 · 510 阅读 · 0 评论 -
poj2182 lost cows题解(线段树)
这道题如果思路对了就很简单,倒着读数据,然后这道题维护的是区间上未填充元素的个数。#include <stdio.h>int tree[8010<<2],arr[8010],i,n;void build(int tn,int l,int r){ int mid; tree[tn]=r-l+1; if(l==r) return; mid=((r-l)>>1)+l;原创 2016-06-03 20:10:26 · 453 阅读 · 0 评论 -
hdu1349(题解) Minimum Inversion Number
先用线段树求出最初的逆序数(O(nlogn)),然后推其他(O(n)) 设a1,a2,……an的逆序数为sum,an的逆序数为invn,则an,a1,……an-1的逆序数=sum-invn+比an小的数,而由于输入的数是0,1,……,n-1 所以比an小的数==an,而且invn=n-1-an;所以an,a1,……an-1的逆序数=sum+2*an-n+1,下面代码是反过来,道理是一样的#inc原创 2016-05-30 23:26:11 · 425 阅读 · 0 评论 -
poj2828题解buy tickets
排队问题 大神都说简单的题,想了很久忍不住看了别人的题解,从后面反向读取(本来我是有这样想的,很快被我否定掉了,简直zz),线段树维护区间中未填充元素的个数。 如果一个元素的‘位置’(pos+1)<=当前树的左子树,否则走右子树(走右子树必须减去左子树的未填充个数) 再开个ans放答案,注意当left==right时,left就是当前元素应该的输出位置,所以直接ans[left]=val.#i原创 2016-05-26 23:20:11 · 344 阅读 · 0 评论 -
hdu 2795 billboard题解
刚开始看到题总不知道要维护什么?估计是因为我弱爆了。。。。 维护区间的最大值,先走左子树,#include <stdio.h>#define maxx(X,Y) ((X)>(Y)?(X):(Y))int tree[800003],h,w,n;int find(int tn,int left,int right,int wi){ int mid,res; if(left==r原创 2016-05-26 10:48:15 · 341 阅读 · 0 评论 -
hdu1166题解
这道入门题十分经典,基本给出线段树的模板了(建树,改变树,取值) 很容易看出这道题区间维护的是和。#include <stdio.h>#include <string.h>int tree[150001],N,res[40000];void build(int tn,int left,int right){ int mid; if(left==right) { scan原创 2016-05-24 09:35:07 · 313 阅读 · 0 评论 -
poj3264题解
线段树入门题 在分支的时候没把握好,出来了奇奇怪怪的答案,再加忘了初始化,,,#include <stdio.h>#include <string.h>#define MAx(X,Y) ((X)>(Y)?(X):(Y))#define MIn(X,Y) ((X)<(Y)?(X):(Y))int N,minnn,maxxx;struct _tag{ int tmax,tmin;原创 2016-05-23 20:47:26 · 260 阅读 · 0 评论 -
bzoj2243染色(树链剖分+区间合并)
这道题是点的树链剖分。 修改链,询问链。 树链剖分的意思就是将树线性化 树剖之后就变成区间修改和区间询问了。 询问的是颜色段数量,所以就是区间合并,并且树链合并时还要判断两个链的端点是否颜色相同。 (3个半小时,菜不成声)#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#define原创 2016-11-06 10:37:49 · 275 阅读 · 0 评论