给定n颗行星,q次处理,地球位置为s,求解在q次处理后,地球到每一颗行星的位置。

其中q有三种不同的操作:

  1. 输入v,u,wv,u,w,构建一条从vv到uu的代价为ww的路线

  2. 输入u,l,r,wu,l,r,w,构建一条从uu到区间[l,r][l,r]中任意一颗行星的代价为ww的路线

  3. 输入u,l,r,wu,l,r,w,构建区间[l,r]中任意一颗行星到uu的代价为ww的路线

建立两颗线段树,一颗记录操作2中其他点AOE到这些点的区间,一颗记录所有点单独到一个节点的路径,把线段树上的点单独作为一个节点来维护,偷了一个很好的图来表达

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
#define For(i, x, y) for(int i=x; i<=y; i++)
#define Mem(f, x) memset(f, x, sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Pri(x) printf("%d\n", x)
#define CLR(u) for(int i = 0; i <= N ; i ++) u[i].clear();
#define LL long long
#define mp make_pair
#define PI pair<int,int>
#define PIL pair<int,long long>
#define PLI pair<long long,int>
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef vector<int> VI;
const int maxn = 1e5 + 10;
const int maxm = 3e5 + 10;
const LL INF = 1e18 + 10;
const int mod = 1e9 + 7;
inline int read()
{int now=0;register char c=getchar();for(;!isdigit(c);c=getchar());for(;isdigit(c);now=now*10+c-'0',c=getchar());return now;
}
struct Tree
{int left,right;int lr,rr;
}tree[maxm];
int N,M;
int Q,S;
int tot;
vector<PIL> P[maxm];
LL dis[maxm];
bool vis[maxm];
int Build(int left,int right,int flag)
{if(left == right) return left;int root = ++tot;tree[root].left = left; tree[root].right = right;int mid = (left + right) / 2;tree[root].lr = Build(left,mid,flag);tree[root].rr = Build(mid + 1,right,flag);if(flag){P[root].pb(mp(tree[root].lr,0));P[root].pb(mp(tree[root].rr,0));}else{P[tree[root].lr].pb(mp(root,0));P[tree[root].rr].pb(mp(root,0));}return root;
}
void update(int v,int l,int r,int root,int flag,LL w)
{if(l == r){if(flag) P[v].pb(mp(l,w));else P[l].pb(mp(v,w));return;}if(l <= tree[root].left && tree[root].right <= r){if(flag) P[v].pb(mp(root,w));else P[root].pb(mp(v,w));return;}int mid = (tree[root].left + tree[root].right) >> 1;if(r <= mid) update(v,l,r,tree[root].lr,flag,w);else if(l > mid) update(v,l,r,tree[root].rr,flag,w);else{update(v,l,mid,tree[root].lr,flag,w);update(v,mid + 1,r,tree[root].rr,flag,w);}}
void Dijkstra(int start){Mem(vis,0);for(int i = 1; i <= tot; i ++){dis[i] = INF;}dis[start] = 0;priority_queue<PLI,vector<PLI>,greater<PLI>>Q;Q.push(mp(0,start));while(!Q.empty()){PLI u = Q.top(); Q.pop();if(vis[u.se]) continue;vis[u.se] = 1;for(int j = 0 ; j < P[u.se].size(); j ++){PIL v = P[u.se][j];if(!vis[v.fi] && dis[v.fi] > dis[u.se] + v.se){dis[v.fi] = dis[u.se] + v.se;Q.push(mp(dis[v.fi],v.fi));}}}
}int main()
{N = read(); Q = read(); S = read();tot = N;int L = Build(1,N,0);int R = Build(1,N,1);For(i,1,Q){int op = read() , v = read();LL w;if(op == 1){int u = read();scanf("%lld",&w);P[v].pb(mp(u,w));}else if(op == 2){int l = read(); int r = read();scanf("%lld",&w);update(v,l,r,R,1,w);}else{int l = read(); int r = read();scanf("%lld",&w);update(v,l,r,L,0,w);}}
/*    For(i,N + 1,tot){printf("%d   : %d %d\n",i,tree[i].left,tree[i].right);}For(i,1,tot){printf("%d : ",i);for(int j = 0 ; j < P[i].size(); j ++){printf("%d ",P[i][j]);}printf("\n");} */Dijkstra(S);For(i,1,N){if(dis[i] == INF) dis[i] = -1;printf("%lld ",dis[i]);}return 0;
} 

转载于:https://www.cnblogs.com/Hugh-Locke/p/9499677.html

CodeForces786B 线段树 + 最短路相关推荐

  1. P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】

    正题 题目链接:https://www.luogu.com.cn/problem/P4083 题目大意 开始时AAA和BBB各有两个礼物,每个礼物对两个人有不同的价值,开始时AAA会送BBB一个礼物. ...

  2. Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  3. 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

    「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...

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

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

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

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

  6. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

  7. P6348-[PA2011]Journeys【线段树优化建图,最短路】

    正题 题目链接:https://www.luogu.com.cn/problem/P6348 题目大意 nnn个点的一张图,mmm条边表示区间[a,b][a,b][a,b]向区间[c,d][c,d][ ...

  8. P2685 [TJOI2012]桥(最短路+线段树)

    P2685 [TJOI2012]桥 xcxcli题解 下面思路仿照上述题解,代码基本照抄上述题解 u⇝vu\leadsto vu⇝v表示uuu到vvv的最短路 u→vu\to vu→v表示uuu和vv ...

  9. CodeForces - 786BLegacy——线段树建图+最短路

    [题目描述] CodeForces - 786BLegacy [题目分析] 题目大概意思就是有三种操作: 从某个点到另一个点 从某个点到另一个区间 从某个区间到另一个点 然后询问从其中一个点到其他所有 ...

最新文章

  1. 下载apk文件之后变成zip的解决办法
  2. 使用cmake重写live555工程-附源码和视频教程
  3. android中控制ListView宽度和高度
  4. 华为鸿蒙智慧屏评价,华为智慧屏 S真实感受曝光评测,不看后悔死了!
  5. shell tr 替换 空格_Shell 字符串分隔符!!!(全网最详细总结)
  6. 一文理解Netty模型架构
  7. Intellij idea 快键键
  8. 如何在Eclipse中添加Servlet-api.jar的方法
  9. SAP系统企业内部安全审计介绍
  10. java学习软件_刚学习java,用哪些学习软件比较好?
  11. mysql数据库repair_MySQL数据库中的REPAIRTABLE语法介绍
  12. select2 api参数中文文档
  13. 8.局部变量、成员变量、jvm垃圾回收机制 、封装、this关键字、匿名对象
  14. C# 源代码+ SQLserver数据库点餐软件
  15. 项目延期,不重视过程项目团队将自食其果
  16. ISV 和SI 是什么
  17. 修改linux xorg端口,Xorg服务开启tcp/ip监听,允许其它机器客户端连接
  18. Java Swing写简单计算器以及拓展贷款计算器(等额本息和等额本金计算可以单独拿出来用)
  19. 《合成孔径雷达成像——算法与实现》之【1】仿真图2.2
  20. 新AlphaGo首度揭秘:单机运行,4个TPU,算法更强(专访+演讲)

热门文章

  1. 我和奇葩的故事之失联第七天
  2. mybatis 一二事(1) - 简单介绍
  3. python学习手册笔记——22.模块代码编写基础
  4. InstallShield打包设置相对路径
  5. 用tomcat插件 在Eclipse 中配置Tomcat项目
  6. javascript数字千分位格式化
  7. 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。...
  8. 使用mss2sql将SqlServer转换为Mysql
  9. Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp
  10. android版本号和对应的API等级