{"id":300,"date":"2010-07-11T15:15:00","date_gmt":"2010-07-11T07:15:00","guid":{"rendered":"http:\/\/localhost\/?p=300"},"modified":"2010-07-11T15:15:00","modified_gmt":"2010-07-11T07:15:00","slug":"qtree","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/wjmzbmr\/?p=300","title":{"rendered":"QTREE"},"content":{"rendered":"<p> \u7528\u4e0a\u9898\u51e0\u4e4e\u4e00\u6837\u7684\u4ee3\u7801\u65e0\u538b\u529bAC\u563b\u563b\u3002\u3002\u3002<br \/>Code\uff1a<br \/>#include &lt;vector&gt;<br \/>#include &lt;algorithm&gt;<br \/>#include &lt;cstdio&gt;<br \/>#include &lt;cmath&gt;<br \/>#include &lt;cstring&gt;<br \/>#include &lt;iostream&gt;<br \/>#define rep(i,n) for(int i=0;i&lt;n;i++)<br \/>#define tr(e,x) for(it e=x.begin();e!=x.end();e++)<br \/>#define pb push_back<br \/>const int inf=~0U&gt;&gt;1,maxn=10000;<br \/>using namespace std;<br \/>vector&lt;int&gt; E[maxn],Et[maxn];<br \/>int T[maxn*2],C[maxn*2],mnt;<br \/>typedef vector&lt;int&gt;::iterator it;<br \/>int n,w[maxn],Lim,dep[maxn],Fa[maxn],P[maxn];<br \/>int own[maxn],Max[maxn],Sum[maxn]={};<br \/>void Build(int x,int f,int d)<br \/>{<br \/>    dep[x]=d;Fa[x]=f;<br \/>    int t,c,tmp=own[x];<br \/>    tr(e,E[x])<br \/>    {<br \/>        t=T[*e],c=C[*e];<br \/>        if(t==f)continue;P[*e\/2]=t;<br \/>        w[t]=c;if(Sum[tmp]++&lt;Lim)own[t]=tmp,Et[x].pb(t);<br \/>        Build(t,x,d+1);<br \/>    }<br \/>}<br \/>void Dfs(int t,int m)<br \/>{<br \/>    Max[t]=m=max(m,w[t]);<br \/>    tr(e,Et[t])Dfs(*e,m);<br \/>}<br \/>void Change(int t,int u)<br \/>{<br \/>    w[t=P[t]]=u;<br \/>    if(t==own[t])Dfs(t,-inf);<br \/>    else Dfs(t,Max[Fa[t]]);<br \/>}<br \/>int QMax(int a,int b)<br \/>{<br \/>    int m=-inf;<br \/>    while(a!=b)<br \/>    {<br \/>        if(dep[a]&lt;dep[b])swap(a,b);<br \/>        if(own[a]==own[b])<br \/>            m=max(m,w[a]),a=Fa[a];<br \/>        else<br \/>        {<br \/>            if(dep[own[a]]&lt;dep[own[b]])swap(a,b);<br \/>            m=max(m,Max[a]),a=Fa[own[a]];<br \/>        }<br \/>    }<br \/>    return m;<br \/>}<br \/>void AddEdge(int s,int t,int c)<br \/>{<br \/>    T[mnt]=t;C[mnt]=c;<br \/>    E[s].pb(mnt);mnt++;<br \/>}<br \/>void Init()<br \/>{<br \/>    scanf(&quot; &quot;);<br \/>    scanf(&quot;%d&quot;,&amp;n);int s,t,c;<br \/>    rep(i,n)E[i].clear(),Et[i].clear();<br \/>    mnt=0;w[0]=-inf;<br \/>    rep(i,n-1)<br \/>    {<br \/>        scanf(&quot;%d%d%d&quot;,&amp;s,&amp;t,&amp;c);<br \/>        &#8211;s;&#8211;t;<br \/>        AddEdge(s,t,c);AddEdge(t,s,c);<br \/>    }<br \/>}<br \/>void Solve()<br \/>{<br \/>    Init();<br \/>    Lim=sqrt(n)+1;<br \/>    rep(i,n)own[i]=i,Sum[i]=1;<br \/>    Build(0,-1,0);rep(i,n)if(own[i]==i)Dfs(i,-inf);<br \/>    char cmd[100];int s,t;<br \/>    for(;;)<br \/>    {<br \/>        scanf(&quot; &quot;);<br \/>        scanf(&quot;%s&quot;,cmd);<br \/>        if(cmd[0]==&#8217;D&#8217;)return;<br \/>        scanf(&quot;%d%d&quot;,&amp;s,&amp;t);<br \/>        if(cmd[0]==&#8217;Q&#8217;)printf(&quot;%dn&quot;,QMax(s-1,t-1));<br \/>        else Change(s-1,t);<br \/>    }<br \/>}<br \/>int main()<br \/>{<br \/>    \/\/freopen(&quot;in&quot;,&quot;r&quot;,stdin);<br \/>    int t;scanf(&quot;%d&quot;,&amp;t);<br \/>    rep(i,t)Solve();<br \/>} <\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7528\u4e0a\u9898\u51e0\u4e4e\u4e00\u6837\u7684\u4ee3\u7801\u65e0\u538b\u529bAC\u563b\u563b\u3002\u3002\u3002Code\uff1a#include &lt;vector&gt;#include &lt;algorithm&gt;#include &lt;cstdio&gt;#include &lt;cmath&gt;#include &lt;cstring&gt;#include &lt;iostream&gt;#define rep(i,n) for(int i=0;i&lt;n;i++)#define tr(e,x) for(it e=x.begin();e!=x.end();e++)#define pb push_backconst int inf=~0U&gt;&gt;1,maxn=10000;using namespace std;vector&lt;int&gt; E[maxn],Et[maxn];int T[maxn*2],C[maxn*2],mnt;typedef vector&lt;int&gt;::iterator it;int n,w[maxn],Lim,dep[maxn],Fa[maxn],P[maxn];int own[maxn],Max[maxn],Sum[maxn]={};void Build(int x,int f,int d){ dep[x]=d;Fa[x]=f; int t,c,tmp=own[x]; tr(e,E[x]) { t=T[*e],c=C[*e]; if(t==f)continue;P[*e\/2]=t; w[t]=c;if(Sum[tmp]++&lt;Lim)own[t]=tmp,Et[x].pb(t); Build(t,x,d+1); }}void Dfs(int t,int m){ Max[t]=m=max(m,w[t]); tr(e,Et[t])Dfs(*e,m);}void Change(int t,int u){ w[t=P[t]]=u; if(t==own[t])Dfs(t,-inf); else Dfs(t,Max[Fa[t]]);}int QMax(int a,int b){ int [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/300"}],"collection":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=300"}],"version-history":[{"count":0,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/300\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}