链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset  清空所有内存2.New x  分配一个大小为x的内存块返回,返回能分配的最小的起始点 3.Free x  释放当前点所在的内存块,并输出左右端点 4.Get x  返回第x个内存块的起始点 讨论每个操作的写法: 第一个操作,把线段树初始化就好了 第二个操作,区间合并的基础操作, 第三个操作:多维护两个数组:st,ed代表当前点所属内存块的左右区间 第四个操作:…
hdu 2871 Memory Control 题意:就是对一个区间的四种操作,NEW x,占据最左边的连续的x个单元,Free x 把x单元所占的连续区间清空 , Get x 把第x次占据的区间输出来, R 清空整个区间. 解题思路:这个题就是一个区间合并,以前用线段树写的,拿来练练splay.要记录的是区间最大的连续空格,要维护这个最值,需要两个辅助的值,该区间左边连续的最值和右边连续的最值.更新的时候仔细就好了,其他就是splay的常规操作的.还有就是记录占据的连续区间和查找占据的连续区间…
题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内存块 Get x:查询第x个内存块,输出左地址 解题思路:一開始全用线段树去做,写的乱七八糟,事实上仅仅要用线段树维护可用内存.然后用户一个vector记录全部的内存块. #include <cstdio> #include <cstring> #include <vector&…
一共4种操作 其中用线段树 区间合并,来维护连续空的长度,和找出那个位置.其他用vector维护即可 #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include <iostream> #include<vector> #define lson i<<1 #define rson i<<1|1 #define N…
●赘述题目 四种操作: ○Reset:将整个内存序列清空. ○New a:在尽量靠左的位置新建一个长度为a的内存块,并输出改内存块起始位置.(各个内存块即使相邻也不会合并..) ○Free a:将a点所在的内存块清空,并输出清空的内存区间的左右端点. ○Get a:输出从左往右数的第a个内存块的起始位置. ●题解 方法:Splay在线维护 (○本来想的将序列中的每个点看作Splay树中的一个节点,然后进行区间操作..但似乎比较麻烦..) ○正解(erge大佬提出的思路):考虑到每个内存块不会合并…
传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请一块长度为 x 的内存块(满足起始地址尽可能小): 如果找到,输出 "New at A",A表示该内存块的起点,找不到,输出 "Reject New". (3)Free x :表示把包含第 x 块单位内存的内存块清除: 如果 x 在某内存块中,输出 "Free…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续0的最长长度,l1是从区间左端开始连续1的长度,r1是从区间右端开始连续1的长度,l0是从区间左端开始连续0的长度,r0是从区间右端开始连续0的长度,lazy标记该区间是否进行异或操作. 之所以要同时保存1的连续长度和0的连续长度,是因为这道题设计取反操作,所以取反是,只需将对应的0.1长度调换一下…
<题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事.  我们已知小明一共有T的空闲时间,期间会有很多女神或者基友来找小明.  作为一个操作系统曾经怒考71分的大神,小明想到了一个算法,即“首次适应算法”,根据操作系统课本的描述,就是找一段最靠前的符合要求的连续空间分配给每个请求,由此小明…
LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6069    Accepted Submission(s): 2635 Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (index…
<题目链接> 题目大意: 给你一段序列,对其进行两种操作,一是修改某个序号的点的值:二是查询某个区间的LCIS(最长上升子序列). 解题分析: 线段树区间合并的典型例题,用求某个区间的LCIS时,需要比较三个值,一是左区间的LCIS,二是右区间的LCIS,三是左右子区间合并的LCIS.最重要的是第三点如何实现,实现第三点需要维护一个最长后缀上升子序列和最长前缀上升子序列,总之,相对于一般的线段树,区间合并需要对Pushup()函数进行一些改动,query()的时候也要记得对三种情况进行讨论.…