{"id":120,"date":"2010-02-22T19:48:00","date_gmt":"2010-02-22T11:48:00","guid":{"rendered":"http:\/\/localhost\/?p=120"},"modified":"2010-02-22T19:48:00","modified_gmt":"2010-02-22T11:48:00","slug":"pku_3728_the_merchant","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/wjmzbmr\/?p=120","title":{"rendered":"PKU 3728 The merchant"},"content":{"rendered":"<p> Link\uff1a<a href=\"http:\/\/acm.pku.edu.cn\/JudgeOnline\/problem?id=3728\" target=\"_blank\">\u9898\u76ee<\/a><br \/>\u5c31\u662f\u8bf4\u4e0a\u6b21\u6211\u8bf4\u7684\u90a3\u4e2aPKU\u6708\u8d5b\u9898\u3002\u3002Tarjan\u79bb\u7ebf\u5c31\u662fNB\u554a\u3002\u3002<br \/>\u90a3\u4e2a\u4fdd\u5b582\u7684\u4e58\u65b9\u7684\u65e2\u8017\u7a7a\u95f4\uff0c\u53c8\u8017\u65f6\u95f4\u3002\u3002<br \/>\u800cTarjan\u662f\u7ebf\u6027\u7684\u3002\u3002<br \/>\u8fd9\u9053\u9898\u76ee\u5c31\u662f\u8bf4\u7ed9\u4f60\u4e00\u4e2a\u9897\u8fb9\u4e0d\u4ee3\u6743\uff0c\u70b9\u4ee3\u6743\u7684\u6811\uff0c\u6709\u4e2a\u5546\u4eba\u8981\u65c5\u884c\u3002\u6bcf\u6b21\u4ece\u4e00\u4e2a\u70b9\u5230\u53e6\u4e00\u4e2a\u70b9\uff0c\u70b9\u6743\u8868\u793a\u5546\u54c1\u7684\u4ef7\u683c\u3002\u3002\u5546\u4eba\u6700\u591a\u8fdb\u8d27\u548c\u5356\u51fa\u4e00\u6b21\uff0c\u6c42\u4ed6\u7684\u6700\u5927\u6536\u5165(\u53ef\u4ee5\u4e0d\u4ea4\u6613)\u3002\u3002<br \/>\u8fd9\u9053\u9898\u5c31\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u5e76\u67e5\u96c6\u4e2d\u9876\u70b9\u5230\u5e76\u67e5\u96c6\u4e2d\u7236\u4eb2\u7684\u8def\u5f84\u76844\u4e2a\u503c\u4e86\uff0c\u6700\u5927\u70b9\u6743\uff0c\u6700\u5c0f\u70b9\u6743\uff0c\u4ece\u5b83\u5230\u5e76\u67e5\u96c6\u4e2d\u7236\u4eb2\u4e00\u8def\u7684\u6700\u5927\u6536\u5165\uff0c\u4ece\u5e76\u67e5\u96c6\u7236\u4eb2\u5230\u5b83\u4e00\u8def\u7684\u6700\u5927\u6536\u5165\u3002\u3002<br \/>\u8fd9\u662f\u53ef\u4ee5\u5408\u5e76\u7684\u3002\u3002\u7136\u540e\u6c42\u7684\u65f6\u5019\u3002\u3002\u7ec8\u70b9\u5230lca\u7684\u4fe1\u606f\u8981\u53cd\u4e00\u4e0b\u3002\u3002<br \/>Code\uff1a<br \/><em><strong><br \/>#include&lt;cstdio&gt;<br \/>#include&lt;vector&gt;<br \/>#include&lt;algorithm&gt;<br \/>#include&lt;iostream&gt;<br \/>#define pb push_back<br \/>#define rep(i,n) for(int i=0;i&lt;n;i++)<br \/>using namespace std;<br \/>const int inf=1&lt;&lt;20;<br \/>const int maxn=50000;int n;<br \/>const int maxm=maxn;int m;<br \/>struct edge<br \/>{<br \/>    int t;<br \/>    edge(int _t):t(_t){}<br \/>};<br \/>struct queryLca<br \/>{<br \/>    bool s;<br \/>    int t,n;<br \/>    queryLca(int _t,int _n,bool _s):t(_t),n(_n),s(_s){}<br \/>};<br \/>struct query<br \/>{<br \/>    int a,b,n;<br \/>    query(int _a,int _b,int _n):a(_a),b(_b),n(_n){}<br \/>};<br \/>struct info<br \/>{<br \/>    int Min,Max,Pro,RPro;<br \/>    info(int v=0):Min(v),Max(v),Pro(0),RPro(0){}<br \/>    info R()<br \/>    {<br \/>        info ans=*this;<br \/>        swap(ans.Pro,ans.RPro);<br \/>        return ans;<br \/>    }<br \/>    void Merge(const info&amp; o)<br \/>    {<br \/>        Pro=max(Pro,o.Pro);<br \/>        Pro=max(Pro,o.Max-Min);<br \/>        RPro=max(RPro,o.RPro);<br \/>        RPro=max(RPro,Max-o.Min);<br \/>        Min=min(Min,o.Min);<br \/>        Max=max(Max,o.Max);<br \/>    }<br \/>};<br \/>vector&lt;edge&gt; E[maxn];<br \/>vector&lt;queryLca&gt; Lca[maxn];<br \/>vector&lt;query&gt; Query[maxn];<br \/>typedef vector&lt;edge&gt;::iterator eit;<br \/>typedef vector&lt;queryLca&gt;::iterator lit;<br \/>typedef vector&lt;query&gt;::iterator qit;<br \/>info Ans[maxm];<br \/>void add_edge(int s,int t)<br \/>{<br \/>    E[s].pb(edge(t));<br \/>    E[t].pb(edge(s));<br \/>}<br \/>void add_lca(int s,int t,int n)<br \/>{<br \/>    Lca[s].pb(queryLca(t,n,true));<br \/>    Lca[t].pb(queryLca(s,n,false));<br \/>}<br \/>info P[maxn];<br \/>int F[maxn];<br \/>void set()<br \/>{<br \/>    rep(i,n) F[i]=i;<br \/>}<br \/>int find(int x)<br \/>{<br \/>    int tmp=F[x];<br \/>    if(F[x]!=x)<br \/>        F[x]=find(F[x]),P[x].Merge(P[tmp]);<br \/>    return F[x];<br \/>}<br \/>void Union(int i,int j)<br \/>{<br \/>    F[j]=i;<br \/>}<br \/>bool vis[maxn]={0};<br \/>void dfs(int x)<br \/>{<br \/>    vis[x]=true;<br \/>    for(eit i=E[x].begin();i!=E[x].end();i++)if(!vis[i-&gt;t])<br \/>        dfs(i-&gt;t),Union(x,i-&gt;t);<br \/>    for(lit i=Lca[x].begin();i!=Lca[x].end();i++)<br \/>    {<br \/>        if(vis[i-&gt;t])<br \/>        {<br \/>            if(i-&gt;s)<br \/>                Query[find(i-&gt;t)].pb(query(x,i-&gt;t,i-&gt;n));<br \/>            else<br \/>                Query[find(i-&gt;t)].pb(query(i-&gt;t,x,i-&gt;n));                <br \/>        }<br \/>    }<br \/>    for(qit i=Query[x].begin();i!=Query[x].end();i++)<br \/>    {<br \/>        find(i-&gt;a);find(i-&gt;b);<br \/>        info&amp;t=Ans[i-&gt;n];<br \/>        t=P[i-&gt;a];t.Merge(P[i-&gt;b].R());<br \/>    }<br \/>}<br \/>void init()<br \/>{<br \/>    scanf(&quot;%d&quot;,&amp;n);int s,t,c;<br \/>    set();<br \/>    for(int i=0;i&lt;n;i++)<br \/>        scanf(&quot;%d&quot;,&amp;c),P[i]=info(c);<br \/>    for(int i=0;i&lt;n-1;i++)<br \/>    {<br \/>        scanf(&quot;%d %d&quot;,&amp;s,&amp;t);<br \/>        add_edge(s-1,t-1);<br \/>    }<br \/>    scanf(&quot;%d&quot;,&amp;m);int a,b;<br \/>    for(int i=0;i&lt;m;i++)<br \/>    {<br \/>        scanf(&quot;%d %d&quot;,&amp;a,&amp;b);<br \/>        add_lca(a-1,b-1,i);<br \/>    }<br \/>}<br \/>void solve()<br \/>{<br \/>    dfs(0);<br \/>    for(int i=0;i&lt;m;i++)<br \/>        printf(&quot;%dn&quot;,Ans[i].Pro);<br \/>}<br \/>int main()<br \/>{<br \/>    \/\/freopen(&quot;in&quot;,&quot;r&quot;,stdin);<br \/>    \/\/freopen(&quot;out&quot;,&quot;w&quot;,stdout);<br \/>    init();<br \/>    solve();<br \/>}<\/strong><\/em><br \/>\u672c\u9ad8\u4eae\u4ee3\u7801\u4f7f\u7528codeHl\u751f\u6210\uff0c <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Link\uff1a\u9898\u76ee\u5c31\u662f\u8bf4\u4e0a\u6b21\u6211\u8bf4\u7684\u90a3\u4e2aPKU\u6708\u8d5b\u9898\u3002\u3002Tarjan\u79bb\u7ebf\u5c31\u662fNB\u554a\u3002\u3002\u90a3\u4e2a\u4fdd\u5b582\u7684\u4e58\u65b9\u7684\u65e2\u8017\u7a7a\u95f4\uff0c\u53c8\u8017\u65f6\u95f4\u3002\u3002\u800cTarjan\u662f\u7ebf\u6027\u7684\u3002\u3002\u8fd9\u9053\u9898\u76ee\u5c31\u662f\u8bf4\u7ed9\u4f60\u4e00\u4e2a\u9897\u8fb9\u4e0d\u4ee3\u6743\uff0c\u70b9\u4ee3\u6743\u7684\u6811\uff0c\u6709\u4e2a\u5546\u4eba\u8981\u65c5\u884c\u3002\u6bcf\u6b21\u4ece\u4e00\u4e2a\u70b9\u5230\u53e6\u4e00\u4e2a\u70b9\uff0c\u70b9\u6743\u8868\u793a\u5546\u54c1\u7684\u4ef7\u683c\u3002\u3002\u5546\u4eba\u6700\u591a\u8fdb\u8d27\u548c\u5356\u51fa\u4e00\u6b21\uff0c\u6c42\u4ed6\u7684\u6700\u5927\u6536\u5165(\u53ef\u4ee5\u4e0d\u4ea4\u6613)\u3002\u3002\u8fd9\u9053\u9898\u5c31\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u5e76\u67e5\u96c6\u4e2d\u9876\u70b9\u5230\u5e76\u67e5\u96c6\u4e2d\u7236\u4eb2\u7684\u8def\u5f84\u76844\u4e2a\u503c\u4e86\uff0c\u6700\u5927\u70b9\u6743\uff0c\u6700\u5c0f\u70b9\u6743\uff0c\u4ece\u5b83\u5230\u5e76\u67e5\u96c6\u4e2d\u7236\u4eb2\u4e00\u8def\u7684\u6700\u5927\u6536\u5165\uff0c\u4ece\u5e76\u67e5\u96c6\u7236\u4eb2\u5230\u5b83\u4e00\u8def\u7684\u6700\u5927\u6536\u5165\u3002\u3002\u8fd9\u662f\u53ef\u4ee5\u5408\u5e76\u7684\u3002\u3002\u7136\u540e\u6c42\u7684\u65f6\u5019\u3002\u3002\u7ec8\u70b9\u5230lca\u7684\u4fe1\u606f\u8981\u53cd\u4e00\u4e0b\u3002\u3002Code\uff1a#include&lt;cstdio&gt;#include&lt;vector&gt;#include&lt;algorithm&gt;#include&lt;iostream&gt;#define pb push_back#define rep(i,n) for(int i=0;i&lt;n;i++)using namespace std;const int inf=1&lt;&lt;20;const int maxn=50000;int n;const int maxm=maxn;int m;struct edge{ int t; edge(int _t):t(_t){}};struct queryLca{ bool s; int t,n; queryLca(int _t,int _n,bool _s):t(_t),n(_n),s(_s){}};struct query{ int a,b,n; query(int _a,int _b,int _n):a(_a),b(_b),n(_n){}};struct info{ int Min,Max,Pro,RPro; info(int v=0):Min(v),Max(v),Pro(0),RPro(0){} info R() { info ans=*this; swap(ans.Pro,ans.RPro); return ans; } void Merge(const info&amp; o) [&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\/120"}],"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=120"}],"version-history":[{"count":0,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/120\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}