https://www.luogu.org/problemnew/show/P3398

题意:一颗$n$个点的树,$q$次询问两条链$(a,b),(c,d)$是否有交


树剖裸题orz

一开始的想法是求出$lca_1=lca(a,b),lca_2=lca(c,d)$,对于深度大的那个$lca$用dfs序判断是否在另一条链上,然后到现在都不知道为什么一直wa…

改成判断深度大的那个$lca$是否和另外两个点的其中某个点有父子关系好像就行了…

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
inline int read()
{
int s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return s*f;
}
struct edge
{
int to,nxt;
}edges[N<<1];
int n,q,tot,cnt;
int head[N<<1],size[N],son[N],dep[N],top[N],fa[N],tim[N]; inline void addEdge(int u,int v)
{
edges[++cnt]=(edge){v,head[u]};
head[u]=cnt;
} #define cur edges[i].to inline void dfs1(int x)
{
size[x]=1;
for(register int i=head[x];i;i=edges[i].nxt)
if(cur!=fa[x])
{
fa[cur]=x;dep[cur]=dep[x]+1;
dfs1(cur);size[x]+=size[cur];
if(size[son[x]]<size[cur])son[x]=cur;
}
} inline void dfs2(int x,int t)
{
top[x]=t;tim[x]=++tot;
if(son[x])dfs2(son[x],t);
for(register int i=head[x];i;i=edges[i].nxt)
if(cur!=son[x]&&cur!=fa[x])dfs2(cur,cur);
} #undef cur inline int lca(int a,int b)
{
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
return a;
} int main()
{
n=read();q=read();
for(register int i=1;i<n;i++)
{
int u,v;u=read();v=read();
addEdge(u,v);addEdge(v,u);
}
dfs1(1);dfs2(1,1); for(register int i=1;i<=q;i++)
{
int a,b,c,d,lca1,lca2,res;
a=read();b=read();c=read();d=read();
lca1=lca(a,b);lca2=lca(c,d);
if(dep[lca1]<dep[lca2])
{
swap(lca1,lca2);
swap(a,c);
swap(b,d);
}
if(lca(lca1,c)==lca1||lca(lca1,d)==lca1)res=1;
else res=0; if(res)printf("Y\n");
else printf("N\n");
}
return 0;
}

如果有人知道一开始的方法为什么错了请务必告诉我orz

最新文章

  1. No operation was found with the name {http://impl.service.xq.com/}sayHi
  2. Linux下搭建nginx php环境
  3. sina发现并不会去导入qq使用的
  4. nodeAPI--TCP
  5. centos python 2.7 安装
  6. linux find 反转 查找没有被找到的结果
  7. decorview that was originally added here or java.lang.IllegalArgumentException: View not attached to window manager
  8. mac下apache启动关闭操作
  9. 【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象
  10. spring集成quartz
  11. 基于Centos6.6的R720服务器四网口端口聚合的实践
  12. C语言之算法初步(汉诺塔--递归算法)
  13. HashMap 之弱引用 - WeakHashMap
  14. 搭建正则开源工具Regexper
  15. 10 python 初学(Python 的编码解码)
  16. Django--CRM--一级, 二级 菜单表
  17. JavaScript将字典序升序排列类似php中的ksort函数
  18. Altmetric
  19. [android] 手机卫士项目
  20. BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树

热门文章

  1. java中高级面试利器(boot,cloud,vue前后端提升)
  2. 面试官:小伙子,你给我讲一下java类加载机制和内存模型吧
  3. 交换机通过Loopback Detection检测(接口自环)
  4. FL Studio中如何制作和混音警报声
  5. 深度阅读:大学生课外知识补充,这些课堂上不教的 C++ 的基本特性你都知道吗?
  6. Java继承的两道实验题目
  7. Kafka源码环境搭建
  8. Spring Cloud 学习 (五) Zuul
  9. 查询Oracle日志文件的方法
  10. PyQt+moviepy音视频剪辑实战2:实现一个剪裁视频文件精华内容留存工具