为啥一个LOG的树剖T了啊。。。。松鼠的新家都过了,这题T了

P3128 [USACO15DEC] Max Flow P

考虑常数优化
by 权御天下 @ 2018-08-26 20:22:15


@[lucky0218](/space/show?uid=30561) 一个log?
by shanjb0221 @ 2018-08-26 20:24:22


对啊,,把两个点搞到一个重链上,一个log啊
by lucky0218 @ 2018-08-26 20:40:34


为了巨佬看得清,我把他变好看了一点 ``` #include<bits/stdc++.h> using namespace std; const int mx=1e6+3; int son[mx],sz[mx],id[mx],tp[mx],f[mx],d[mx],n,del[mx],mson,cnt,k,maxn; vector <int> a[mx]; void dfs1(int x,int fa,int deep){ d[x]=deep,f[x]=fa,sz[x]=1,mson=-11; int l=a[x].size(); for (int i=0;i<l;i++){ int v=a[x][i]; if (v==fa) continue; dfs1(v,x,deep+1); sz[x]+=sz[v]; if (sz[v]>mson) mson=sz[v],son[x]=v; } } void dfs2(int x,int tpf){ id[x]=++cnt; tp[x]=tpf; if (!son[x]) return; dfs2(son[x],tpf); int l=a[x].size(); for (int i=0;i<l;i++){ int v=a[x][i]; if (v==f[x]||v==son[x]) continue; dfs2(v,v); } } void update(int x,int y){ while (tp[x]!=tp[y]){ if (d[tp[x]]<d[tp[y]]) swap(x,y); del[id[tp[x]]]++,del[id[x]+1]--; x=f[tp[x]]; } if (d[x]<d[y]) swap(x,y); del[id[y]]++,del[id[x]+1]--; } int main(){ cin>>n>>k; for (int i=1;i<n;i++){ int s,t; scanf("%d%d",&s,&t); a[s].push_back(t); a[t].push_back(s); } dfs1(1,0,1); dfs2(1,1); for (int i=1;i<=k;i++){ int s,t; scanf("%d%d",&s,&t); update(s,t); } for (int i=1;i<=n+1;i++){ del[i]+=del[i-1]; } for (int i=1;i<=n;i++) maxn=max(maxn,del[i]); cout<<maxn; } ```
by 御·Dragon @ 2018-08-29 09:47:42


emmm 卡常大法好 ~~(写树剖怎么能不卡常呢)~~
by yizimi远欣 @ 2018-10-31 20:32:46


|