CF786B Legacy && 线段树优化连边
线段树优化连边
要求点 \(x\) 向区间 \([L, R]\) 连边, 一次的复杂度上限为  \(O(n)\)
然后弄成线段树的结构

先父子连边边权为 \(0\)
这样连边就只需要连父亲就可以等效于连了区间内每个点
空间复杂度为线段树大小, 一次区间连边时间复杂度为 \(O(\log n)\)
这是连入边, 连出边的话反向建线段树内边即可
CF786B Legacy
默认情况下他不能用这把枪开启任何传送门。在网络上有q个售卖这些传送枪的使用方案。每一次你想要实施这个方案时你都可以购买它,但是每次购买后只能使用一次。每个方案的购买次数都是无限的。
网络上一共有三种方案可供购买: 1.开启一扇从星球v到星球u的传送门; 2.开启一扇从星球v到标号在[l,r]区间范围内任何一个星球的传送门。(即这扇传送门可以从一个星球出发通往多个星球) 3.开启一扇从标号在[l,r]区间范围内任何一个星球到星球v的传送门。(即这扇传送门可以从多个星球出发到达同一个星球)
Rick并不知道Morty在哪儿,但是Unity将要通知他Morty的具体位置,并且他想要赶快找到通往所有星球的道路各一条并立刻出发。因此对于每一个星球(包括地球本身)他想要知道从地球到那个星球所需的最小钱数。
Solution
线段树优化连边即可
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long
#define REP(i, x, y) for(LL i = (x);i <= (y);i++)
using namespace std;
LL RD(){
    LL out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const LL maxn = 100019 << 2, inf = 0xfffffffffffffff;
LL head[maxn],nume = 1;
struct Node{
    LL v,dis,nxt;
    }E[maxn << 3];
void add(LL u,LL v,LL dis){
    E[++nume].nxt = head[u];
    E[nume].v = v;
    E[nume].dis = dis;
    head[u] = nume;
    }
LL num, nr, s;
#define lid (id << 1)
#define rid (id << 1) | 1
LL tot;
struct seg_tree{
	LL l, r;
	LL Index[2];
	}tree[maxn << 2];
void build(LL id, LL l, LL r){
	tree[id].l = l, tree[id].r = r;
	if(l == r){
		tree[id].Index[0] = tree[id].Index[1] = l;
		return ;
		}
	tree[id].Index[0] = ++tot;//入边
	tree[id].Index[1] = ++tot;//out
	LL mid = (l + r) >> 1;
	build(lid, l, mid), build(rid, mid + 1, r);
	add(tree[id].Index[0], tree[lid].Index[0], 0);
	add(tree[id].Index[0], tree[rid].Index[0], 0);
	add(tree[lid].Index[1], tree[id].Index[1], 0);
	add(tree[rid].Index[1], tree[id].Index[1], 0);
	}
void IG(LL id, LL u, LL dis, LL l, LL r, LL o){//0 --> in, 1 --> out
	if(tree[id].l == l && tree[id].r == r){
		if(o == 2)add(u, tree[id].Index[0], dis);
		else add(tree[id].Index[1], u, dis);
		return ;
		}
	LL mid = (tree[id].l + tree[id].r) >> 1;
	if(mid < l)IG(rid, u, dis, l, r, o);
	else if(mid >= r)IG(lid, u, dis, l, r, o);
	else IG(lid, u, dis, l, mid, o), IG(rid, u, dis, mid + 1, r, o);
	}
void init(){
	num = RD(), nr = RD(), s = RD();
	tot = num;
	build(1, 1, num);
	REP(i, 1, nr){
		LL cmd = RD(), u = RD();
		if(cmd == 1){
			LL v = RD(), dis = RD();
			add(u, v, dis);
			}
		else{
			LL l = RD(), r = RD(), dis = RD();
			IG(1, u, dis, l, r, cmd);
			}
		}
	}
LL d[maxn];
bool vis[maxn];
void Djs(LL s){
	REP(i, 1, tot)d[i] = inf;
	priority_queue<pair<LL, LL> >Q;
	d[s] = 0;
	Q.push(make_pair(-d[s], s));
	while(!Q.empty()){
		LL u = Q.top().second;Q.pop();
		if(vis[u])continue;
		vis[u] = 1;
		for(LL i = head[u];i;i = E[i].nxt){
			LL v = E[i].v, dis = E[i].dis;
			if(d[u] + dis < d[v]){
				d[v] = d[u] + dis;
				Q.push(make_pair(-d[v], v));
				}
			}
		}
	}
void solve(){
	Djs(s);
	REP(i, 1, num){
		if(d[i] == inf)printf("-1 ");
		else printf("%lld ", d[i]);
		}
	puts("");
	}
int main(){
	init();
	solve();
	return 0;
	}
												
											CF786B Legacy && 线段树优化连边的更多相关文章
- CF786B Legacy 线段树优化建图 + spfa
		
CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给 ...
 - CF786B Legacy  线段树优化建图
		
问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...
 - [CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)
		
Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 ...
 - Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)
		
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...
 - B - Legacy CodeForces - 787D  线段树优化建图+dij最短路 基本套路
		
B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...
 - G. 神圣的 F2 连接着我们  线段树优化建图+最短路
		
这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...
 - DS线段树优化最短路&&01bfs浅谈
		
1简介 为什么需要?原因很简单,当需要有大量的边去连时,用线段树优化可以直接用点连向区间,或从区间连向点,或从区间连向区间,如果普通连边,复杂度是不可比拟的.下面简单讲解一下线段树(ST)优化建图. ...
 - [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)
		
题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...
 - Weak Pair---hud5877大连网选(线段树优化+dfs)
		
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 题意:给你一颗树,有n个节点,每个节点都有一个权值v[i]:现在求有多少对(u,v ...
 
随机推荐
- linux及安全第八周总结
			
进程的调度时机与进程的切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调 ...
 - 《蹭课神器》Beta版使用说明
			
相比 Alpha 版,我对主界面进行了优化,使主界面更加简洁 同时数据库增加了一个表,里面存放的是课程的详细信息
 - Sprint 冲刺第三阶段第3-5天
			
陈汝婷:数据库的实现 具体实现用户登录在数据库中查找,用户注册的时候可以将用户的具体信息存放于SD卡中.刚学Android的数据库的数据库,还有一些问题.所以这个问题一直拖了几天才解决.问老师问同学, ...
 - beanutils的使用
			
在项目进行中,使用到beanutils时发现1.9.X以上版本搭配logging搭配使用用不了,实在搞不明白.----stackoverflow提问吧 BeanUtils工具由Apache软件基金组织 ...
 - K3CLOUD新增用户
			
1.在金蝶云之家对应的产品序列中新增用户 2.在CLOUD本地查询用户-同步注册用户后,云平台用户会同步至本地
 - 如何判断一条记录什么字段被修改了 [问题点数:40分,结帖人bluesukeke]
			
查询出来数据,在数据集编辑状态下,如何判断一条记录被修改了,哪些字段被修改了. 可用adoquery的Delta屬性...eg: ClientDataSet1.Delta... PS:POST前是準確 ...
 - caffe配置NCCL
			
设置Makefile.config 打开开关: USE_NCCL := 1, 并添加nccl库路径 USE_NCCL := 1 INCLUDE_DIRS += /path/nccl/build/inc ...
 - 51nod 1092(lcs)回文字符串
			
题目:给你一个字符串,问添加最少的字符数目,使之成为回文串 解题思路:将字符串倒置,求出字符串和倒置串的最长公共子序列,字符串的长度减去lcs的长度就是了.. 代码:#include<iostr ...
 - 最新更新的Windows 10切换蓝牙连接开关会导致蓝屏死机
			
目前已经升级到 Windows 10 Version 1809 版的用户们正在努力发掘新版本还没有被公开发现的错误问题. 比如此前的.ZIP 格式的压缩包解压时无法正常替换,微软已承认该问题并称将在后 ...
 - golang的interface剖析
			
背景: golang的interface是一种satisfied式的.A类只要实现了IA interface定义的方法,A就satisfied了接口IA.更抽象一层,如果某些设计上需要一些更抽象的 ...