P5236 【模板】静态仙人掌圆方树模板

news/2024/11/27 23:59:29/

链接: https://www.luogu.org/problem/P5236

题意:

你有一个 n ( n < = 10000 ) n(n<=10000) n(n<=10000) 个点 m ( m < = 20000 ) m(m<=20000) m(m<=20000) 条边的仙人掌,有 q ( q < = 10000 ) q(q<=10000) q(q<=10000) 个询问,每次询问两个点之间的距离是多少(距离即两点间的最短路径)。

代码

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i = (int)a;i<=(int)b;i++)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;const int maxn=100005;
const int maxm=100005;
int low[maxn],dfn[maxn],dep[maxn],cou;
int len[maxn],n,m,q,fa[maxn][18],sum[maxn][18];
int S[maxn],top,dis[maxn],ed[maxm],totp,ty[maxm];
struct Graph{int cnt,nex[maxm],to[maxm];int head[maxn],val[maxn];Graph(){memset(head,-1,sizeof(head)); cnt=0;}void add(int u,int v,int va){to[cnt]=v;nex[cnt]=head[u];val[cnt]=va; head[u]=cnt++;}
}G,Cactu;
void dfs(int u,int f){for(int i=Cactu.head[u];~i;i=Cactu.nex[i]){int v=Cactu.to[i];fa[v][0]=u,dep[v]=dep[u]+1,sum[v][0]=Cactu.val[i];dfs(v,u);}
}
void deal(int u,int v){//记录整条链的长度len[++totp]=dis[S[top]]-dis[u]+ed[S[top]];//将环上的点取出while(1){int p=S[top--];int x=dis[p]-dis[u],y=len[totp]-x;Cactu.add(totp,p,min(x,y));ty[p]=(x<=y);if(p==v) break;}Cactu.add(u,totp,0);
}
void tarjan(int u,int f){dfn[u]=low[u]=++cou;S[++top]=u;for(int i=G.head[u];~i;i=G.nex[i]){int v=G.to[i];if(v==f) continue;if(!dfn[v]){dis[v]=dis[u]+G.val[i];tarjan(v,u);//这条边为非环边 直接建图if(low[v]>dfn[u]) top--,Cactu.add(u,v,G.val[i]);//如果u和v是恰好连接一个环的边else if (low[v]==dfn[u]) deal(u,v);low[u]=min(low[u],low[v]);}//这条边连回更小的位置else low[u]=min(low[u],dfn[v]),ed[u]=G.val[i];}
}
int LCA(int x,int y){int ret=0;if(dep[x]<dep[y]) swap(x,y);for(int i=15;i>=0;i--)if(dep[x]-(1<<i)>=dep[y])ret+=sum[x][i],x=fa[x][i];if(x==y) return ret;for(int i=15;i>=0;i--)if(fa[x][i]!=fa[y][i]&&fa[x][i]!=-1){ret=ret+sum[x][i]+sum[y][i];x=fa[x][i],y=fa[y][i];}if(fa[x][0]<=n) return sum[x][0]+sum[y][0]+ret;int a=sum[x][0],b=sum[y][0],add;if(ty[x]==ty[y]) add=min(abs(a-b),len[fa[x][0]]-abs(a-b));else add=min(a+b,len[fa[x][0]]-a-b);return ret+add;
}
int main(){scanf("%d%d%d",&n,&m,&q); totp=n;rep(i,1,m){int x,y,z;scanf("%d%d%d",&x,&y,&z);G.add(x,y,z); G.add(y,x,z);}tarjan(1,-1);dfs(1,-1);for(int j=1;j<=15;j++){for(int i=1;i<=totp;i++){sum[i][j]=sum[i][j-1]+sum[fa[i][j-1]][j-1];fa[i][j]=fa[fa[i][j-1]][j-1];}}while(q--){int u,v; scanf("%d%d",&u,&v);printf("%d\n",LCA(u,v));}return 0;
}

http://www.ppmy.cn/news/165447.html

相关文章

Talk预告 | 新加坡国立大学张傲:10%成本定制类 GPT-4 多模态大模型

本期为TechBeat人工智能社区第502期线上Talk&#xff01; 北京时间06月01日(周四)20:00&#xff0c;新加坡国立大学在读博士生 — 张傲的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “10%成本定制类 GPT-4 多模态大模型 ”&#xff0c;届时将介…

hdu5236 Article

题意&#xff1a;你要输入一篇n个字的文章&#xff0c;每到i0.1s时可以输入一个字符&#xff0c;每到i0.9s时有p的概率会奔溃&#xff0c;回到开头或者上一个存盘点&#xff0c;每到第i秒有一次机会可以选择按x个健存盘或者不存&#xff0c;打印完整篇文章之后必须存盘一次才能…

HDOJ 5236 Article

2015年上海大都会的一个概率dp题&#xff0c;当时&#xff0c;不会&#xff0c;现在&#xff0c;开了专题&#xff0c;然后再来补题 有了不一样的感觉了&#xff0c;题海战术&#xff0c;还是有那么点感觉的。题目链接&#xff1a;HDOJ5236 概率dp&#xff0c;无非就是算期望或…

hdu 5236 Article 概率dp

Article Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid5236 Description As the term is going to end, DRD begins to write his final article. DRD uses the famous Macrohards software, World, to write his article. …

linux学习之防火墙,查看Linux防火墙状态,开启/关闭Linux防火墙,Linux防火墙开放5236端口

Firewalld RHEL7是一个集合多款防火墙管理工具并存的系统&#xff0c;Firewalld动态防火墙管理器服务&#xff08;Dynamic Firewall Manager of Linux systems&#xff09;是目前默认的防火墙管理工具&#xff0c;同时拥有命令行终端和图形化界面的配置工具。相比于传统的防火…

hdu 5236

http://acm.hdu.edu.cn/showproblem.php?pid5236 这是一道概率dp贪心题&#xff1b; 建立状态dp[i]&#xff0c; 表示敲出i个字符的期望次数&#xff0c; 那么有 dp[i] dp[i-1] p*(1 dp[i]) (1-p); 解释一下&#xff1a; 敲出i个字符&#xff0c; 首先得敲出i-1个字符…

HDU 5236 Article

题目来源&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5236 题意&#xff1a;打印一篇论文需要按键n次&#xff0c;在每i0.1秒时打&#xff0c;在第i0.9秒时有p的概率系统崩溃&#xff0c;崩溃后需要回退到开头或上次保存的地方重新开始。可以选择在第i秒时按下x个…

达梦8之非默认端口(5236)如何实现操作系统认证登录

达梦8之非默认端口(5236)如何实现操作系统认证登录 1、背景 近期遇到诸多金融类项目&#xff0c;在实际生产环境中对达梦SYSDBA默认密码和实例端口&#xff0c;均不允许缺省设置&#xff0c;由此需修改SYSDBA默认密码和默认实例端口号&#xff0c;本文为大家介绍同时修改SYSD…