博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文章标题
阅读量:7120 次
发布时间:2019-06-28

本文共 1537 字,大约阅读时间需要 5 分钟。

题解

比赛的时候以为这是一道动态维护树的中心,看了题解发现自己想错了。公共祖先的题目确实是少
这次学习了一下set
发现有非常多使用简便的地方

#include 
#include
#include
#include
#include
#include
using namespace std;#define N 111111#define iter set
::iteratorint par[N][20];int depth[N];int dis[N];int n,m;int p[N];int vis[N];int cnt;int dfn[N];vector
>edge[N];set
ans;void dfs(int u,int fa){ dfn[++cnt]=u; p[u]=cnt; //printf("%d %d\n",u,fa); for(int i=1;i<18;i++){ //寻找他的十八辈祖宗 par[u][i]=par[par[u][i-1]][i-1]; } for(int i=0;i
depth[v]) swap(u,v); for(int k=0;k<18;k++){ if((depth[v]-depth[u])>>k&1){ v = par[v][k]; } } if(v==u) return u; for(int k=17;k>=0;k--){ if(par[u][k]!=par[v][k]){ u=par[u][k]; v=par[v][k]; } } return par[u][0];}int tot;int add(int u){ if (ans.empty()) return 0; int x, y; //寻找与u相邻的dfs序点 iter it = ans.lower_bound(p[u]); iter itx = it; itx--; if (it == ans.end() || it == ans.begin()) { it = ans.begin(); itx = ans.end(); itx--; } y = (*it); x = (*itx); y = dfn[y]; x = dfn[x]; return dis[u] - dis[lca(x, u)] - dis[lca(y, u)] + dis[lca(x, y)];}void init(){ for(int i=1;i<=n;i++){ edge[i].clear(); } memset(vis,0,sizeof(vis)); memset(dfn,0,sizeof(dfn)); memset(p,0,sizeof(p)); memset(par,0,sizeof(par)); memset(dis,0,sizeof(dis)); memset(depth,0,sizeof(depth)); cnt=0; ans.clear();}int main(){ int T; int cas = 0; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); init(); int x,y,z; for(int i=1;i

转载于:https://www.cnblogs.com/yutingliuyl/p/7111001.html

你可能感兴趣的文章
bash:yum:command not found 解决办法
查看>>
centos7.3二进制安装mariadb10.2.8
查看>>
通过命令行创建MAVEN多模块项目
查看>>
spark-env.sh配置
查看>>
ALERT日志中常见监听错误:ORA-3136错误的排查
查看>>
容器中运行Fabric区块链网络
查看>>
Kubernetes-2018干货盘点
查看>>
Java 用DBCP连接数据库。
查看>>
【认证】JNCIE SP备战心得(大侠唐在飞)
查看>>
DriverManager 连接不同的连接池
查看>>
马哥linux视频的学习笔记
查看>>
Nginx反向代理实现负载均衡web集群
查看>>
Linux之FineBI集群部署
查看>>
iOS版本更新与集成百度地图
查看>>
【学生管理系统】
查看>>
Storm原理与实现
查看>>
《数据库系统概念》20-恢复系统
查看>>
$.ajax 简单记录
查看>>
vbr和cbr
查看>>
su命令
查看>>