#include<bits/stdc++.h>//此题有个坑:并没有说节点标号是1~n!! usingnamespace std;//因此绝对不能用数组! constint maxn=10010;
map<int,bool> gg;int m,n,a;intmain(){scanf("%d%d",&m,&n);
vector<int>pre(n);//!for(int i=0;i<n;i++){int tmp;scanf("%d",&pre[i]);
gg[pre[i]]=true;}for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);int a;for(int j=0;j<n;j++){
a=pre[j];if((a>u&&a<v)||(a<u&&a>v)||(a==u||a==v))break;}if(gg[u]==false&&gg[v]==false){printf("ERROR: %d and %d are not found.\n",u,v);}elseif(gg[u]==false||gg[v]==false){printf("ERROR: %d is not found.\n",gg[u]? v:u);}elseif(a==u||a==v){printf("%d is an ancestor of %d.\n",a,a==u?v:u);}else{printf("LCA of %d and %d is %d.\n",u,v,a);}}return0;}
#include<iostream>//别人为何这么叼?!:作者透过现象观察到了#include<vector>//两最近祖先节点和先序遍历的本质! #include<map>//关键在于它给的是先序的!!决定了可以直接用从root开始的前根 usingnamespace std;//与u、v同时比较即可!
map<int,bool> mp;//该序号节点是否被访问(用哈希实现) intmain(){int m, n, u, v, a;//被测试的组数/bst中的节点数/被测试的两个点序号/先序节点元素 scanf("%d %d",&m,&n);//输入被测试的组数和bst中的节点数
vector<int>pre(n);//给先序向量容器初始化n个int空间(声明一个初始大小为n的向量) for(int i =0; i < n; i++){scanf("%d",&pre[i]);
mp[pre[i]]=true;//每个数都map为true! }for(int i =0; i < m; i++){// !!核心思想!! scanf("%d %d",&u,&v);for(int j =0; j < n; j++){//遍历n个bst的节点
a = pre[j];if((a > u && a < v)||(a > v && a < u)||(a == u)||(a == v))break;}//先直接比较:并完美考虑三种情况! if(mp[u]==false&& mp[v]==false)//再看u,v是否bst树中! printf("ERROR: %d and %d are not found.\n", u, v);elseif(mp[u]==false|| mp[v]==false)printf("ERROR: %d is not found.\n", mp[u]==false? u : v);elseif(a == u || a == v)printf("%d is an ancestor of %d.\n", a, a == u ? v : u);elseprintf("LCA of %d and %d is %d.\n", u, v, a);}return0;}