本题超坑爹,先是题意看了半个多小时都不理解样例,后来去找别人的题解才看懂了。
问题是,给k,q
k是火车最多能运载的人数,q是询问次数
q行 每行两个数a,b 指有一个人要从a站做到b站,是否合法
即,第一次假设列车是从1开始,一直走到尽头(1000000)
当火车遇到一个(a,b)时 ,先查询区间(a,b-1)的值是否小于k(表示列车在这段路上搭载少于k个人),若是,就把区间(a,b-1)的值加1,
如果查询结果大于k,则标明这时火车已经有k个人了,不能上车。
例如 k=2 先
给(1,3) 可以上 ,此时【1,3-1】区间标记为1 ,(为什么标记到区间b-1?因为在b点人已经下车,所以就没有加1)
给(2,3)可以上,此时【2,2】区间标记为1+1(之间为1) 同时把【2,2】区间以上的父区间都更新为子节点中较大的一个,即如果【2,2】区间已经为2,即满人了,那么【1,3】区间也要是满人了,但是【1,1】区间不属于【2,2】的父区间,仍然可以载人 ()
再给(1,3) 查询到 (1,3)区间的值为2=k,所以这个人不可以上
再给 (4,8) 这个区间是值为0,可以上
以上纯属举例示范,题中保证a
用的办法自然是线段树的成段更新操作,只不过把 之前的每个节点记录他所代表的区间的区间和,变为,每个节点距离他所代表区间的最大值
也少不了延迟操作,避免超时嘛。
------------------------------------------------------------------
然而如此水的题我也TLE了几个小时,因为本人在vc上敲这个代码,然后vc不支持max()函数,只有个__max(),然后我就用了后者,一直超时,最后发现自己写个max,不用__max 就ac了
用__max一直tle。不知道是不是poj的问题
#include
#include
#include
#include
#include
#include
#include
#include
#include