线段树中有一个非常重要的东西叫做“lazy”也叫“yeptree”,(yep是2008年物理竞赛银牌保送sjtu联读班),因为yep和lazy在某种意义上是相似的?额,反正lazy是线段树中一个非常常用的东西。为什么管他叫lazy呢?就是每次在修改节点的sum值时,如果每次都下放到叶子节点,那么复杂度会变成nlogn,还不如直接暴力(树状数组还sqrt(n)呢,虽然我不会),而且对于某些修改一大段值的问题,用线段树动态维护的时候,如果找到了要修改的大区间,可以直接在这个大区间上标记,然后改掉sum值,等下次修改或者查询时再修改或者查询它的标记值,这样就可以做到每次查询或修改都为logn,大大节省了时间。
我也是很久没写线段树了,现在能用平衡树就平衡树,不知道怎么的。今天这道题本来很简单结果被我写了N节课一直wa,最后发现lazy之后算sum的时候有个细节没有处理好,额,我总是细节处理不好。但关键是我以前写带lazy的线段树很熟的,居然忘了。还有,现在写程序基本上都是100+,200+的,比noip那时候长多了。话说当时noip第三题标程才50行。
闲话不多说了,上题。
题目大意:
给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c。
简略题解:
就是线段树了,sum代表区间和,col代表染色,就是线段树最基本的操作了。
附程序(118行):