description
bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路
徑的權值是:這條路徑上的點(包括起點和終點)共有多少種不同的顏色。bob可能會進行這幾種操作:
1 x:
把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。
2 x y:
求x到y的路徑的權值。
3 x y:
在以x為根的子樹中選擇乙個點,使得這個點到根節點的路徑權值最大,求最大權值。
bob一共會進行m次操作
input
第一行兩個數n,m。
接下來n-1行,每行兩個數a,b,表示a與b之間有一條邊。
接下來m行,表示操作,格式見題目描述
1<=n,m<=100000
output
每當出現2,3操作,輸出一行。
如果是2操作,輸出乙個數表示路徑的權值
如果是3操作,輸出乙個數表示權值的最大值
sample input
5 6
1 2
2 3
3 4
3 5
2 4 5
3 3
1 4
2 4 5
1 5
2 4 5
sample output
3 4 2 2
time limit: 10 sec memory limit: 128 mb
題解:操作一就是簡單的lct的access操作了,所以直接用access維護。
操作二就是看要查詢的節點到根節點虛邊的個數就可以了。
操作三查詢以一節點為跟的最大值,考慮如何維護最大值。經畫圖可以發現,在access時,在以所斷的連 邊的節點為根節點的子樹+1,所連的子樹權值-1,用線段樹維護max就好了。
**:
#include#include#includeusing namespace std;
const
int max_n = 100001;
const
int inf = 1e9+7;
struct node
int is_root();
}pool[max_n],*root,*null;
inline int node::is_root()
inline void node::set_son(node *son,int wh)
struct lnode
tree[max_n*4];
int point[max_n*2],nxt[max_n*2],v[max_n*2];
int deep[max_n],rank_n[max_n],end_n[max_n],top[max_n],size[max_n],fa[max_n];
int n,m,a,b,c,x,y,tot,num;
inline node *newnode()
inline void init()
inline void update(int
now)
inline void pushdown(int
now)
}inline void addedge(int x,int y)
inline void rotate(node *now)
inline void splay(node *now)
inline void build(int
now,int l,int r)
intmid=(l+r)>>1;
build(now
<<1,l,mid);
build((now
<<1)+1,mid+1,r);
update(now);
}inline void change(int
now,int l,int r,int val)
pushdown(now);
intmid=(lr+rr)>>1;
if(l<=mid) change(now
<<1,l,r,val);
if(r>mid) change((now
<<1)+1,l,r,val);
update(now);
}inline int query_max(int
now,int l,int r)
inline int squery(int x,int y)
inline void dfs1(int
now,int f)
}inline void dfs2(int
now,int tip)
int mson=0;
for(int i=point[now]; i!=-1; i=nxt[i])
if(size[v[i]]now] && size[v[i]]>size[mson]) mson=v[i];
dfs2(mson,tip);
end_n[now]=end_n[mson];
for(int i=point[now]; i!=-1; i=nxt[i])
if(size[v[i]]now] && v[i]!=mson)
}inline int find_min(node *now)
inline node *access(node *now)
return y;
}inline int work(int x)
return ans;
}inline int read()
int main()
if(c==2)
if(c==3)
}return 0;
}
SDOI2017 樹點塗色
傳送門 塗色的操作和acc es saccess access 很像啊,如何用lct lctlc t維護這個東西呢。由於每次覆蓋的顏色都不同,且是從當前到結點覆蓋到根節點。那麼如果把顏色相同的一段維護在一條重鏈上,乙個點到根要經過多少虛邊也就包含多少顏色。所以用lct lctlc t模擬覆蓋的過程,...
SDOI2017 樹點塗色
題目鏈結 有三種操作,1.把點 x xx 到根節點的路徑上所有的點染上一種沒有用過的新顏色。2.求 x xx 到 y yy 的路徑的上的不同顏色數。3.在以x xx為根的子樹中選擇乙個點,使得這個點到根節點的路徑的不同顏色數最大,求最大權值。可以發現修改操作的乙個性質 每種顏色的節點一定會形成一條鏈...
SDOI2017 樹點塗色
bob有一棵nn個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 把點xx到根節點的路徑上所有的點染上一種沒有用過的新顏色。求xx到yy的路徑的權值。在以x為根的...