bob 有一棵 n 個點的有根樹,其中 1 號點是根節點。bob 在每個點上塗了顏色,並且每個點上的顏色不同。
定義一條路徑的權值是:這條路徑上的點(包括起點和終點)共有多少種不同的顏色。
bob可能會進行這幾種操作:
bob一共會進行 m 次操作
第一行兩個數 n,m。
接下來 n−1 行,每行兩個數 a,b 表示 a 與 b 之間有一條邊。
接下來 m 行,表示操作,格式見題目描述
每當出現 2,3 操作,輸出一行。
如果是 2 操作,輸出乙個數表示路徑的權值
如果是 3 操作,輸出乙個數表示權值的最大值
輸入 #1
5 6
1 22 3
3 43 5
2 4 5
3 31 4
2 4 5
1 52 4 5
輸出 #1
342
2
\(n , m <= 1e5\)
分析
將相同顏色的點看做乙個splay , 那麼操作1就是標準的access
對於操作二三維護,乙個點到根的顏色個數,也是splay的個數。
這個可以用線段樹維護
在assess操作時,將要並上去的的子樹-- , 斷開的子樹++
1.別忘了初始化,初始時各個節點顏色互不相同,也就是ans = d(到根的距離)
2.rot時分清誰和誰, 我腦殘寫了 fa[x] = y , fa[y] = x
#include#includeusing namespace std;
const int n = 210000;
inline int read()
int n , m , dfn , cnt;
int head[n] , st[n] , ed[n] , d[n] , fdfn[n] , f[n][20] , siz[n] , fa[n] , tr[n][2] , rev[n] , maxn[n<<2] , tag[n<<2];
struct edge e[n<<1];
inline void add(int u , int v)
#define d_bag puts("this is ok!!");
// segment_tree->begin()
void down(int k)
return ;
}void build(int k , int l , int r) // 建樹初始化
int mid = (l + r) >> 1;
build(k << 1 , l , mid);
build(k << 1 | 1 , mid + 1 , r);
maxn[k] = max(maxn[k<<1] , maxn[k<<1|1]);
return ;
}void change(int k , int l , int r , int x , int y , int val)
int ask(int k , int l , int r , int x , int y)
// segment_tree->end()
inline int witch(int x)
inline int nrt(int x)
void rot(int x)
void splay(int x)
return ;
}int find_son(int x)
void assess(int x)
if(tr[x][1])
tr[x][1] = t;
} return ;
}int lca(int x , int y)
void dfs(int x)
ed[x] = dfn;
return ;
}int main()
d[1] = 1; dfs(1);
build(1 , 1 , n);
for(int i = 1 , op , x ; i <= m ; ++i)
else
if(op == 3)
printf("%d\n" , ask(1 , 1 , n , st[x] , ed[x]));
} return 0;}/*
5 61 2
2 33 4
3 52 4 5
3 31 4
2 4 5
1 52 4 5
*/
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在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點...
bzoj4817 SDOI2017 樹點塗色
bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 1 x 把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。2 x y 求x到y的路徑的權值...