https://www.luogu.org/problemnew/show/P4473

仙人题啊仙人题

正解是什么并查集优化??看不懂也不会写

读题发现,这题的问题在于暴力建边会GG,需要解决的就是一个点向一个连通块连边的问题

想到可以把连通块拆成一行一行,在一行内,要解决一个点向一个区间连边的问题

线段树优化连边,我们只建维护入边的线段树,对于一个区间找到对应线段树内节点连边,树内从父亲向儿子连边(边权当然是0)

nm个点,e=n^2mlogm = 16875000个边,这样跑一边最短路是O(eloge),似乎能过???

然后就是我的zz时间:这个图不是无向的,因此x->y和y->x显然不同,得挨个点跑一边最短路才行...

我好菜qaq

2.0h

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<iostream>
using namespace std;
#define O(x) cout << #x << " " << x << endl;
#define O_(x) cout << #x << " " << x << "  ";
#define B cout << "breakpoint" << endl;
typedef long long ll;
typedef pair<ll,int> pii;
const ll inf = 1e14;
#define mp make_pair
inline int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){(ans *= 10) += ch - '0';ch  = getchar();}return ans * op;
}
const int maxn = 303;
const int N = 1e6 + 5;
int n,m;
int id[maxn][maxn];//id[i][j] : i行j列对应线段树中哪个节点
int ls[N],rs[N],root[maxn],tot;
struct egde
{int to,next;ll cost;
}e[N * 20];
int fir[N],alloc;
void adde(int u,int v,int w)
{e[++alloc].next = fir[u];fir[u] = alloc;e[alloc].to = v;e[alloc].cost = w;
}
int build(int line,int i,int l,int r)
{if(l == r){id[line][l] = i;return i;}int mid = l + r >> 1;ls[i] = build(line,++tot,l,mid);rs[i] = build(line,++tot,mid + 1,r);adde(i,ls[i],0); adde(i,rs[i],0);return i;
}
void add(int i,int l,int r,int u,int ql,int qr,ll w)//u->[ql,qr]
{if(l == ql && r == qr){adde(u,i,w);return;}int mid = l + r >> 1;if(qr <= mid) add(ls[i],l,mid,u,ql,qr,w);else if(ql > mid) add(rs[i],mid + 1,r,u,ql,qr,w);else add(ls[i],l,mid,u,ql,mid,w),add(rs[i],mid + 1,r,u,mid + 1,qr,w);
}
bool vis[N];
ll dis[N];
void dij(int s)
{for(int i = 1;i <= tot;i++) dis[i] = inf;memset(vis,0,sizeof(vis));dis[s] = 0;priority_queue<pii,vector<pii>,greater<pii> > p;p.push(mp(dis[s],s));while(p.size()){pii t = p.top();p.pop();int u = t.second;if(vis[u]) continue;vis[u] = 1;for(int i = fir[u];i;i = e[i].next){int v = e[i].to;ll w = e[i].cost;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;if(!vis[v]) p.push(mp(dis[v],v));}}}
}
int b[maxn][maxn];
ll a[maxn][maxn];
int main()
{n = read(),m = read();for(int i = 1;i <= n;i++) root[i] = build(i,++tot,1,m);for(int i = 1;i <= n;i++)for(int j = 1;j <= m;j++)b[i][j] = read();//距离 for(int i = 1;i <= n;i++)for(int j = 1;j <= m;j++)scanf("%lld",&a[i][j]);//费用for(int i = 1;i <= n;i++)for(int j = 1;j <= m;j++){for(int k = max(1,i - b[i][j]);k <= min(n,i + b[i][j]);k++){int res = b[i][j] - abs(k - i);add(root[k],1,m,id[i][j],max(1,j - res),min(m,j + res),a[i][j]);}}int x1 = read(),y1 = read(),x2 = read(),y2 = read(),x3 = read(),y3 = read();int x = id[x1][y1],y = id[x2][y2],z = id[x3][y3];dij(x);ll xy = dis[y],xz = dis[z];dij(y);ll yz = dis[z],yx = dis[x];dij(z);ll zx = dis[x],zy = dis[y];ll ansx = yx + zx,ansy = xy + zy,ansz = xz + yz;if(ansx >= inf && ansy >= inf && ansz >= inf){printf("NO\n");return 0;}if(ansx <= ansy && ansx <= ansz) printf("X\n%lld",ansx);else if(ansy <= ansx && ansy <= ansz) printf("Y\n%lld",ansy);else printf("Z\n%lld",ansz);
}

View Code

转载于:https://www.cnblogs.com/LM-LBG/p/10858371.html

[国家集训队]飞飞侠相关推荐

  1. 题解 洛谷P4473 【[国家集训队]飞飞侠】

    这道题今天我们考试考到了,第三题,最后只剩半小时了,随便打了个暴搜,最后竟然还没调完QAQ,我竟然连暴力都不会打了 咳咳,不扯了,下面开始说这道题的做法 由于N和M都不大于150最容易想到的是Floy ...

  2. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  3. 刷题总结——飞飞侠(bzoj2143 最短路)

    题目: Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街 ...

  4. 国家集训队论文分类整理[转]

    国家集训队论文分类整理 转自这里 dalao写的东西,是非常有学习价值的.反正noip不一定会用,但是对以后肯定有用的. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用&g ...

  5. 国家集训队论文分类整理

    国家集训队论文分类整理 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬 ...

  6. 国家集训队论文分类整理(转)

    国家集训队论文分类整理 ----------转自https://www.cnblogs.com/AbandonZHANG/archive/2012/07/21/2601889.html 距离ACM/I ...

  7. 国家集训队论文集题目

    这些论文还是很不错的,可以当成专题到谷歌上搜着看看,权当拓展下知识. 国家集训队1999论文集 陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 来煜坤:<把 ...

  8. acm国家集训队论文(1999-2009)

    原文地址http://blog.sina.com.cn/s/blog_49eda3f30100r6ip.html 国家集训队1999论文集  陈宏:<数据结构的选择与算法效率--从IOI98试题 ...

  9. NOI 国家集训队论文集

    转载链接:http://blog.csdn.net/bright_xl/article/details/11084747 国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pól ...

  10. 国家集训队1999-2009论文集

    国家集训队1999论文集 陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 来煜坤:<把握本质,灵活运用--动态规划的深入探讨> 齐鑫:<搜索方法 ...

最新文章

  1. Kafka+SparkStreaming+Zookeeper(ZK存储Offset,解决checkpoint问题)
  2. phpbreak跳出几层循环_php中break如何跳出多重循环的示例代码
  3. 机器学习之贝叶斯垃圾邮件分类
  4. 取后端数据_用 Flask+Axios 实现前后端数据通信:查询动森鱼类价格
  5. DateTime 操作详解
  6. C++的STL标准库学习(vector)
  7. 通信工程领域当前的主流技术及其社会需求调查报告
  8. Vue:带参数函数在传递参数的同时传递事件对象
  9. 阅读-《金字塔原理》
  10. 电脑自动关机后又自动开机怎么办
  11. 【WEB服务器】什么是WEB服务器
  12. CyclicBarrier(集成7颗龙珠召唤神龙)
  13. Daily English-问爱好
  14. java paint 覆盖_Java paintComponent覆盖版本5和6之间的差异
  15. 如何在游戏中快速集成聊天功能
  16. DRC设计规则设置介绍-Design Compiler(四)
  17. SystemUi概述
  18. 如何高效构建保险业场景化数据分析体系-承保和理赔
  19. 软件测试响应时间原则,性能测试二八原则,响应时间2/5/8原则
  20. OpenPortalServer Operation Ultra V5.7.0.8 运营旗舰版 2021-10-09

热门文章

  1. 深入解析 Flink 的算子链机制
  2. Android自定义头部悬浮,快速索引ListView
  3. 清明,我怀念那个回不去的故乡了
  4. Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类
  5. 惠普战66一代拆机_或许这就是匠人吧 全新惠普战66二代的另类拆解
  6. 将您重定向的次数过多。_吃鸡:蹦蹦将迎来新皮肤?体验服全面加强,最高时速也不打滑...
  7. python 列表相关应用大全
  8. 统计函数应用之SQL 分析函数
  9. 如何在点击事件中取得复选框选中的单元格值
  10. serve注解是加在哪个类_PHP 8新特性之Attributes(注解)