洛谷题目链接

题意

首先想到单源最短路,但是如果暴力模拟就会导致从区间里每一个点连向另一个点时最坏情况时间复杂度达到O(N*N),显然会TLE。那么看到区间操作,自然会想到处理区间操作的数据结构,这一题就是一道线段树题。

想法

【线段树优化建图】

1.由于直接暴力模拟连边导致TLE,我们可以按照题意建两颗线段树TreeIn(外部一点连向一个区间)和TreeOut(一个区间连向一个点),线段树中的线段编号(编号异于已知点编号)用vector存图,利用线段树特性,减少连边次数。线段树内部的区间使用选取正确的方向建立边权为0的单向边)。

2.线段树的更新操作并不操作线段树本身,只是在vector数组中建立一条和相关线段树区间相连接的边。

3.使用dijstra找最短路。

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>using namespace std;const int MAXN = 100100;const long long int INF  = 0x3f3f3f3f3f3f3f3f;struct _Edge
{long long int to;long long int cost;
};//边要开够
vector<_Edge> Edge[MAXN*10];long long int n,q,s;
long long int Count;long long int TreeIn[MAXN<<2],TreeOut[MAXN<<2];struct _dist
{long long int pos;long long int dis;
};inline void AddEdge(long long int u,long long int v,long long int cost)
{_Edge New;New.to = v;New.cost = cost;Edge[u].push_back(New);
}void BuildTree(long long int Index,long long int l,long long int r)
{if(l == r){TreeIn[Index] = l;TreeOut[Index] = l;return;}long long int Mid = (l+r)>>1;BuildTree(Index*2,l,Mid);BuildTree(Index*2+1,Mid+1,r);//为某个区块编号 TreeIn[Index] = ++Count;TreeOut[Index] = ++Count;AddEdge(TreeIn[Index],TreeIn[Index*2],0);AddEdge(TreeIn[Index],TreeIn[Index*2+1],0);AddEdge(TreeOut[Index*2],TreeOut[Index],0);AddEdge(TreeOut[Index*2+1],TreeOut[Index],0);
}void UpdateIn(long long int Index,long long int l,long long int r,long long int L,long long int R,long long int num,long long int cost)
{if(l <= L && r >= R){AddEdge(num,TreeIn[Index],cost);return;}long long int Mid = (L+R)>>1;if(l <= Mid){UpdateIn(Index*2,l,r,L,Mid,num,cost);}if(r > Mid){UpdateIn(Index*2+1,l,r,Mid+1,R,num,cost);}
}void UpdateOut(long long int Index,long long int l,long long int r,long long int L,long long int R,long long int num,long long int cost)
{if(l <= L && r >= R){AddEdge(TreeOut[Index],num,cost);return;}long long int Mid = (L+R)>>1;if(l <= Mid){UpdateOut(Index*2,l,r,L,Mid,num,cost);}if(r > Mid){UpdateOut(Index*2+1,l,r,Mid+1,R,num,cost);}
}bool operator>(_dist a,_dist b)
{return a.dis > b.dis;
}priority_queue<_dist,vector<_dist>,greater<_dist> > Dist;
long long int DisResult[MAXN*10];void Dij(void)
{memset(DisResult,0X3F,sizeof(DisResult));DisResult[s] = 0;_dist Tmp;Tmp.pos = s;Tmp.dis = 0;Dist.push(Tmp);while(!Dist.empty()){_dist Index = Dist.top();Dist.pop();if(DisResult[Index.pos] != Index.dis){continue;}for(int i = 0;i < Edge[Index.pos].size();i++){if(DisResult[Edge[Index.pos][i].to] > Edge[Index.pos][i].cost+DisResult[Index.pos]){DisResult[Edge[Index.pos][i].to] = Edge[Index.pos][i].cost+DisResult[Index.pos];_dist Tmp;Tmp.pos = Edge[Index.pos][i].to;Tmp.dis = DisResult[Edge[Index.pos][i].to];Dist.push(Tmp);}}}
}int main(void)
{cin >> n >> q >> s;Count = n;BuildTree(1,1,n);for(int i = 1;i <= q;i++){long long int type;cin >> type;if(type == 1){long long int u,v,w;cin >> u >> v >> w;AddEdge(u,v,w);}else if(type == 2){long long int v,l,r,w;cin >> v >> l >> r >> w;UpdateIn(1,l,r,1,n,v,w);}else if(type == 3){long long int v,l,r,w;cin >> v >> l >> r >> w;UpdateOut(1,l,r,1,n,v,w);}}Dij();for(int i = 1;i <= n;i++){if(DisResult[i] == INF){cout << -1 << ' ';continue;}cout << DisResult[i] << ' ';}cout << endl;return 0;
}

CF786B Legacy 线段树优化建图相关推荐

  1. Codeforces 786B Legacy (线段树优化建图)

    Codeforces 786B Legacy (线段树优化建图) 题意:\(n\)个点,有\(3\)种连边操作:1.将\(u\)指向\(v\):2.将\(v\)指向编号在区间\([l,r]\)的点:3 ...

  2. CodeForces - 787D - Legacy(线段树优化建图+最短路)

    题目链接:点击查看 题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下: 1uvw1 \ u \ v \ w1 u v w ...

  3. 线段树优化建图详解——区间连边之技巧,吊打紫题之利器

    我们从一道例题开始. CF786B Description Solution 朴素解法: 暴力连边+最短路 对于每次连边操作,我们逐一连边,最后在图上跑一遍单源最短路径算法即可. 时间复杂度 O ( ...

  4. 【CF1045A】A Last chance【贪心】【线段树优化建图】【网络流构造方案】

    题意:有nnn个武器和mmm个飞船,武器有下面三种 从给定的集合SSS中击破一个. 在给定的区间[L,R][L,R][L,R]中击破一个. 对于给定的a,b,ca,b,ca,b,c,选择000个或22 ...

  5. Gym - 102174G 神圣的 F2 连接着我们 (线段树优化建图 + 多源最短路)

    Description 小白非常喜欢玩 "县际争霸" 这款游戏,虽然他的技术并不容乐观."县际争霸" 的地图共有两个县,每个县里各有 n n n 个据点.同一个 ...

  6. 洛谷P3588 [POI2015]PUS(线段树优化建图)

    题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...

  7. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  8. P6348 [PA2011]Journeys 线段树优化建图 区间连区间

    传送门 文章目录 题意: 思路: 题意: 每次连接[a,b][a,b][a,b]与[c,d][c,d][c,d]之间所有点,让后跑最短路. 思路: 比普通的优化建图能简单点,我们只需要加两个虚点之间边 ...

  9. CF786B Legacy(线段树优化建图)

    传送门 ovo这题该怎么做呢?我们首先考虑暴力建图,但是因为建图的操作太多直接就会MLE,所以这个就别想了-- 我们考虑如何优化建图.因为发现一个点可以向一个区间连边,一个区间也可以向一个点连边,想到 ...

最新文章

  1. 一文详解面向多级多模态场景的召回引擎
  2. SAP HUM 嵌套HU的盘点
  3. QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法
  4. James Fee’s 5 Predictions Geo for 2010 and 5 Things That Won’t Happen
  5. 从微信公众平台·小程序内测邀请函看应用号动向
  6. WebPart(汇总)[转载]
  7. 调试九法:软硬件错误的排查之道书评
  8. phpstudy+dvwa搭建
  9. linux内存管理简介,Linux操作系统的内存管理特性简介 (3)
  10. 名企面试官精讲典型编程题之C#篇
  11. UGUI的Button和Toggle
  12. 关于videoplayer
  13. chrome浏览器控制台执行js脚本
  14. JPEG压缩原理详解
  15. 求职简历中一些常见的问题
  16. input框只能输入非负数
  17. webstorm 2017 激活破解方法大全
  18. SWITCH 和ROUTE的故事(来自Csico论坛)
  19. q创建群聊显示服务器繁忙是什么意思,一种堵车时聊天群的建立方法及系统
  20. #第一章 从数学拟合的角度看股市理论的预测环节--一、恼人的数学题

热门文章

  1. Arduino实验一:双色灯实验
  2. 2021年GitHub上那些优秀Android开源库总结,附大厂真题面经
  3. 收银系统源码收银系统OEM定制开发(POS+云端+聚合支付+灰度)
  4. 初识 QR 二维码(零)
  5. 逐浪CMS2 x3.9功能预览:头条号公众号接入功能助力中国站长流量变现
  6. kswapd0 引起 CPU高占用解决方法
  7. Python机器学习基础教程10
  8. 湘江智能密集获奖触发“散射效应”,加速长沙冲击“智能驾驶第一城”
  9. 前端模板引擎——handlebars
  10. 是谁在Go标准库的源码中植入了色情网站?