這道題 就是 一道 普通的! 樹鏈剖分+線段樹覆蓋
注意一下兩個線段樹合併的時候 如果 lva
l(no
de
<
<1∣
1)==
rval
(nod
e<
<1)
lval(node<<1|1)==rval(node<<1)
lval(n
ode<
<1∣
1)==
rval
(nod
e<
<1)
相當於這兩個線段樹的相鄰的數字數相同的 那麼合併時的tot
tottotsu
msum
sum 應該 –
所以說這道題有什麼細節嗎 我感覺是沒有的 然而我調了一下午+晚上兩個小時 (再次感謝人帥心善的kma小哥哥) (話說為什麼他有這麼多女朋友,而我還是單身呢) 不 我有萌德
#include #include #include #include #define int long long
using namespace std;
const int maxn=1e6+10;
int read()
while(ch>='0' && ch<='9');
return x*f;
}int n,m,color[maxn],fir[maxn<<1],nxt[maxn<<1],to[maxn<<1],tot,top[maxn];
int size[maxn],son[maxn],fa[maxn],rk[maxn],id[maxn],dep[maxn],times;
char op[3];
struct nodeetree[maxn<<4];
void add(int x,int y)
void dfs1(int x)
void push_down(int node)
}void modify(int node,int ql,int qr,int z)
push_down(node);
int mid=l(node)+r(node)>>1;
if(ql<=mid) modify(node<<1,ql,qr,z);
if(mid>1;
if(ql>mid) ans+=query(node<<1|1,ql,qr);
else if (qr <= mid) ans += query(node<<1,ql,qr);
else
return ans;
}int chain_query(int x,int y){
last1 = 0, last2 = 0, lval = 0, rval = 0;
int tx=top[x],ty=top[y];
int ans=0;
while(tx!=ty){
if(dep[tx]但是注意一下 在chain_query 和 chain_modify 的時候 最後的判斷語句一定不能改方向(為什麼呢我不知道) 我好難受啊
染色 樹鏈剖分
先樹剖,然後再線段樹維護 考慮對每個節點維護 n um numnu m值 表示當前區間顏色段數量 l clc lc值 表示當前區間最左端的顏色 r crc rc值 表示當前區間最右端的顏色 合併時,如果左兒子的rc rc rc 右兒子的lclc lc,那麼合併後父節點的num numnu m值還要減...
bzoj 2243 染色 樹鏈剖分
首先這是個挺裸的題,由於太久沒寫剖分導致調了好久,前天調了一下午,一直查不到錯 昨晚在看春晚的時候突然靈機一動,發現合併的時候出了問題,開電腦把它a掉了 感覺自己也蠻拼的給定 一棵有n 個節點的 無根樹和 m個操作 操作有 2類 1 將節點a 到節點b 路徑上所 有點都染 成顏色c 2 詢問節點a ...
HYSBZ 2243 染色 樹鏈剖分
思路 單點的樹鏈剖分題目.大致的思路與邊問題的樹鏈剖分大同小異.只是在處理相鄰的顏色的計算的時候需要仔細.wa了幾發.這邊就寫一下我處理的思路以及記得起來的wa點.理解樹鏈剖分之後,你會明白,樹鏈剖分是按照路徑兩邊往中間縮.所以我用cu,cv標記兩端的顏色.當需要從u開始搜的時候,我就比對一下該端的...