ZJOI2008 樹的統計Count

2021-08-26 11:00:26 字數 1229 閱讀 6046

題目大意:

給出一棵樹,點上有點權

有兩種詢問,詢問兩點之間樹鏈上的點權和,詢問兩點之間樹鏈上最大點權

點數<=30000,詢問樹<=200000

最裸的動態樹,操作少,維護的值簡單

//lib #include#include#include#include#include#include#include#include#include#includeusing namespace std; //macro #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i) #define rrep(i,a,b) for(int i=a,tt=b;i>=tt;--i) #define erep(i,e,x) for(int i=x;i;i=e[i].next) #define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++) #define read() (strtol(ipos,&ipos,10)) #define sqr(x) ((x)*(x)) #define pb push_back #define ps system("pause"); typedef long long ll; typedef pairpii; const int oo=100000000; const double inf=1e20; const double eps=1e-6; string name="",in=".in",out=".out"; //var struct e e[60008]; struct t tree[30008]; int tot,n,q,w[30008],h[30008]; bool vis[30008]; inline void add(int a,int b) inline bool isroot(int x) void update(int x)

inline void zig(int x)
inline void zag(int x)void splay(int x)update(x);}void dfs(int u,int f)void init()rep(i,1,n)scanf("%d",w+i);key(0)=max(0)=-oo;dfs(1,0);}inline void expose(int x)}inline void change(int x,int y)inline int qmax(int x,int y)}inline int qsum(int x,int y)}void work()}}int main()

ZJOI 2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...

ZJOI2008 樹的統計

zjoi2008 樹的統計 題目描述 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到...

ZJOI2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...