題意:一棵樹,初始時每個節點有乙個顏色。兩種操作:(1)將某條路經上的點的顏色統一修改為某個值;(2)統計某條路徑上顏色有多少段?比如11221算3段。
思路:splay節點記錄區間的左右兩側的顏色lr,該節點的顏色val以及總的段數以及標記。向上合併時根據左孩子右孩子的lr以及當前節點的val計算當前子樹的段數。修改時,[x,y],先access(x)使得x與lca在一起。然後從y向上,直到找到lca,y和lca的右子樹標記修改,lca直接修改。這裡要注意,lca的右子樹和y要判斷是不是為nullnode,在這裡wa兩個小時。。。統計答案時與修改類似。
struct node
};node a[n],*nullnode;
void pushup(node *p)
if(p->c[1]!=nullnode)
}void pushdown(node *p)
}int isroot(node *p)
node *zig(node *x)
pushup(p);
pushup(x);
}node *zag(node *x)
pushup(p);
pushup(x);
}void splay(node *x)
else
}else
}}node *access(node *x)
return p;
}int cal(int x,int y)
else
return ans;
}void color(int x,int y,int val)
else
pushup(lca);
}vectorg[n];
int n,m,c[n];
void build()
}}void init()
build();
}int main()
else
}}
bzoj 2243 染色 樹鏈剖分
首先這是個挺裸的題,由於太久沒寫剖分導致調了好久,前天調了一下午,一直查不到錯 昨晚在看春晚的時候突然靈機一動,發現合併的時候出了問題,開電腦把它a掉了 感覺自己也蠻拼的給定 一棵有n 個節點的 無根樹和 m個操作 操作有 2類 1 將節點a 到節點b 路徑上所 有點都染 成顏色c 2 詢問節點a ...
bzoj 2243 樹鏈剖分 染色
time limit 20 sec memory limit 512 mb submit 3205 solved 1238 submit status discuss 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段...
bzoj2243 樹鏈剖分 染色
description 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 請你寫乙個程式依次完成這m個操作。input 第一行包含2...