2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)
生活随笔
收集整理的這篇文章主要介紹了
2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出兩棵以點 111 為根節點的有根樹,現在要求滿足條件的最大集合:
題目分析:CodeForces - 1529E 的加強版,題面僅僅增加了在第一棵樹中的點需要保證聯通這一個條件
寫在前面,明明都發題解了,還瘋狂交滑動窗口的 ** ,浪費評測機資源了屬于是
官方題解:
需要注意的是,不要忘記維護 last_deplast\_deplast_dep 表示到達點 uuu 為止的最深的可以滿足條件的深度。因為僅憑 [L[u],R[u]][L[u],R[u]][L[u],R[u]] 內的最大值不能正確實現題解中的 huh_uhu?(對應題解第二段第一句)
當然本題用線段樹也是可以寫的,只不過用主席樹可以避免線段樹的刪除,也就是避免了回溯操作。所以對應主席樹就是區間更新和區間查詢了,不難想到用標記永久化來降低代碼復雜度
代碼:
// Problem: xay loves trees // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/11258/F // Memory Limit: 1048576 MB // Time Limit: 4000 ms // // Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #define lowbit(x) x&-x using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=3e5+100; struct Node {int l,r,mmax,lazy; }tree[N*4*20]; vector<int>a[N],b[N]; int dfn,L[N],R[N],cnt,root[N],n,ans; int newnode(int k) {cnt++;tree[cnt]=tree[k];return cnt; } void update(int &k,int l,int r,int L,int R,int deep) {//[l,r]:目標區間 [L,R]:當前區間k=newnode(k);tree[k].mmax=deep;if(L>=l&&R<=r) {tree[k].lazy=deep;return;}int mid=(L+R)>>1;if(r<=mid) {update(tree[k].l,l,r,L,mid,deep);} else if(l>mid) {update(tree[k].r,l,r,mid+1,R,deep);} else {update(tree[k].l,l,mid,L,mid,deep);update(tree[k].r,mid+1,r,mid+1,R,deep);} } int query(int k,int l,int r,int L,int R,int max_dep) {//[l,r]:目標區間 [L,R]:當前區間if(R<l||L>r||!k) {return max_dep;}max_dep=max(max_dep,tree[k].lazy);if(L>=l&&R<=r) {return max(tree[k].mmax,max_dep);}int mid=(L+R)>>1;return max(query(tree[k].l,l,r,L,mid,max_dep),query(tree[k].r,l,r,mid+1,R,max_dep)); } void dfs(int u,int fa,int dep,int last_dep) {int cur_dep=max(last_dep,query(root[fa],L[u],R[u],1,n,0));ans=max(ans,dep-cur_dep);root[u]=root[fa];update(root[u],L[u],R[u],1,n,dep);for(auto v:a[u]) {if(v==fa) {continue;}dfs(v,u,dep+1,cur_dep);} } void dfs_dfn(int u,int fa) {L[u]=++dfn;for(auto v:b[u]) {if(v==fa) {continue;}dfs_dfn(v,u);}R[u]=dfn; } int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--) {dfn=ans=cnt=0;read(n);for(int i=1;i<=n;i++) {a[i].clear(),b[i].clear();}for(int i=1;i<n;i++) {int u,v;read(u),read(v);a[u].push_back(v);a[v].push_back(u);}for(int i=1;i<n;i++) {int u,v;read(u),read(v);b[u].push_back(v);b[v].push_back(u);}dfs_dfn(1,0);dfs(1,0,1,0);cout<<ans<<endl;}return 0; }總結
以上是生活随笔為你收集整理的2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021HDU多校6 - 7028 De
- 下一篇: 洛谷 - P3321 [SDOI2015