-
1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1676 Solved: 874 [Submit][Status][Discuss] Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以改变第i个灯的状态.奶牛们执行M (1 <= …
Read More -
hdu3642题目链接 题意:给出若干个(1000)长方体,求至少交三次的空间的体积。 尺寸为[x1,x2],[y1,y2],[z1,z2],其中x,y的坐标的绝对值不超过1E6,Z的坐标的绝对值不超过1E9. 思路: 线段树+扫描线。 由于Z的坐标范围比较小,我们的做法是 利用“微分”的思想,将每个长方体,想成若干的高度为1的矩形(矩形片) 因此就转化成了求矩形至少交三次的面积 其中和矩形交,也就是矩形至少交2次的面积比较类似,只不过线段树多维护一个至少三次覆盖的长度的域。 void PushUp(int l,int r,int rt) { …
Read More -
题目链接 题意: 求矩形周长并。 思路: 线段树+扫描线。 和前面的求面积并比较类似,我们先考虑平行x轴的线段,考虑线段树,维护的一段区间中被矩形覆盖的次数cnt和至少覆盖一次的长度的len. 只不过我们这次求的是每条扫描线的长度对周长的贡献,因此不需要乘高度。 需要注意的是,每条扫描线对周长的贡献,是目前扫描线的长度,与上一次扫描线长度的差的绝对值。(不是与上一次答案的差的绝对值!) 演示x轴求长度和的部分 图片来自 lwt聚聚的博客 以及一个小细节是,求面积的时候,最后一条扫描线对答案是没有贡献的(因为每次是求当前扫描线与下一条扫描线之间的面积) 但是求周长的时候,最后一条扫描线是一定会对答案有贡献的。 /* …
Read More -
题目链接 题意: 求n(1000)个矩形的面积交,也就是至少有2个矩形覆盖的区域的面积。 思路: 和矩形面积并_hdu1542解题报告 类似 面积并问题中,线段树len维护的是至少覆盖一次的区域的长度 在面积交的问题中,我们需要多维护一个"至少覆盖两次的区域的长度"的域(设为double two;) 同时也要维护至少覆盖一次的区域的长度(设为double one;),是因为至少覆盖两次的区域的长度可以由至少覆盖一次的区域长度得到(好像是废话) PushUp的时候要格外注意当前节点被完整覆盖一次的情况。 此时tree[rt].two 可以由两个子区间的one的情况想加得到 (因为rt节点被完整覆盖了至少一次,那么 …
Read More -
hdu1542题目链接 题意: 求n(100)个矩形的面积并。 思路: 扫描线+线段树 题目是2000年中欧区域赛的题目,虽然年代久远,但是有好几个点还是很值得学习的。 首先是离散化的适用范围: 之前比较常用的是将比较大的整数值离散化,常常是因为数值太大无法作为下标。 那么其实,浮点数有的时候也需要进行离散化,比如作为数组的下标,比如用来枚举。 做法上是和将较大的整数值离散化没有区别,因为遇到的题目不多,所以特意记录一下。 第二点是扫描线的思想: 其实扫描线的思想很早就接触过,noip2011的时候,tyvj上有一道类似的题目,不过是一唯的,当时印象深刻的是@Ocean 兄的那个比喻: 一段公路上右很多区间要收不同的费用,区间的开始 …
Read More -
zoj3606题目链接 题意:有个小女孩卖火柴,有n个人会来买,分别在时间t[i],以价格p[i],买的火柴个数为1+(k-1)%3,其中k为这是小女孩第几次卖火柴。 如果有大于w的时间没人来买火柴,小女孩就会睡着。小女孩睡着后如果有人来买火柴,那小女孩就会醒过来,但是不会卖给这个人火柴。现在问使营业额最大的基础上最小的时间间隔w。 思路: 显然,w应该是某2个顾客的来访时间只差(而不是什么任意值). 因此我们可以通过枚举相邻访问时间的顾客的访问之间之差。 我们可以从小到大枚举w,这样就可以保证得到的最大营业额的对应w最小。 构造一颗线段树,维护4个域,cnt表示区间中,确实购买了火柴的顾客的人数,sum[i] (i属于0..2) …
Read More -
题目链接 题意:n(1E5)个操作,分为三种,add x表示将x加到集合中(保证集合中之前没有x),del x表示从集合中删掉x(保证集合中一定右x),sum表示求集合中所有元素按从小到大排列后,所有的下标中满足i%5=3的a[i]的和。1=<x<=1E9 思路:很容易想到的是,由于插入和删除元素造成的位置改变是剧烈的,因此要分别维护i%5==k,k属于0..4的元素的和。 这道题的核心点在于,由于只有1E5个操作,我们可以将元素离散化,这样做的目的是,将每个数和位置一一对应,每个位置用1或者0,表示该位置对应的元素是否在集合中。 考虑线段树,维护6个域,1个是区间中,在集合中的元素个数,剩下5个域,分别表示以该区间的端 …
Read More -
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 9717 Solved: 4244 [Submit][Status][Discuss] Description 现在请求你维护一个数列,要求提供以下两种操作:1、 查询操作。语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。2、 插入操作。语法:A n 功能:将n加 上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取 模,将所得答案插入到数列的末尾。限制:n是非负整数并 …
Read More -
e:题意:那个数,定义hill为一段连续的区间,满足该区间为严格单峰。现在有若干操作,每个操作是对某段区间的数同时增加一个数,问每次操作后,所有的hill中,宽度最大的(区间长度最大)的是多少。 思路:同时增加一个数很线段树。。。但是要维护什么呢。。。? _猜测:肯定要维护一个区间中hill的最大宽度..._ 但是合并的时候要怎么办呢。。。 考虑两个方向的合并。。。 所以还要维护一个区间中,包含右端点的向左单调减延伸的长度,以及左端点的值。 同理,要维护一个区间中,包含左端点的向右单调增延伸的长度,以及右端点的值。 那么每次pushup的时候,就是两个区间hill的最大值,以及两个方向合并的最大值中取最大。。。 。。。上面是我口胡 …
Read More -
题目链接 题意: 地主小花有n座山,这些山在地主家门前排成一条直线。这些山一开始均有相同的高度。 每一天,小花都会要求ZJiaQ开挖机把几座山挖掉一定高度,或者给一些山堆上一些高度。并且要求报告ZJiaQ报告现在有多少座山属于“高山脉” 当一排山的高度相等,并且比这排山左边和右边的山要高时,这排山被称为高山脉。 当然,最左边和最右边的山不可能是“高山脉”的一部分 思路:线段树,要维护的域蛮多的。 下面高山脉简称"HM" sum:区间中HM的总长度。 lsum,rsum,区间中包含左端点,右端点的高度相同的山的长度。 lh,rh:区间中包含左端点,包含右端点的的高度相同的山的高度。 llh,rrh:从左端点向右, …
Read More