exp

Posted on 2020-04-14 19:08  __wxyz  阅读(174)  评论(0)    收藏  举报

树剖易错 :

  节点序和dfs序(线段树上序)易混淆

整体二分易错: 

  rec数组的pushdown要先于 tag 的pushdown,

  否则会出现 tag 的pushdown里先给 tag 赋值, 然后rec的pushdown里又把tag 和 sum 清零了

  正确代码如下: 

void pushdown(int u, int len) {
	if (rec[u]) {
		sum[u << 1] = sum[u << 1 | 1] = 0; 
		tag[u << 1] = tag[u << 1 | 1] = 0; 
		rec[u << 1] = 1; 
		rec[u << 1 | 1] = 1; 
		rec[u] = 0; 
	} 
	if (tag[u]) {
		sum[u] += tag[u] * len; 
		tag[u << 1] += tag[u]; 
		tag[u << 1 | 1] += tag[u]; 
		tag[u] = 0; 
	} 
} 

  错误代码如下:

void pushdown(int u, int len) {
    if (rec[u]) {
        sum[u] = tag[u] = 0; 
        rec[u << 1] = 1; 
        rec[u << 1 | 1] = 1; 
        rec[u] = 0; 
    } 
    if (tag[u]) {
        sum[u] += tag[u] * len; 
        tag[u << 1] += tag[u]; 
        tag[u << 1 | 1] += tag[u]; 
        tag[u] = 0; 
    } 
}