G. 神圣的 F2 连接着我们 线段树优化建图+最短路
时间:2019-08-20
本文章向大家介绍G. 神圣的 F2 连接着我们 线段树优化建图+最短路,主要包括G. 神圣的 F2 连接着我们 线段树优化建图+最短路使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这个题目和之前写的一个线段树优化建图是一样的。
B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路
之前这个题目可以相当于一个模板,直接套用就可以了。
不过注意为了提高效率,在区间与区间之间建边的时候建了两个虚点。
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <vector> #include <string> #include <algorithm> #include <iostream> #include <map> #define inf 0x3f3f3f3f #define inf64 0x3f3f3f3f3f3f3f3f using namespace std; typedef long long ll; const int maxn = 2e5 + 10; int numa[maxn * 4], numb[maxn * 4], lefta[maxn * 4], leftb[maxn * 4]; int start[maxn], endss[maxn]; ll d[maxn * 8], tot; int n, m, p, q; bool vis[maxn * 8]; struct edge { int from, to, dist; edge(int from = 0, int to = 0, int dist = 0) :from(from), to(to), dist(dist) {} }; struct heapnode { ll d; int u; heapnode(ll d = 0, int u = 0) : d(d), u(u) {} bool operator<(const heapnode &a) const { return a.d < d; } }; vector<edge> vec; vector<int> g[maxn * 8]; void add(int u, int v, int w) { vec.push_back(edge(u, v, w)); int m = vec.size(); g[u].push_back(m - 1); // printf("u=%d v=%d w=%d\n", u, v, w); } void dijkstra() { priority_queue<heapnode>que; for (int i = 0; i <= tot; i++) d[i] = inf64; for(int i=1;i<=q;i++) { int id = lefta[start[i] + n]; d[id] = 0; que.push(heapnode(0, id)); } memset(vis, 0, sizeof(vis)); while (!que.empty()) { heapnode x = que.top(); que.pop(); int u = x.u; // printf("u=%d\n", u); if (vis[u]) continue; vis[u] = 1; for (int i = 0; i < g[u].size(); i++) { edge &e = vec[g[u][i]]; // printf("u=%d e.to=%d e.dist=%d\n", u, e.to, e.dist); // printf("d[%d]=%lld d[%d]=%lld\n", u, d[u], e.to, d[e.to]); if (d[e.to] > d[u] + e.dist) { // printf("ww\n"); d[e.to] = d[u] + e.dist; // printf("d[%d]=%lld\n", e.to, d[e.to]); que.push(heapnode(d[e.to], e.to)); } } // printf("\n"); } } void builda(int id, int l, int r) { numa[id] = ++tot; int mid = (l + r) >> 1; if (l == r) { lefta[l] = tot; return; } builda(id << 1, l, mid); builda(id << 1 | 1, mid + 1, r); add(numa[id << 1], numa[id], 0); add(numa[id << 1 | 1], numa[id], 0); } void buildb(int id, int l, int r) { numb[id] = ++tot; int mid = (l + r) >> 1; if (l == r) { leftb[l] = tot; return; } buildb(id << 1, l, mid); buildb(id << 1 | 1, mid + 1, r); add(numb[id], numb[id << 1], 0); add(numb[id], numb[id << 1 | 1], 0); } void build3(int n) { for (int i = 1; i <= n; i++) add(leftb[i], lefta[i], 0); } void update(int id, int l, int r, int x, int y, vector<int>&d) { if (x <= l && y >= r) { d.push_back(id); return; } int mid = (l + r) >> 1; if (x <= mid) update(id << 1, l, mid, x, y, d); if (y > mid) update(id << 1 | 1, mid + 1, r, x, y, d); } vector<int>a, b; int main() { scanf("%d%d%d%d", &n, &m, &p, &q); builda(1, 1, 2 * n), buildb(1, 1, 2 * n), build3(2 * n); tot++; for (int i = 1; i <= m; i++) { int x1, y1, x2, y2, w; scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &w); a.clear(), b.clear(); update(1, 1, 2 * n, x1, y1, a); update(1, 1, 2 * n, x2 + n, y2 + n, b); int lena = a.size(), lenb = b.size(); for(int j=0;j<lena;j++) { int id = numa[a[j]]; add(id, tot, 0); } add(tot, tot + 1, w); for(int j=0;j<lenb;j++) { int id = numb[b[j]]; add(tot + 1, id, 0); } tot += 2; for(int j=0;j<lenb;j++) { int id = numa[b[j]]; add(id, tot, 0); } add(tot, tot + 1, w); for(int j=0;j<lena;j++) { int id = numb[a[j]]; add(tot + 1, id, 0); } tot += 2; } for (int i = 1; i <= p; i++) scanf("%d", &endss[i]); for (int i = 1; i <= q; i++) scanf("%d", &start[i]); dijkstra(); ll ans = 0; for(int i=1;i<=p;i++) { int id = lefta[endss[i]]; ans = max(ans, d[id]); } if (ans >= inf64) printf("boring game\n"); else printf("%lld\n", ans); return 0; }
原文地址:https://www.cnblogs.com/EchoZQN/p/11385589.html
- 分享一个Linux无法创建文件夹,但是目录权限却显示正常的问题和解决
- 桌面白屏(Active故障)修复批处理
- ASM 翻译系列第十三弹:ASM 高级知识 - Forcing the issue
- ASM 翻译系列第十四弹:ASM Internal Rebalancing act
- DIY网站统计:WordPress排除管理员评论及精准友链数的方法
- Linux运维工程师:30道面试题整理
- ASM 翻译系列第十五弹:ASM Internal ASM File Directory
- ASM 翻译系列第十六弹:ASM Internal ASM Active Change Directory
- ASM 翻译系列第十七弹:ASM Internal ASM Disk Directory
- Windows 7下获取System权限
- ASM 翻译系列第十八弹:ASM Internal ASM file number 5
- 菜单式Shell运维脚本调试小记
- 优化Postgres-x2 GTM
- 启用某些Linux发行版的root帐号
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mybatis逆向工程
- ssm之spring+springmvc+mybatis整合初探
- mybatis插件开发小例子
- java之如何在eclipse中新建对象时自动补全
- mybatis文件映射之当输入的参数不只一个时
- mybatis插件开发初探
- 剑指offer(25-30)题解
- 如何实时迁移MySQL到TcaplusDB
- 如何利用Terraform工具编排管理TcaplusDB
- 如何实时迁移AWS DynamoDB到TcaplusDB
- 腾讯云TcaplusDB基础能力介绍
- 游戏架构上云实战
- 【JUC】CyclicBarrier的了解和使用
- 完美解决-RuntimeError: CUDA error: device-side assert triggered
- springmvc之异常处理SimpleMappingExceptionResolver