{"id":353,"date":"2020-04-21T21:46:58","date_gmt":"2020-04-21T13:46:58","guid":{"rendered":"http:\/\/nocriz.com\/?p=353"},"modified":"2021-09-08T20:20:07","modified_gmt":"2021-09-08T12:20:07","slug":"%e3%80%90noi2018%e3%80%91%e6%83%85%e6%8a%a5%e4%b8%ad%e5%bf%83","status":"publish","type":"post","link":"https:\/\/nocriz.com\/?p=353","title":{"rendered":"\u3010NOI2018\u3011\u60c5\u62a5\u4e2d\u5fc3"},"content":{"rendered":"\n<p>\u6316\u4e00\u4e2a\u5751\uff0c\u5f85\u8865\u9898\u89e3\u3002\u4e0b\u9644\u4ee3\u7801\u3002<\/p>\n\n\n\n<!--more-->\n\n\n\n<pre class=\"wp-block-code\"><code>#pragma comment(linker, \"\/stack:200000000\")\n#pragma GCC optimize(\"Ofast,no-stack-protector\")\n#pragma GCC target(\"sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native\")\n#pragma GCC optimize(\"unroll-loops\")\n#include &lt;bits\/stdc++.h>\n\n\nusing namespace std;\n#define int ll\ntypedef long long ll;\n#define set0(x) memset(x,0,sizeof(x))\n#define F first\n#define S second\n#define PB push_back\n#define MP make_pair\n#define rep(i, a, b) for(int i = a; i &lt; (b); ++i)\n#define trav(a, x) for(auto&amp; a : x)\n#define all(x) x.begin(), x.end()\n#define sz(x) (int)(x).size()\n\nll chkmax(ll &amp;a,ll b){return a = a>b?a:b;}\ntypedef long long ll;\ntypedef pair&lt;int,int> pii;\ntypedef pair&lt;ll,ll> pll;\ntypedef vector&lt;int> VI;\ntemplate&lt;typename T> void read(T &amp;x){\n\tx = 0;char ch = getchar();ll f = 1;\n\twhile(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}\n\twhile(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;\n}\ntemplate&lt;typename T, typename... Args> void read(T &amp;first, Args&amp; ... args) {\n\tread(first);\n\tread(args...);\n}\n\nconst int N = 100010;\nint n,m,k,s&#91;N],t&#91;N],co&#91;N],lc&#91;N],u&#91;N],v&#91;N],w&#91;N];\nvector&lt;int> G&#91;N],G2&#91;N],T&#91;N];\nstruct work{\n\tint depth;\n\tll ca,cb;\n};\nvector&lt;work> E&#91;N];\nmap&lt;pii,int> dis;\n\nll d1&#91;N];\nint d&#91;N];\nint fa&#91;N]&#91;19],dfn&#91;N],sz&#91;N],hom&#91;N],seq&#91;N],tim = 0,tim2 = 0;\n\nnamespace rmq {\n\tconst int MAXN = 1e5 + 5;\n\tconst int MAXLOG = 18;\n\tint mi&#91;MAXN]&#91;MAXLOG], lg&#91;MAXN];\n\t#define cmp(x,y) ((d&#91;x] &lt; d&#91;y]) ? x : y)\n\tinline int qmin(int l, int r) {\n\t\tif(l>r)swap(l,r);\n\t\tint tmp = lg&#91;r - l + 1];\n\t\treturn cmp(mi&#91;l]&#91;tmp], mi&#91;r - (1 &lt;&lt; tmp) + 1]&#91;tmp]);\n\t}\n\tvoid init(int *a, int n) {\n\t\tfor (int i = 1; i &lt;= n; i++) {\n\t\t\tmi&#91;i]&#91;0] = a&#91;i];\n\t\t\tlg&#91;i] = lg&#91;i - 1] + ((1 &lt;&lt; (lg&#91;i-1] + 1)) &lt;= i);\n\t\t}\n\t\tfor (int t = 1; t &lt; MAXLOG; t++)\n\t\tfor (int i = 1, j = (1 &lt;&lt; (t - 1)) + 1; j &lt;= n; i++, j++)\n\t\t\tmi&#91;i]&#91;t] = cmp(mi&#91;i]&#91;t - 1], mi&#91;j]&#91;t - 1]);\n\t}\n}\n\nvoid dfs0(int num,int cf = 0){\n\tdfn&#91;num] = ++tim;\n\thom&#91;num] = ++tim2;seq&#91;tim2] = num;\n\tsz&#91;num] = 1;\n\tfor(auto ct:G&#91;num]){\n\t\tif(ct==cf)continue;\n\t\td1&#91;ct] = d1&#91;num]+dis&#91;MP(num,ct)];\n\t\td&#91;ct] = d&#91;num]+1;\n\t\tdfs0(ct,num);\n\t\tseq&#91;++tim2] = num;\n\t\tsz&#91;num]+=sz&#91;ct];\n\t}\n}\n\ninline int lca(int u,int v){\n\treturn rmq::qmin(hom&#91;u],hom&#91;v]);\n}\ninline ll dist(int u,int v){\n\treturn d1&#91;u]+d1&#91;v]-2*d1&#91;lca(u,v)];\n}\nvector&lt;pii> F&#91;N];\n\nstruct node{\n\tint ls,rs;\n\tll ma,mb;\n}nds&#91;10000010];\nint cnt = 0,rts&#91;N];\n\n#define mid ((cl+cr)\/2)\nint newnode(){\n\t++cnt;\n\tnds&#91;cnt].ls = nds&#91;cnt].rs = 0;\n\tnds&#91;cnt].ma = nds&#91;cnt].mb = -1e18;\n\treturn cnt;\n}\nvoid mrg(int id){\n\tchkmax(nds&#91;id].ma,max(nds&#91;nds&#91;id].ls].ma,nds&#91;nds&#91;id].rs].ma));\n\tchkmax(nds&#91;id].mb,max(nds&#91;nds&#91;id].ls].mb,nds&#91;nds&#91;id].rs].mb));\n}\nvoid destroy(int &amp;id,int x,int cl = 0,int cr = n){\n\tif(!id)return;\n\tif(cl == cr){\n\t\tnds&#91;id].ma = nds&#91;id].mb = -1e18;\n\t\treturn;\n\t}\n\tif(x&lt;=mid)destroy(nds&#91;id].ls,x,cl,mid);\n\telse destroy(nds&#91;id].rs,x,mid+1,cr);\n\tnds&#91;id].ma = max(nds&#91;nds&#91;id].ls].ma,nds&#91;nds&#91;id].rs].ma);\n\tnds&#91;id].mb = max(nds&#91;nds&#91;id].ls].mb,nds&#91;nds&#91;id].rs].mb);\n}\nvoid add(int &amp;id,int x,ll va,ll vb,ll &amp;cval,int cl = 0,int cr = n){\n\tif(!id)id = newnode();\n\tchkmax(nds&#91;id].ma,va);\n\tchkmax(nds&#91;id].mb,vb);\n\tif(cl == cr)return;\n\tif(x&lt;=mid){\n\t\tadd(nds&#91;id].ls,x,va,vb,cval,cl,mid);\n\t\tchkmax(cval,va+nds&#91;nds&#91;id].rs].mb);\n\t}else{\n\t\tadd(nds&#91;id].rs,x,va,vb,cval,mid+1,cr);\n\t\tchkmax(cval,vb+nds&#91;nds&#91;id].ls].ma);\n\t}\n}\nint merge(int a,int b,ll &amp;cval){\n\tif(!a || !b)return a|b;\n\tchkmax(cval,nds&#91;nds&#91;a].ls].ma+nds&#91;nds&#91;b].rs].mb);\n\tchkmax(cval,nds&#91;nds&#91;b].ls].ma+nds&#91;nds&#91;a].rs].mb);\n\tchkmax(nds&#91;a].ma,nds&#91;b].ma);chkmax(nds&#91;a].mb,nds&#91;b].mb);\n\tnds&#91;a].ls = merge(nds&#91;a].ls,nds&#91;b].ls,cval);\n\tnds&#91;a].rs = merge(nds&#91;a].rs,nds&#91;b].rs,cval);\n\treturn a;\n}\nll ans = -1e18;\nint crt = 0;\nvoid dfs(int num,int f = 0){\n\tll cval = -1e18;\n\tfor(auto ct:E&#91;num]){\n\t\tadd(rts&#91;num],ct.depth,ct.ca,ct.cb,cval);\n\t}\n\tfor(auto ct:G&#91;num]){\n\t\tif(ct == f)continue;\n\t\tdfs(ct,num);\n\t\tmerge(rts&#91;num],rts&#91;ct],cval);\n\t}\n\tans = max(ans,cval-d1&#91;num]);\n\tdestroy(rts&#91;num],d&#91;num]-1);\n}\n\nstruct Mp{\n\tint po = -1;\n\tll coef = -1e18;\n\tMp(){}\n\tMp(int a,ll b):po(a),coef(b){}\n};\nstruct Pp{\n\tMp A,B;\n\tPp(){}\n\tPp(Mp A,Mp B):A(A),B(B){}\n\tll dis(){\n\t\tif(A.po == -1 || B.po == -1){\n\t\t\treturn A.coef+B.coef;\n\t\t}\n\t\treturn dist(A.po,B.po)+A.coef+B.coef;\n\t}\n};\nPp dfs1(int num){\n\tPp ret,nret;\n\tauto chk = &#91;&amp;](Pp a){\n\t\tif(a.dis()>nret.dis())nret = a;\n\t};\n\tfor(auto ct:T&#91;num]){\n\t\tint nt = num^s&#91;ct]^t&#91;ct];\n\t\tll coef = dist(num,nt)-2*co&#91;ct]+d1&#91;num];\n\t\tchk(Pp(ret.A,Mp(nt,coef)));\n\t\tchk(Pp(ret.B,Mp(nt,coef)));\n\t\tret = nret;\n\t}\n\tif(num!=crt)ans = max(ans,nret.dis()\/2-d1&#91;num]);\n\tfor(auto ech:G2&#91;num]){\n\t\tPp ct = dfs1(ech);\n\t\tnret = Pp();\n\t\tchk(Pp(ret.A,ct.A));\n\t\tchk(Pp(ret.A,ct.B));\n\t\tchk(Pp(ret.B,ct.A));\n\t\tchk(Pp(ret.B,ct.B));\n\t\tif(num!=crt)ans = max(ans,nret.dis()\/2-d1&#91;num]);\n\t\tchk(ret);\n\t\tchk(ct);\n\t\tret = nret;\n\t}\n\treturn ret;\n}\n\nvoid solve(){\n\tread(n);\n\tfor(int i=1;i&lt;n;i++){\n\t\tread(u&#91;i],v&#91;i],w&#91;i]);\n\t\tG&#91;u&#91;i]].PB(v&#91;i]);\n\t\tG&#91;v&#91;i]].PB(u&#91;i]);\n\t\tdis&#91;MP(u&#91;i],v&#91;i])] = w&#91;i];\n\t\tdis&#91;MP(v&#91;i],u&#91;i])] = w&#91;i];\n\t}\n\td&#91;1] = 1;\n\tdfs0(1);\n\trmq::init(seq,tim2);\n\tread(m);\n\tfor(int i=0;i&lt;m;i++){\n\t\tread(s&#91;i],t&#91;i],co&#91;i]);\n\t\tlc&#91;i] = lca(s&#91;i],t&#91;i]);\n\t\tll da = dist(s&#91;i],t&#91;i])-co&#91;i],db = da+d1&#91;lc&#91;i]];\n\t\tif(s&#91;i]!=lc&#91;i])E&#91;s&#91;i]].push_back({d&#91;lc&#91;i]],da,db});\n\t\tif(t&#91;i]!=lc&#91;i])E&#91;t&#91;i]].push_back({d&#91;lc&#91;i]],da,db});\n\t\tF&#91;lc&#91;i]].emplace_back(s&#91;i],i);\n\t\tF&#91;lc&#91;i]].emplace_back(t&#91;i],i);\n\t}\n\tfor(int i=1;i&lt;=n;i++)rts&#91;i] = newnode();\n\tdfs(1);\n\tauto cmp = &#91;&amp;](int a,int b)->bool{return dfn&#91;a]&lt;dfn&#91;b];};\n\t\n\tfor(int i=1;i&lt;=n;i++){\n\t\tcrt = i;\n\t\tvector&lt;int> cu,scope;\n\t\tscope.PB(i);\n\t\tfor(auto ct:F&#91;i]){\n\t\t\tcu.PB(ct.F);\n\t\t\tT&#91;ct.F].PB(ct.S);\n\t\t}\n\t\tsort(all(cu),cmp);\n\t\tcu.erase(unique(all(cu)),cu.end());\n\t\tvector&lt;int> stk;\n\t\tstk.PB(i);\n\t\trts&#91;i] = newnode();\n\t\tauto pb = &#91;&amp;](int a){\n\t\t\trts&#91;a] = newnode();\n\t\t\tscope.PB(a);\n\t\t\tstk.PB(a);\n\t\t};\n\t\tfor(auto ct:cu){\n\t\t\tint dd = lca(ct,stk.back());\n\t\t\twhile(d&#91;stk.back()]>d&#91;dd]){\n\t\t\t\tif(d&#91;stk&#91;stk.size()-2]]>d&#91;dd]) G2&#91;stk&#91;stk.size()-2]].PB(stk.back());\n\t\t\t\telse G2&#91;dd].PB(stk.back());\n\t\t\t\tstk.pop_back();\n\t\t\t}\n\t\t\tif(d&#91;stk.back()]&lt;d&#91;dd]) pb(dd);\n\t\t\tif(d&#91;stk.back()]&lt;d&#91;ct]) pb(ct);\n\t\t}\n\t\twhile(stk.size()>=2){\n\t\t\tG2&#91;stk&#91;stk.size()-2]].PB(stk.back());\n\t\t\tstk.pop_back();\n\t\t}\n\t\tdfs1(i);\n\t\tfor(auto ct:scope){\n\t\t\tG2&#91;ct].clear();\n\t\t\trts&#91;ct] = 0;\n\t\t\tT&#91;ct].clear();\n\t\t}\n\t}\n}\n\nvoid clear(){\n\tif(ans&lt;-1e16) cout&lt;&lt;\"F\\n\";\n\telse cout&lt;&lt;ans&lt;&lt;\"\\n\";\n\tfor(int i=1;i&lt;=n;i++){\n\t\tE&#91;i].clear();\n\t\tF&#91;i].clear();\n\t\tG&#91;i].clear();\n\t}\n\tcnt = 0;\n\tdis.clear();\n\ttim = tim2 = 0;\n\tans = -1e18;\n}\nsigned main() {\n\tnds&#91;0].ma = nds&#91;0].mb = -1e18;\n\tint testcases;\n\tread(testcases);\n\twhile(testcases--){\n\t\tsolve();\n\t\tclear();\n\t}\n\treturn 0;\n}\n<\/code><\/pre>\n ","protected":false},"excerpt":{"rendered":"<p>\u6316\u4e00\u4e2a\u5751\uff0c\u5f85\u8865\u9898\u89e3\u3002\u4e0b\u9644\u4ee3\u7801\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/nocriz.com\/index.php?rest_route=\/wp\/v2\/posts\/353"}],"collection":[{"href":"https:\/\/nocriz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nocriz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nocriz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nocriz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=353"}],"version-history":[{"count":1,"href":"https:\/\/nocriz.com\/index.php?rest_route=\/wp\/v2\/posts\/353\/revisions"}],"predecessor-version":[{"id":354,"href":"https:\/\/nocriz.com\/index.php?rest_route=\/wp\/v2\/posts\/353\/revisions\/354"}],"wp:attachment":[{"href":"https:\/\/nocriz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nocriz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nocriz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}