博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDOI2015 寻宝游戏
阅读量:6690 次
发布时间:2019-06-25

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

#include
#include
#include
using namespace std;#define int long long#define N 100010struct edge{ int nxt,to,w;} e[N<<1];set
S;int n,m,x,y,z;char c;int cnt,tot,ans;int head[N],fa[N],siz[N],son[N],dep[N],top[N],dis[N],dfn[N],id[N];bool vis[N];inline void add(int u,int v,int w){ e[++cnt].nxt=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt;}void dfs1(int u){ siz[u]=1; dep[u]=dep[fa[u]]+1; dfn[u]=++tot; id[tot]=u; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; if(v==fa[u]) continue; fa[v]=u; dis[v]=dis[u]+e[i].w; dfs1(v); siz[u]+=siz[v]; if(siz[v]>siz[son[u]]) son[u]=v; }}void dfs2(int u,int t){ top[u]=t; if(!son[u]) return ; dfs2(son[u],t); for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; if(v==fa[u] || v==son[u]) continue; dfs2(v,v); }}inline int LCA(int x,int y){ for(;top[x]!=top[y];){ if(dep[top[x]]
dep[y]) swap(x,y); return x;}inline int calc(int x,int y){ return dis[x]+dis[y]-dis[LCA(x,y)]*2;}signed main(){ scanf("%lld%lld",&n,&m); for(int i=1;i
=1) sum+=calc(id[l],x); if(r<=n) sum+=calc(id[r],x); if(l>=1 && r<=n) sum-=calc(id[l],id[r]); if(!vis[x]) ans+=sum; else{ S.erase(dfn[x]); ans-=sum; } l=*++S.find(0),r=*--S.find(n+1); if(l<1 || r>n) printf("%lld\n",ans); else printf("%lld\n",ans+calc(id[l],id[r])); vis[x]=!vis[x]; } return 0;}

转载于:https://www.cnblogs.com/pelom/p/10659201.html

你可能感兴趣的文章
周锦民:腾讯在线教育视频互动直播间技术实践
查看>>
[转]UML类图、关系及其JAVA代码
查看>>
PhotoShop算法原理解析系列 - 像素化---》碎片。
查看>>
设计模式之责任链模式
查看>>
php多态设计
查看>>
mvc伪静态<三> IIS配置
查看>>
android自定义radiobutton样式文字颜色随选中状态而改变
查看>>
【CodeForces 604B】F - 一般水的题1-More Cowbe
查看>>
wxPython 4.0.0b2安装
查看>>
Android RecyclerView利用Glide加载大量图片into(Target)导致OOM异常
查看>>
UGUI表情系统解决方案
查看>>
HTTP Health Checks
查看>>
为什么正态分布如此普遍
查看>>
jQuery事件
查看>>
BBS论坛(三十)
查看>>
轻松看懂Java字节码
查看>>
AE TIN的切割
查看>>
ASP.NET图片上传,删除
查看>>
Visual Studio 2010 创建的WCF服务 第一个应用
查看>>
2016第42周五
查看>>