这个题目和之前写的一个线段树优化建图是一样的。

B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路

之前这个题目可以相当于一个模板,直接套用就可以了。

不过注意为了提高效率,在区间与区间之间建边的时候建了两个虚点。

题目 G. 神圣的 F2 连接着我们

#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 + ;
int numa[maxn * ], numb[maxn * ], lefta[maxn * ], leftb[maxn * ];
int start[maxn], endss[maxn];
ll d[maxn * ], tot;
int n, m, p, q;
bool vis[maxn * ];
struct edge {
int from, to, dist;
edge(int from = , int to = , int dist = ) :from(from), to(to), dist(dist) {}
};
struct heapnode {
ll d;
int u;
heapnode(ll d = , int u = ) : d(d), u(u) {}
bool operator<(const heapnode &a) const {
return a.d < d;
}
}; vector<edge> vec;
vector<int> g[maxn * ]; void add(int u, int v, int w) {
vec.push_back(edge(u, v, w));
int m = vec.size();
g[u].push_back(m - );
// printf("u=%d v=%d w=%d\n", u, v, w);
} void dijkstra() {
priority_queue<heapnode>que;
for (int i = ; i <= tot; i++) d[i] = inf64;
for(int i=;i<=q;i++)
{
int id = lefta[start[i] + n];
d[id] = ;
que.push(heapnode(, id));
}
memset(vis, , 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] = ;
for (int i = ; 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) >> ;
if (l == r) {
lefta[l] = tot;
return;
}
builda(id << , l, mid);
builda(id << | , mid + , r);
add(numa[id << ], numa[id], );
add(numa[id << | ], numa[id], );
} void buildb(int id, int l, int r) {
numb[id] = ++tot;
int mid = (l + r) >> ;
if (l == r) {
leftb[l] = tot;
return;
}
buildb(id << , l, mid);
buildb(id << | , mid + , r);
add(numb[id], numb[id << ], );
add(numb[id], numb[id << | ], );
} void build3(int n) {
for (int i = ; i <= n; i++) add(leftb[i], lefta[i], );
} 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) >> ;
if (x <= mid) update(id << , l, mid, x, y, d);
if (y > mid) update(id << | , mid + , r, x, y, d);
}
vector<int>a, b;
int main()
{
scanf("%d%d%d%d", &n, &m, &p, &q);
builda(, , * n), buildb(, , * n), build3( * n);
tot++;
for (int i = ; 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(, , * n, x1, y1, a);
update(, , * n, x2 + n, y2 + n, b);
int lena = a.size(), lenb = b.size();
for(int j=;j<lena;j++)
{
int id = numa[a[j]];
add(id, tot, );
}
add(tot, tot + , w);
for(int j=;j<lenb;j++)
{
int id = numb[b[j]];
add(tot + , id, );
}
tot += ;
for(int j=;j<lenb;j++)
{
int id = numa[b[j]];
add(id, tot, );
}
add(tot, tot + , w);
for(int j=;j<lena;j++)
{
int id = numb[a[j]];
add(tot + , id, );
}
tot += ;
}
for (int i = ; i <= p; i++) scanf("%d", &endss[i]);
for (int i = ; i <= q; i++) scanf("%d", &start[i]);
dijkstra();
ll ans = ;
for(int i=;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 ;
}

G. 神圣的 F2 连接着我们 线段树优化建图+最短路的更多相关文章

  1. CodeForces 786B Legacy(线段树优化建图+最短路)

    [题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...

  2. Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)

    题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...

  3. 【BZOJ4276】[ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流

    [BZOJ4276][ONTAK2015]Bajtman i Okrągły Robin Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2 ...

  4. BZOJ_4276_[ONTAK2015]Bajtman i Okrągły Robin_线段树优化建图+最大费用最大流

    BZOJ_4276_[ONTAK2015]Bajtman i Okrągły Robin_线段树优化建图+最大费用最大流 Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1 ...

  5. 洛谷3783 SDOI2017 天才黑客(最短路+虚树+边转点+线段树优化建图)

    成功又一次自闭了 怕不是猪国杀之后最自闭的一次 一看到最短路径. 我们就能推测这应该是个最短路题 现在考虑怎么建图 根据题目的意思,我们可以发现,在本题中,边与边之间存在一些转换关系,但是点与点之间并 ...

  6. 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)

    题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...

  7. Nowcoder Hash Function ( 拓扑排序 && 线段树优化建图 )

    题目链接 题意 : 给出一个哈希表.其避免冲突的方法是线性探测再散列.现在问你给出的哈希表是否合法.如果合法则输出所有元素插入的顺序.如果有多解则输出字典序最小的那一个.如果不合法则输出 -1 分析 ...

  8. bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...

  9. 7月13日考试 题解(DFS序+期望+线段树优化建图)

    T1 sign 题目大意:给出一棵 N 个节点的树,求所有起点为叶节点的有向路径,其 上每一条边权值和的和.N<=10000 水题.考试的时候毒瘤出题人(学长orz)把读入顺序改了一下,于是很多 ...

随机推荐

  1. mysql截取函数常用方法 即mysql 字符串 截取-- - 最后带上java字符串截取规则比较

    常用的mysql截取函数有:left(), right(), substring(), substring_index() 下面来一一说明一下: 1.左截取left(str, length) 说明:l ...

  2. 如何使用Swagger-UI在线生成漂亮的接口文档

    一.简单介绍 Swagger是一个实现了OpenAPI(OpenAPI Specification)规范的工具集.OpenAPI是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API ...

  3. 【Java】Array 数组

    概述 数组是多个相同数据类型按一定顺序排列的一组数据 特点: - 数据类型相同!! - 长度固定!! 构成数组的几个要素 - 数组名称 - 下标,又称索引 - 元素 - 数组长度 数组是一种引用类型, ...

  4. 如何使用Three.js加载obj和mtl文件

    OBJ和MTL是3D模型的几何模型文件和材料文件. 在最新的three.js版本(r78)中,以前的OBJMTLLoader类已废弃. 现在要加载OBJ和MTL文件,需要结合OBJLoader和MTL ...

  5. 11. this.setState更新问题

    this.setState是异步的,所以在this.setState之后不能立刻得到最新的state数据关于如何获取最新的数据,有如下三种方法 1.回调函数 this.setState({ xxx:' ...

  6. PHP代码审计理解(三)---EMLOG某插件文件写入

    此漏洞存在于emlog下的某个插件---友言社会化评论1.3. 我们可以看到, uyan.php 文件在判断权限之前就可以接收uid参数.并且uid未被安全过滤即写入到了$uyan_code中. 我们 ...

  7. [HTML] <base>链接默认打开方式标签元素

    HTML 超链接(锚文本)默认打开方式与默认链接URL地址标签元素 一.语法与结构 <base target="_blank" href="http://www.l ...

  8. RSA非对称可逆加密

    /// <summary> /// RSA ECC /// 可逆非对称加密 /// 非对称加密算法的优点是密钥管理很方便,缺点是速度慢. /// </summary> usin ...

  9. Java中StringBuffer类

    StringBuffer: 线程安全的可变字符串. StringBuffer和String的区别?前者长度和内容可变,后者不可变.如果使用前者做字符串的拼接,不会浪费太多的资源. StringBuff ...

  10. pytorch中CUDA类型的转换

    import torch import numpy as np device = torch.device("cuda:0" if torch.cuda.is_available( ...