bzoj4817 SDOI2017 樹點塗色

2022-05-30 21:00:15 字數 2104 閱讀 1343

bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路

徑的權值是:這條路徑上的點(包括起點和終點)共有多少種不同的顏色。bob可能會進行這幾種操作:

1 x:

把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。

2 x y:

求x到y的路徑的權值。

3 x

在以x為根的子樹中選擇乙個點,使得這個點到根節點的路徑權值最大,求最大權值。

bob一共會進行m次操作

第一行兩個數n,m。

接下來n-1行,每行兩個數a,b,表示a與b之間有一條邊。

接下來m行,表示操作,格式見題目描述

1<=n,m<=100000

每當出現2,3操作,輸出一行。

如果是2操作,輸出乙個數表示路徑的權值

如果是3操作,輸出乙個數表示權值的最大值

5 6

1 22 3

3 43 5

2 4 5

3 31 4

2 4 5

1 52 4 5

342

2

\(lct\)好題。

對於\(1\)操作,注意到每次都是從\(x\)到根的修改,而且每次顏色都不一樣,可以模擬於\(lct\)的\(access\)。

所以開一顆\(lct\),\(lct\)內每一顆\(splay\)維護一種顏色,然後改顏色直接\(access\)就好了。

考慮怎麼維護問的東西。

注意到要同時維護鏈上資訊和子樹資訊,可以考慮拿乙個\(dfs\)序建的線段樹來維護每個點到根節點路徑的權值。

然後每次\(access\)的時候,實邊變虛邊就把子樹內所有權值\(+1\),反之\(-1\)。

然後對於\(3\)操作拿線段樹記一下\(max\)就好了。

#includeusing namespace std;

void read(int &x)

void print(int x)

void write(int x)

const int maxn = 1e5+1;

int fa[maxn],son[maxn][2],dfn[maxn],sz[maxn],head[maxn],tot,dfn_cnt,r[maxn],dep[maxn],n,m,f[maxn][20];

struct edge e[maxn<<1];

void add(int u,int v) ,head[u]=tot;}

void ins(int u,int v)

#define ls p<<1

#define rs p<<1|1

#define mid ((l+r)>>1)

struct segment_tree

void push_tag(int p,int v)

void pushdown(int p)

void modify(int p,int l,int r,int x,int y,int v)

int query(int p,int l,int r,int x,int y)

void build(int p,int l,int r)

}sgt;

#undef ls

#undef rs

#undef mid

struct input_tree

int lca(int x,int y)

}t;struct link_cut_tree

int which(int x)

void rotate(int x)

void splay(int x)

} int pre(int x)

void access(int x)

son[x][1]=t;

if(t)

} }}lct;

int main() else write(sgt.query(1,1,n,dfn[x],dfn[x]+sz[x]-1));

} return 0;

}

Bzoj4817 SDOI2017 樹點塗色

bzoj 做個轉化 最開始都是虛邊 操作1 1 就是lc t role presentation lct lct裡的 acce ssa cc es s操作 求的就是路徑上虛邊的個數 1 然後就好辦了 用樹鏈剖分 線段樹來維護每個點到根虛邊的個數的最大值 操作1 1 access role prese...

BZOJ4817 Sdoi2017 樹點塗色

time limit 10 sec memory limit 128 mb submit 515 solved 302 submit status discuss bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點...

bzoj 4817 Sdoi2017 樹點塗色

bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 1 x 把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。2 x y 求x到y的路徑的權值...