Codeforces 786B Legacy(线段树优化建图)
题目链接 Legacy
首先对于输入的$n$,建立一棵线段树。
显然线段树有大概$2n$个结点,每个节点对应一段区间
我们把这$2n$个结点加入我们的无向图中,一起跑最短路。
具体连边方案:
我们把这棵线段树复制一下,另外一棵倒过来。
首先第一棵线段树,每个结点向他的两个儿子连有向边,连到叶子结点的时候
叶子结点向原来的$n$个点连边
也就是说$[l, l]$向原来编号为$l$的这个点连边。
然后$1$到$n$这$n$个点分别向第二棵线段树的叶子结点分别连有向边
具体一点,$l$号点向$[l', l']$连边。
然后在第二棵线段树中,两个儿子向父亲连边,依次类推。
接着就是对给定的输入进行连边操作了。
对于点连向点的,普通操作就行了。
对于点连向区间的,把点连向第一棵线段树的结点。大概要连$logn$条边
对于区间连向点的,把第二棵线段树的结点连向这个点。大概也连$logn$条边
然后跑一边堆优化Dij就可以了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define ls (i << 1)
#define rs (i << 1 | 1)
#define mid ((L + R) >> 1)
#define lson ls, L, mid
#define rson rs, mid + 1, R typedef long long LL;
typedef pair <int, int> PII; const int N = 2e6 + 10; struct node{
int u;
LL w;
friend bool operator < (const node &a, const node &b){
return a.w > b.w;
}
}; map <PII, int> mp;
int tot = 0;
int n, q, s, cnt;
LL dis[N];
vector <node> v[N]; void addedge(int x, int y, LL z){
v[x].push_back({y, z});
} void build(int i, int L, int R){
cnt = max(cnt, i);
if (L == R){
addedge(i + n, L, 0);
return;
} build(lson);
build(rson);
addedge(i + n, ls + n, 0);
addedge(i + n, rs + n, 0);
} void build2(int i, int L, int R){
if (L == R){
addedge(L, i + n + cnt, 0);
return;
} build2(lson);
build2(rson);
addedge(ls + n + cnt, i + n + cnt, 0);
addedge(rs + n + cnt, i + n + cnt, 0);
} void work1(int i, int L, int R, int l, int r, int u, LL val){
if (l <= L && R <= r){
addedge(u, i + n, val);
return;
} if (l <= mid) work1(lson, l, r, u, val);
if (r > mid) work1(rson, l, r, u, val);
} void work2(int i, int L, int R, int l, int r, int u, LL val){
if (l <= L && R <= r){
addedge(i + n + cnt, u, val);
return;
} if (l <= mid) work2(lson, l, r, u, val);
if (r > mid) work2(rson, l, r, u, val);
} void dij(int s, LL dis[], vector <node> v[]){
priority_queue <node> q;
static bool vis[N];
rep(i, 1, 2e6) dis[i] = 1e18, vis[i] = false;
q.push({s, 0});
dis[s] = 0;
while (!q.empty()){
int u = q.top().u; q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto edge : v[u]) if (dis[u] + edge.w < dis[edge.u]){
dis[edge.u] = dis[u] + edge.w;
q.push({edge.u, dis[edge.u]});
}
}
} int main(){ scanf("%d%d%d", &n, &q, &s);
tot = n;
build(1, 1, n);
build2(1, 1, n); while (q--){
int op;
scanf("%d", &op);
if (op == 1){
int x, y;
LL z;
scanf("%d%d%lld", &x, &y, &z);
if (x == y) continue;
addedge(x, y, z);
}
else if (op == 2){
int u, l, r;
LL z;
scanf("%d%d%d%lld", &u, &l, &r, &z);
work1(1, 1, n, l, r, u, z);
} else{
int u, l, r;
LL z;
scanf("%d%d%d%lld", &u, &l, &r, &z);
work2(1, 1, n, l, r, u, z);
}
} dij(s, dis, v);
rep(i, 1, n) printf("%lld\n", (dis[i] < 1e18 ? dis[i] : -1));
return 0;
}
Codeforces 786B Legacy(线段树优化建图)的更多相关文章
- Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...
- CF786B Legacy 线段树优化建图 + spfa
CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给 ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- G. 神圣的 F2 连接着我们 线段树优化建图+最短路
这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...
- codeforces 787D - Legacy 线段树优化建图,最短路
题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...
- BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan
Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...
- 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流
[BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...
- 【ARC069F】Flags 2-sat+线段树优化建图+二分
Description 数轴上有 n 个旗子,第 ii 个可以插在坐标 xi或者 yi,最大化两两旗子之间的最小距离. Input 第一行一个整数 N. 接下来 N 行每行两个整数 xi, ...
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- 【bzoj4699】树上的最短路(树剖+线段树优化建图)
题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...
随机推荐
- 【线程池】ExecutorService与quartz搭配出现的问题
问题描述: 使用quartz定时推送微信公众号模板消息,一分钟推送一次,定时器里面使用了一个ExecutorService线程池,大小为5个. 批量获取数据之后,全部数据都被分配到n/5的线程池里面等 ...
- Python语言程序设计之二--用turtle库画围棋棋盘和正、余弦函数图形
这篇笔记依然是在做<Python语言程序设计>第5章循环的习题.其中有两类问题需要记录下来. 第一是如何画围棋棋盘.围棋棋盘共有19纵19横.其中,位于(0,0)的星位叫天元,其余8个星位 ...
- HDU 5396 区间DP 数学 Expression
题意:有n个数字,n-1个运算符,每个运算符的顺序可以任意,因此一共有 (n - 1)! 种运算顺序,得到 (n - 1)! 个运算结果,然后求这些运算结果之和 MOD 1e9+7. 分析: 类比最优 ...
- Java + golang 爬取B站up主粉丝数
自从学习了爬虫,就想在B站爬取点什么数据,最近看到一些个up主涨粉很快,于是对up主的粉丝数量产生了好奇,所以就有了标题~ 首先,我天真的以为通过up主个人空间的地址就能爬到 https://spac ...
- executing an update/delete query问题
是因为在做SpringDataJpa更新和删除操作的时候Repository层没有加事务的注解,加上就行了: @Transactional @Query(value = "update ms ...
- 深入理解Java虚拟机(精华总结)
作者:战斗民族就是干 转自:http://www.cnblogs.com/prayers/p/5515245.html 一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟 ...
- 软件工程师应该关注的web攻击手段
1.SQL注入------常见的安全性问题. 解决方案:前端页面需要校验用户的输入数据(限制用户输入的类型.范围.格式.长度),不能只靠后端去校验用户数据.一来可以提高后端处理的效率,二来可以提高后端 ...
- Java EE - Servlet 3.0 和 Spring MVC
Table of Contents 前言 基于 Java 的配置 ServletContainerInitializer 动态配置 DispatcherServlet 和 ContextLoaderL ...
- 项目记事【多线程】:关于 SimpledDateFormat 的多线程问题
背景: 最近项目引入了 SonarLink,解决代码规范的问题,在检查历史代码的时候,发现了一个问题. 先看代码: public class DateUtil { private static fin ...
- CSS3的writing-mode属性
writing-mode这个CSS属性以前是IE的独有属性,IE5.5浏览器就已经支持了.在很长一段时间里,FireFox, Chrome这些现代浏览器都不支持writing-mode,各大现代浏览器 ...