题目链接https://nanti.jisuanke.com/t/28852

题目大意是 h*w 的平面,每两个点有且仅有一条路径,类似于封闭的联通空间,然后在这h*w个点中选取(标记为1~N)N个点(给了坐标),求从1号点按1~N的顺序走到N号点的路程。

练习赛的时候没有思路,队友说可以建树,但还是不清不楚没写出来。

做法是LCA。

将封闭的联通空间建树(点的位置与字符的位置有点麻烦),然后按顺序求两点的最近的公共祖先求深度得距离,最后得路程,算是一道LCA的模板。

 #include <bits/stdc++.h>
#define fir first
#define sec second
#define EPS 1e-12
using namespace std; typedef long long LL;
typedef pair<int , int > pii;
const int MAXN=+;
const int DEG=; struct Edge{
int to,nxt;
}edge[MAXN*];
int head[MAXN],tot; void addEdge(int u,int v){
edge[tot].to=v;
edge[tot].nxt=head[u];
head[u]=tot++;
}
void init(){
tot=;
memset(head,-,sizeof(head));
}
int fa[MAXN][DEG];
int deg[MAXN]; void BFS(int root){
queue< int > que;
deg[root]=;
fa[root][]=root;
que.push(root);
while(!que.empty()){
int tmp=que.front();que.pop();
for(int i=;i<DEG;++i)
fa[tmp][i]=fa[fa[tmp][i-]][i-];
for(int i=head[tmp];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa[tmp][]) continue;
deg[v]=deg[tmp]+;
fa[v][]=tmp;
que.push(v);
}
}
} int LCA(int u,int v){
if(deg[u]>deg[v]) swap(u,v);
int hu=deg[u],hv=deg[v];
int tu=u,tv=v;
for(int det=hv-hu,i=;det;det>>=,++i)
if(det&) tv=fa[tv][i];
if(tu==tv) return tu;
for(int i=DEG-;i>=;--i){
if(fa[tu][i]==fa[tv][i])
continue;
tu=fa[tu][i];
tv=fa[tv][i];
}
return fa[tu][];
} char maze[][];
int H,W; void Judge(int cur,int xx,int yy){
int i=xx,j=(yy+)/;
if(maze[xx-][yy]!='_'){
int to=(i-)*W+j;
addEdge(cur,to);
}
if(maze[xx][yy]!='_'){
int to=(i)*W+j;
addEdge(cur,to);
}
if(maze[xx][yy-]!='|'){
int to=(i-)*W+j-;
addEdge(cur,to);
}
if(maze[xx][yy+]!='|'){
int to=(i-)*W+j+;
addEdge(cur,to);
}
} LL caldist(int u,int v){
int ace=LCA(u,v);
return deg[u]+deg[v]-*deg[ace];
} int main()
{
init();
scanf("%d%d%*c",&H,&W);
for(int i=;i<=H;++i){
scanf("%[^\n]%*c",maze[i]);
}
for(int i=;i<=H;++i){
for(int j=;j<=W;++j){
int tmp=(i-)*W+j;
int xx=i,yy=*j-;
Judge(tmp,xx,yy);
}
}
BFS();
LL ans=;
int N,xi,yi;
scanf("%d%d%d",&N,&xi,&yi);
int old=(xi-)*W+yi,aft;
for(int i=;i<N;++i){
scanf("%d%d",&xi,&yi);
aft=(xi-)*W+yi;
ans+=caldist(old,aft);
old=aft;
}
printf("%lld\n",ans);
return ;
}

German Collegiate Programming Contest 2018​ A. Attack on Alpha-Zet的更多相关文章

  1. German Collegiate Programming Contest 2018​ B. Battle Royale

    Battle Royale games are the current trend in video games and Gamers Concealed Punching Circles (GCPC ...

  2. German Collegiate Programming Contest 2018​ C. Coolest Ski Route

    John loves winter. Every skiing season he goes heli-skiing with his friends. To do so, they rent a h ...

  3. German Collegiate Programming Contest 2018​

    // Coolest Ski Route #include <iostream> #include <cstdio> #include <cstring> #inc ...

  4. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  5. (寒假GYM开黑)2018 German Collegiate Programming Contest (GCPC 18)

    layout: post title: 2018 German Collegiate Programming Contest (GCPC 18) author: "luowentaoaa&q ...

  6. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...

  7. (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

    layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...

  8. German Collegiate Programming Contest 2015 计蒜课

    // Change of Scenery 1 #include <iostream> #include <cstdio> #include <algorithm> ...

  9. 2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)(9/11)

    $$2017-2018\ ACM-ICPC\ German\ Collegiate\ Programming\ Contest (GCPC 2017)$$ \(A.Drawing\ Borders\) ...

随机推荐

  1. ie 浏览器缓存问题

    Get请求在IE会存在缓存问题,最直接的办法  改成Post请求解决

  2. oracle-企业信息化

    http://www.itpub.net/thread-1873735-1-1.html        OCP考试心得 http://blog.csdn.net/rlhua/article/detai ...

  3. kafka-producer配置

    kafka-producer版本对比 Kafka的producer的API根据版本的不同分为kafka0.8.1.X之前的 kafka.javaapi.producer.Producer.以及之后版本 ...

  4. Excel函数之vlookup的用法

    Vlookup函数用法: 实例: 要将编号对照表中的图书名称根据两表中的图书编码字段引入 订单明细中. Vlookup函数 参数一:键入一个需要搜索的字段,这里需要通过订单明细中的图书编号在编号对照离 ...

  5. RGB格式图像转化为HSV格式

    注:在阴影检测算法中经常需要将RGB格式的图像转化为HSV格式,对于阴影区域而言,它的色度和饱和度相对于原图像而言变化不大,主要是亮度信息变化较大,,将RGB格式转化为HSV格式,就可以得到H.S.V ...

  6. ubuntu安装nginx及其默认目录结构

    一. 安装包安装 1.1 安装Nginx $sudo apt-get install nginx Ubuntu安装之后的文件结构大致为: 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经 ...

  7. JAVA web端JS下载excel文件

    JSP代码如下: JSP端引入jquery.easyui.min.js库: <script type="text/javascript" src="<c:ur ...

  8. javascript常用工具类整理(copy)

    JavaScript常用工具类 类型 日期 数组 字符串 数字 网络请求 节点 存储 其他 1.类型 isString (o) { //是否字符串 return Object.prototype.to ...

  9. mongo官方企业版安装及数据库授权使用

    通过安装.deb包的方式,系统是Ubuntu 16.04 1. Import the public key used by the package management system.(导入包管理系统 ...

  10. Servlet的几个关键知识点

    1.ServletConfig ServletConfig是Servlet的配置文件.对应于web.xml中的<servlet></servlet>标签.ServletConf ...