[Ioi2005]mou

[Ioi2005]mou

Time Limit:10000MS  Memory Limit:165536K
Total Submit:23 Accepted:12
Case Time Limit:1000MS

Description

 

游乐园已经开始运行一个崭新的模拟过山车。模拟的轨道由n 段铁轨组成,并且首尾相连。第一段铁轨从高度0开始。操作员Byteman能通过调整连续几段的铁轨高度来改造这条轨道。在被改造的一段前面的铁轨高度不受影响。 每一次铁轨被调整。后面的轨必须升起或降低来保持连通,并保证起点高度为0。下页举例说明轨道改造过程。
每次开始时车都有足够能量到达高度h。也就是说,只要轨道的高度不超过 h车就一直开下去, 甚至直到结束。
给出每天的运行和改造情况, 为每次运行计算在车停止前,到达的铁轨数。铁轨以一个n个数的数列形式表示 ,一个数对应一段铁轨。第i个di表示在第i段铁轨上的高度变化。也就是说,在到达铁轨i前,如果车的高度是h,那么经过铁轨i后,高度变为h+di。最初轨道是一条水平线。就是说对于所有的i都是di=0。运行和改造交错进行。 每个改造用三个数表示: a , b 和 D。表示从a到b(包括a,b)的所有di改为di=D。每次运行给定一个数字h ——车能到达的最大高度。


Input

输入的第一行包括一个正整数n——铁轨的数目,1≤n≤1000000000。下面的行包括改造和运行,各有一个标识符:
*改造——一个字母I,和整数a,b,D(1≤a≤b≤n,-1000000000≤D≤1000000000),中间用一个空格隔开。
*运行——一个字母Q,和一个整数h(0≤h≤1000000000),用一个空格隔开。
*一个字母E——结束符号,表示输入结束。
你可以假设任意时刻任意铁轨的高度在[1,1000000000]区间内。输入不超过10000行。
50%的数据n满足1≤n≤20000且输入不超过1000行。


Output

第i行需包含一个整数,
即第i次运行经过的铁轨数。


Sample Input


4
Q 1
I 1 4 2
Q 3
Q 1
I 2 2 -1
Q 3
E


Sample Output


4
1
0
3

 

思路:

 

题目实际上是给出一个序列 d[i] , 我们令 s[i]=s[i-1]+d[i],原题转化为求一个最小的i使得h<=s[i]并输出i-1...

线段树节点维护三个域:斜率k 右端点到左端点的高度差sum 线段中最高点到左端点的高度差max,

实际上由于sum和max的性质(记录的只是相对高度,而不是绝对高度),不需改变实际高度.

      tree[ v ].sum := tree[ Ls ].sum + tree[ Rs ].sum ;
      tree[ v ].max := max{ tree[ Ls ].max , tree[ Ls ].sum + tree[ Rs ].max }

count:

      count( v , L , R , h )表示还能爬h的高度

      如果 tree[ v ].k <> $ 可以直接计算

      如果 h > tree[ Ls ].max 说明可以通过左儿子,就count( Rs , m+1 , R , h - tree[ Ls ].max )

      如果 h <= tree[ Rs ].max 说明不能通过右儿子,就count( Ls , L , m , h )

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值