[国家集训队]飞飞侠
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
[国家集训队]飞飞侠相关推荐
- 题解 洛谷P4473 【[国家集训队]飞飞侠】
这道题今天我们考试考到了,第三题,最后只剩半小时了,随便打了个暴搜,最后竟然还没调完QAQ,我竟然连暴力都不会打了 咳咳,不扯了,下面开始说这道题的做法 由于N和M都不大于150最容易想到的是Floy ...
- BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...
- 刷题总结——飞飞侠(bzoj2143 最短路)
题目: Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街 ...
- 国家集训队论文分类整理[转]
国家集训队论文分类整理 转自这里 dalao写的东西,是非常有学习价值的.反正noip不一定会用,但是对以后肯定有用的. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用&g ...
- 国家集训队论文分类整理
国家集训队论文分类整理 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬 ...
- 国家集训队论文分类整理(转)
国家集训队论文分类整理 ----------转自https://www.cnblogs.com/AbandonZHANG/archive/2012/07/21/2601889.html 距离ACM/I ...
- 国家集训队论文集题目
这些论文还是很不错的,可以当成专题到谷歌上搜着看看,权当拓展下知识. 国家集训队1999论文集 陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 来煜坤:<把 ...
- acm国家集训队论文(1999-2009)
原文地址http://blog.sina.com.cn/s/blog_49eda3f30100r6ip.html 国家集训队1999论文集 陈宏:<数据结构的选择与算法效率--从IOI98试题 ...
- NOI 国家集训队论文集
转载链接:http://blog.csdn.net/bright_xl/article/details/11084747 国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pól ...
- 国家集训队1999-2009论文集
国家集训队1999论文集 陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 来煜坤:<把握本质,灵活运用--动态规划的深入探讨> 齐鑫:<搜索方法 ...
最新文章
- Kafka+SparkStreaming+Zookeeper(ZK存储Offset,解决checkpoint问题)
- phpbreak跳出几层循环_php中break如何跳出多重循环的示例代码
- 机器学习之贝叶斯垃圾邮件分类
- 取后端数据_用 Flask+Axios 实现前后端数据通信:查询动森鱼类价格
- DateTime 操作详解
- C++的STL标准库学习(vector)
- 通信工程领域当前的主流技术及其社会需求调查报告
- Vue:带参数函数在传递参数的同时传递事件对象
- 阅读-《金字塔原理》
- 电脑自动关机后又自动开机怎么办
- 【WEB服务器】什么是WEB服务器
- CyclicBarrier(集成7颗龙珠召唤神龙)
- Daily English-问爱好
- java paint 覆盖_Java paintComponent覆盖版本5和6之间的差异
- 如何在游戏中快速集成聊天功能
- DRC设计规则设置介绍-Design Compiler(四)
- SystemUi概述
- 如何高效构建保险业场景化数据分析体系-承保和理赔
- 软件测试响应时间原则,性能测试二八原则,响应时间2/5/8原则
- OpenPortalServer Operation Ultra V5.7.0.8 运营旗舰版 2021-10-09
热门文章
- 深入解析 Flink 的算子链机制
- Android自定义头部悬浮,快速索引ListView
- 清明,我怀念那个回不去的故乡了
- Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类
- 惠普战66一代拆机_或许这就是匠人吧 全新惠普战66二代的另类拆解
- 将您重定向的次数过多。_吃鸡:蹦蹦将迎来新皮肤?体验服全面加强,最高时速也不打滑...
- python 列表相关应用大全
- 统计函数应用之SQL 分析函数
- 如何在点击事件中取得复选框选中的单元格值
- serve注解是加在哪个类_PHP 8新特性之Attributes(注解)