點此看題
三操作是到根的路徑哦,不要以為是到子樹根的路徑。
一定要仔細觀察題目中的修改有沒有什麼特殊性質:點 \(x\)到根節點的路徑上所有的點染上一種沒有用過的新顏色
我感到了一種神秘的熟悉感,這個東西不是 \(\tt lct\) 的那個 \(\tt access\) 操作嗎?也就是我們把虛邊看成連邊的兩個點之間顏色不同,實邊看成顏色相同,那麼乙個點到根的路徑權值就是虛邊數量\(+1\)
所以我們在 \(\tt access\) 的時候要考慮虛實邊變化帶來的權值影響,其實每次就是修改乙個子樹的權值,有 \(dfn\) 序加線段樹維護即可。具體的寫法中我們要尋找這條邊在原樹上代表的邊對應的點,直接一直往左兒子下邊找即可。
\(\tt lct\) 中乙個點轉到根後,它的祖先要麼在拉上去的虛邊上面,要麼在自己左兒子方向。注意 \(\tt lct\) 上的邊並不是原樹的結構(虛邊指向指向該 \(splay\) 中中序遍歷最靠前的點在原樹中的父親),但是深度關係往往能幫上忙。這一部分可以看一下魔改之後的 \(\tt access\) **:
void access(int x)
if(y)//這個點又要變實了
ch[x][1]=y;
}}
但是有人說直接找左兒子好像時間複雜度是錯的,但是由於我不會 \(\tt lct\) 的時間複雜度分析所以我也不知道,據說更好的寫法是 \(\tt splay\) 裡面就維護深度最小的點。現在看第乙個詢問操作,其實問的就是 \((x,y)\) 路徑之間的虛邊數量,直接差分就可以了,設 \(dis[i]\) 等於虛邊數量加\(1\),一開始的值就是深度,那麼答案是 \(dis[x]+dis[y]-2\cdot dis[lca]+1\),第二個詢問操作就是子樹內最大值,沒什麼好說的。
時間複雜度 \(o(n\log^2 n)\)
#include #include using namespace std;
const int m = 100005;
int read()
while(c>='0' && c<='9')
return x*f;
}int n,m,tot,f[m],ch[m][2],par[m],fa[m][20];
int ind,dep[m],dfn[m],dfo[m],mx[4*m],tag[4*m];
struct edge
}e[2*m];
//預處理部分
void dfs(int u,int p)
dfo[u]=ind;
}int lca(int u,int v)
//線段樹部分
void down(int i)
void upd(int i,int l,int r,int l,int r,int f)
int mid=(l+r)>>1;
down(i);
upd(i<<1,l,mid,l,r,f);
upd(i<<1|1,mid+1,r,l,r,f);
mx[i]=max(mx[i<<1],mx[i<<1|1]);
}int ask(int i,int l,int r,int l,int r)
//lct部分
int nrt(int x)
int chk(int x)
void rotate(int x)
void splay(int x)
rotate(x); }}
int find(int x)//找到最左兒子
void access(int x)
if(y)
ch[x][1]=y; }}
signed main()
dfs(1,0);
for(int i=1;i<=n;i++)
upd(1,1,n,dfn[i],dfn[i],dep[i]);//初始化
while(m--)
if(op==3)
printf("%d\n",ask(1,1,n,dfn[x],dfo[x]));
}}
SDOI2017 樹點塗色
description bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 1 x 把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。2 x ...
SDOI2017 樹點塗色
傳送門 塗色的操作和acc es saccess access 很像啊,如何用lct lctlc t維護這個東西呢。由於每次覆蓋的顏色都不同,且是從當前到結點覆蓋到根節點。那麼如果把顏色相同的一段維護在一條重鏈上,乙個點到根要經過多少虛邊也就包含多少顏色。所以用lct lctlc t模擬覆蓋的過程,...
SDOI2017 樹點塗色
題目鏈結 有三種操作,1.把點 x xx 到根節點的路徑上所有的點染上一種沒有用過的新顏色。2.求 x xx 到 y yy 的路徑的上的不同顏色數。3.在以x xx為根的子樹中選擇乙個點,使得這個點到根節點的路徑的不同顏色數最大,求最大權值。可以發現修改操作的乙個性質 每種顏色的節點一定會形成一條鏈...