题目链接:点击查看

题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合:

  1. 在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 uuu 的祖先,且集合内的点在第一棵树上是联通的
  2. 在第二棵树上,任意两个点不能满足祖先关系

题目分析: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序+主席树-标记永久化)相关推荐

  1. 2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你两棵树,让你在第一棵树选一条最长的深度递增的链,链上每一个点在第二棵树上都不互为祖先. n≤3e5n\le3e5n≤3e5 思路: 之前做过差不多的题传送 ...

  2. 2021牛客多校7 - xay loves monotonicity(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数字序列 aaa 和 010101 序列 bbb,需要执行 mmm 次操作,每次操作分为如下三种类型: 1 x y:修改 a[x]=ya[x]= ...

  3. 【2021牛客暑期多校训练营7】xay loves trees(dfs序,维护根出发的链)

    F xay loves trees 题意: 给出两棵树,由这两棵树根据规则可以生成一个图,规则如下:如果u , v在第一棵树中满足其中一个点是另一个点祖先且最终所有所选的点都互相联通,在第二棵树中满足 ...

  4. 牛客多校2 - Cover the Tree(dfs序)

    题目链接:点击查看 题目大意:给出一棵无根树,问能否选择数量最少的链,使得所有的路径都被覆盖到 题目分析:读完题后不难看出,假设叶子结点的个数为 x,那么答案就是 x / 2 向上取整 然后说结论,d ...

  5. 2019牛客多校第九场 H Cutting Bamboos (二分主席树)

    看到题解说二分 心里也有数了..... H Cutting Bamboos 给了一些高度得柱子 每区间你可以坎y次 y次之后 必须砍没有了 没有砍 总长度得一样 问第x次砍得高度在哪里 因为砍得次数 ...

  6. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

  7. 【2021牛客多校2】F-Girlfriend 计算几何

    2021牛客多校2-F F-Girlfriend 题目大意 给出四个点 A , B , C , D A, B, C, D A,B,C,D 另有两点 P 1 , P 2 P_1, P_2 P1​,P2​ ...

  8. K-Stack 2021牛客多校2

    链接:https://ac.nowcoder.com/acm/contest/11253/K 来源:牛客网 题目描述 ZYT had a magic permutation a1,a2,⋯ ,an a ...

  9. 2021牛客多校第八场补题 D-OR

    链接:https://ac.nowcoder.com/acm/contest/11259/D 来源:牛客网 题目描述 There are two sequences of length n−1n-1n ...

最新文章

  1. Postgresql:INSERT INTO ON CONSTRAINT pk_key_id do nothing
  2. 使用clear fix清除浮动
  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)union
  4. Linux下改动Oracle数据库字符集命令
  5. winxp计算机远程桌面连接,winxp系统远程桌面不能连接指定计算机的解决方法
  6. python基础篇--从零开始(第一个程序)
  7. 使用 CleanWipe 解决Symantec Endpoint Protection卸载需要密码问题
  8. 【历史上的今天】1 月 14 日:IBM 计算机先驱诞生;Windows 7 寿终正寝;诺基亚收购阿尔卡特
  9. BP神经网络算法基本原理,bp神经网络的应用案例
  10. 房屋租赁管理系统(Java源码+论文)
  11. 银河麒麟高级服务器v10 sp1 搭建局域网yum源(同步阿里yum源centos7.9)
  12. 北斗微信与服务器怎么联接,北斗卫星的导航服务全球性升级,手机怎样“连接”使用北斗导航?...
  13. arduino: 各种Arduino基础器件的用法图
  14. php跳转到qq界面,PHP实现QQ登录的开原理和实现过程
  15. ios5.1.1旧版软件下载_爱思助手V7.98.15 版发布:新增IPA签名旧版本应用下载等新功能...
  16. 韩版机泛泰A850去除漫游时拨号选择框
  17. eureka心跳_8个Eureka优化技巧,让效率提高10倍
  18. TinyOS02:TinyOS2.1的安装(Windows平台)
  19. 最长公共子序列 LCS(模板) poj 1458
  20. 大尺寸卫星图像目标检测:yoloT

热门文章

  1. J2SE核心开发实战(一)——认识J2SE
  2. 允许多域名跨域 php,php后端控制可跨域的域名,允许图片跨域上传
  3. Nginx全局块的其他配置指令
  4. MyBatis 实际使用案例-Mapper.xml 映射配置文件【重点】
  5. 数据类型转换_自动转换
  6. Shiro与Springboot整合:配置依赖改造登录方法
  7. spring中bean的细节之三种创建Bean对象的方式
  8. Servlet_快速入门
  9. 重写Object类的equals方法
  10. 循环嵌套-[扩展]print函数的结尾处理