SDOI2017 樹點塗色

2022-07-02 19:06:11 字數 2101 閱讀 2295

點此看題

三操作是到根的路徑哦,不要以為是到子樹根的路徑。

一定要仔細觀察題目中的修改有沒有什麼特殊性質:點 \(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為根的子樹中選擇乙個點,使得這個點到根節點的路徑的不同顏色數最大,求最大權值。可以發現修改操作的乙個性質 每種顏色的節點一定會形成一條鏈...