当前位置: 首页 > news >正文

题解:CF983E NN country

首先思考线路只有从祖先到子孙的链的情况,对于询问的两个点 \(x\)\(y\),我们肯定要先从 \(x\) 跳到它们的 LCA,再从 LCA 跳到 \(y\)。由于从 LCA 到 \(y\) 的过程和从 \(y\) 到 LCA 的过程是等价的,所以我们可以先算出每个点在经过一定数量的线路时最远能到达哪个祖先。

暴力跳肯定不行,考虑倍增,记 \(f_{x,i}\) 表示从 \(x\) 开始往上跳,经过 \(2^{i}\) 条线路时最远能跳到的点。显然在得到每条线路的两端点 \(x\)\(y\) 时我们可以更新 \(f_{x,0}\)\(f_{y,0}\)\(x\)\(y\) 的 LCA(如果 LCA 的深度更小的话)。对于链上的其它点,在输入所有线路后我们进行一次 dfs 判断每个点 \(x\) 的儿子 \(son\)\(f_{son,0}\) 能否更新 \(f_{x,0}\)。最后倍增求出整个 \(f\) 数组,询问时直接按照 \(f\) 的值计算答案即可。

接下来考虑正常情况,对于不是从祖先到子孙的链的线路,我们考虑将它拆成一条从 LCA 到 \(x\) 的链和一条从 LCA 到 \(y\) 的链,统计答案时考虑是否要经过这条线路的拐弯处,如果要就将答案减 \(1\)。考虑如何判断答案是否需要减,记询问的两个点为 \(qx\)\(qy\),记 \(qx\) 到 LCA 的链上 LCA 的儿子为 \(a\)\(qy\) 到 LCA 的链上 LCA 的儿子为 \(b\)。显然如果存在一条可以经过拐弯的线路(记两端点为 \(x\)\(y\)),那么 \(x\) 肯定在 \(a\) 的子树中,\(y\) 肯定在 \(b\) 的子树中。转换一下也就是 \(dfn_a \le dfn_x \le dfn_a+siz_a-1\)\(dfn_b \le dfn_y \le dfn_b+siz_b-1\)。这样就转化成了二维数点问题,计算答案是否大于 \(0\) 即可,如果大于那最后就要减。

#include<bits/stdc++.h>
#define MAXN 400005
#define int long long
using namespace std;
const int inf=1e18;
int id,n,m,q,head[MAXN],cnt,fa[MAXN][22],f[MAXN][22],deep[MAXN],tree[MAXN],dfn[MAXN],num,ans[MAXN],qans[MAXN],bot[MAXN];
int lb(int x){return x&(-x);
}
void add(int x,int y){for(int i=x;i<=n;i+=lb(i))tree[i]+=y;
}
int que(int x,int y){int tans=0;for(int i=y;i;i-=lb(i))tans+=tree[i];for(int i=x-1;i;i-=lb(i))tans-=tree[i];return tans;
}
struct Edge{int value,next;
}edge[MAXN];
void addedge(int u,int v){edge[++cnt].value=v;edge[cnt].next=head[u];head[u]=cnt;
}
void dfs1(int x,int father){fa[x][0]=father;deep[x]=deep[father]+1;dfn[x]=++num;;for(int i=1;i<=21;i++)fa[x][i]=fa[fa[x][i-1]][i-1];for(int i=head[x];i;i=edge[i].next){int y=edge[i].value;if(y!=father){dfs1(y,x);}}bot[x]=num;
}
int LCA(int x,int y){if(deep[x]<deep[y])swap(x,y);for(int i=21;i>=0;i--){if(deep[fa[x][i]]>=deep[y])x=fa[x][i];} if(x==y)return x;for(int i=21;i>=0;i--){if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];}return fa[x][0];
}
void dfs2(int x){for(int i=head[x];i;i=edge[i].next){int y=edge[i].value;if(y!=fa[x][0]){dfs2(y);if(!f[x][0]||(f[y][0]&&deep[f[y][0]]<deep[f[x][0]])){f[x][0]=f[y][0];}}}
}
struct Node{int x,y,k,f,id;
}p[MAXN*4];
int tcnt;
bool cmp(Node x,Node y){return x.x==y.x?x.id<y.id:x.x<y.x;
}
signed main(){
//	freopen("metro.in","r",stdin);
//	freopen("metro.out","w",stdout);scanf("%lld",&n);for(int i=2;i<=n;i++){int v;scanf("%lld",&v);addedge(i,v),addedge(v,i);}dfs1(1,0);scanf("%lld",&m);for(int i=1;i<=m;i++){int x,y;scanf("%lld%lld",&x,&y);if(dfn[x]>dfn[y])swap(x,y);int l=LCA(x,y);if(!f[x][0]||(deep[l]<deep[f[x][0]]))f[x][0]=l;if(!f[y][0]||(deep[l]<deep[f[y][0]]))f[y][0]=l;p[++tcnt]=(Node){dfn[x],dfn[y],0,0,0};}dfs2(1);for(int i=1;i<=n;i++)if(f[i][0]==i)f[i][0]=0;for(int i=1;i<=21;i++){for(int j=1;j<=n;j++){f[j][i]=f[f[j][i-1]][i-1];}}scanf("%lld",&q);for(int i=1;i<=q;i++){int x,y;scanf("%lld%lld",&x,&y);if(dfn[x]>dfn[y])swap(x,y);int l=LCA(x,y);if(x==y){ans[i]=0;continue;}for(int j=21;j>=0;j--)if(f[x][j]&&deep[f[x][j]]>deep[l])x=f[x][j],ans[i]+=(1<<j);for(int j=21;j>=0;j--)if(f[y][j]&&deep[f[y][j]]>deep[l])y=f[y][j],ans[i]+=(1<<j);if((!f[x][0]&&x!=l)||(!f[y][0]&&y!=l)){ans[i]=-1;continue;}if(l==x||l==y)ans[i]++;else{ans[i]+=2;p[++tcnt]=(Node){bot[x],bot[y],1,1,i};p[++tcnt]=(Node){dfn[x]-1,bot[y],-1,1,i};p[++tcnt]=(Node){bot[x],dfn[y]-1,-1,1,i};p[++tcnt]=(Node){dfn[x]-1,dfn[y]-1,1,1,i};}}sort(p+1,p+tcnt+1,cmp);for(int i=1;i<=tcnt;i++){if(p[i].f==0)add(p[i].y,1);else qans[p[i].id]+=que(1,p[i].y)*p[i].k;}for(int i=1;i<=q;i++){printf("%lld\n",ans[i]-(qans[i]>0));}return 0;
}
http://www.zskr.cn/news/37180.html

相关文章:

  • 软件技术基础的第二次作业
  • langgraph-reflection
  • 学习日报11.2
  • 2025CSP-S游记
  • [KaibaMath]1017 关于收敛数列与其子数列之间的关系定理的证明
  • 操作系统软考复习总结
  • 2025 年 11 月 Pogopin 弹簧针厂家推荐排行榜,精密测试针,医疗传感器,手机连接器,声学弹簧,仪表锁具,座椅检测优质公司推荐!
  • Redis单机和集群搭建
  • 2025 年 11 月铣刀厂家推荐排行榜,雕刻机铣刀,金刚石铣刀,木工铣刀,绝缘材料铣刀,碳纤维铣刀,亚克力铣刀,金属加工铣刀公司推荐
  • 电子丨LDO与DC-DC电源管理器件
  • 市面上常见显示屏接口与对应的引脚 - 详解
  • 2025年10月文章一览
  • 002 vue3-admin项目的目录及文件说明
  • 2025 年 11 月超滤膜厂家最新推荐,产能、专利、环保三维数据透视
  • Ai复习
  • 2025 年 11 月风管厂家推荐排行榜,螺旋风管,不锈钢风管,镀锌板风管,排烟风管,通风管道,消音风管厂家专业推荐
  • 2025 年 11 月集装袋厂家最新推荐,技术实力与市场口碑深度解析
  • 2025 年 11 月立式砂磨机厂家推荐排行榜,立式纳米砂磨机,小型立式砂磨机,高效研磨设备专业选购指南
  • 2025 年 11 月中央空调厂家推荐排行榜,美的中央空调,海信中央空调,大金中央空调,格力中央空调,约克中央空调,商用中央空调,中央空调安装,中央空调维修,海尔中央空调,家用中央空调,工业中央空调
  • 2025 年 11 月高尔夫学院推荐排行榜,高尔夫培训,高尔夫教学,高尔夫教练,专业指导与课程体系深度解析
  • 软件技术基础B第二次作业
  • 2025 年 11 月三层绝缘线厂家推荐排行榜,东特,大亚,TOTOKU,FURUKAWA,TIW-2,TIW-3,TIW-4,TIW-E,TIW-2S,TEX-E 三层绝缘线公司推荐
  • CSP-S2025 员工招聘
  • 2025 年 11 月气动执行器厂家推荐排行榜,齿轮齿条执行器,拨叉式执行器,角行程执行器,不锈钢执行器,三段式执行器,快速执行器,执行器附件公司推荐
  • 001 vue3-admin项目说明与创建
  • 《代码大全2》观后感(三):变量命名——藏在细节里的“代码语言”
  • 2025 年 11 月石墨制品厂家最新推荐,实力品牌深度解析采购无忧之选!
  • agent skills - 邂逅那青春
  • IDEA 忽略 pom.xml 依赖警告
  • FinalShell破解专业版(SSH工具) v4.5.12 中文绿色版