CodeForces 786B

Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们。因此Rick想在坏人们捉到他之前把他的遗产留给Morty。

在宇宙中一共有n个星球标号为1到n。Rick现在身处于标号为s的星球(地球)但是他不知道Morty在哪里。众所周知,Rick有一个传送枪,他用这把枪可以制造出一个从他所在的星球通往其他星球(也包括自己所在的星球)的单行道路。但是由于他还在用免费版,因此这把枪的使用是有限制的。

默认情况下他不能用这把枪开启任何传送门。在网络上有q个售卖这些传送枪的使用方案。每一次你想要实施这个方案时你都可以购买它,但是每次购买后只能使用一次。每个方案的购买次数都是无限的。

网络上一共有三种方案可供购买: 1.开启一扇从星球v到星球u的传送门; 2.开启一扇从星球v到标号在[l,r]区间范围内任何一个星球的传送门。(即这扇传送门可以从一个星球出发通往多个星球) 3.开启一扇从标号在[l,r]区间范围内任何一个星球到星球v的传送门。(即这扇传送门可以从多个星球出发到达同一个星球)

Rick并不知道Morty在哪儿,但是Unity将要通知他Morty的具体位置,并且他想要赶快找到通往所有星球的道路各一条并立刻出发。因此对于每一个星球(包括地球本身)他想要知道从地球到那个星球所需的最小钱数。

输入数据: 输入数据的第一行包括3个整数n,q和s(1<=n,q<=10^5,1<=s<=n)分别表示星球的数目,可供购买的方案数目以及地球的标号。

接下来的q行表示q种方案。 1.输入1 v u w表示第一种方案,其中v,u意思同上,w表示此方案价格。 2.输入2 v l r w表示第二种方案,其中v,l,r意思同上,w表示此方案价格。 2.输入3 v l r w表示第三种方案,其中v,l,r意思同上,w表示此方案价格。 (1<=v,u,l,r<=n,1<=w<=10^9)

输出格式: 输出一行用空格隔开的n个整数分别表示从地球到第i个星球所需的最小钱数。

说明: 在第一组测试样例里,Rick可以先购买第4个方案再购买第2个方案从而到达标号为2的星球.

题解:

线段树优化建图模板题

建立两颗线段树,这两颗线段树共用编号相同的叶子节点

在线段树对应区间上连一连就好了

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 4000000
#define inf 100000000000000
#define lson t[now].ls
#define rson t[now].rs
#define ll long long
using namespace std;
struct Data {
int ls,rs,l,r;
}t[maxn];
queue<int>Q;
int n,q,s,rtin,rtout,cnt,edges;
int hd[maxn],to[maxn],nex[maxn];
ll val[maxn],dis[maxn];
int inq[maxn];
void addedge(int u,int v,ll c) {
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
int newnode() {
return ++cnt;
}
namespace In {
void build(int l,int r,int &now) {
if(l==r) {
now=l;
return;
}
int mid=(l+r)>>1;
now=newnode(), t[now].l=l, t[now].r=r;
build(l,mid,lson), addedge(now,lson,0);
if(r>mid) build(mid+1,r,rson), addedge(now,rson,0);
}
void Add(int l,int r,int now,int L,int R,int c) {
if(l>=L&&r<=R) {
addedge(c,now,0);
return;
}
int mid=(l+r)>>1;
if(L<=mid) Add(l,mid,lson,L,R,c);
if(R>mid) Add(mid+1,r,rson,L,R,c);
}
};
namespace Out {
void build(int l,int r,int &now) {
if(l==r) {
now=l;
return;
}
int mid=(l+r)>>1;
now=newnode(), t[now].l=l, t[now].r=r;
build(l,mid,lson), addedge(lson,now,0);
if(r>mid) build(mid+1,r,rson), addedge(rson,now,0);
}
void Add(int l,int r,int now,int L,int R,int c) {
if(l>=L&&r<=R) {
addedge(now,c,0);
return;
}
int mid=(l+r)>>1;
if(L<=mid) Add(l,mid,lson,L,R,c);
if(R>mid) Add(mid+1,r,rson,L,R,c);
}
};
void Addedge(int l1,int r1,int l2,int r2,ll delta) {
int p1=newnode(), p2=newnode();
addedge(p1,p2,delta);
Out::Add(1,n,rtout,l1,r1,p1);
In::Add(1,n,rtin,l2,r2,p2);
}
void spfa() {
for(int i=0;i<maxn;++i) dis[i]=inf;
Q.push(s), dis[s]=0,inq[s]=1;
while(!Q.empty()) {
int u=Q.front(); Q.pop();
inq[u]=0;
for(int i=hd[u];i;i=nex[i]) {
int v=to[i];
if(dis[v] > dis[u]+val[i]) {
dis[v]=dis[u]+val[i];
if(!inq[v])
Q.push(v), inq[v]=1;
}
}
}
}
int main() {
// setIO("input");
scanf("%d%d%d",&n,&q,&s);
cnt=n, In::build(1,n,rtin), Out::build(1,n,rtout);
for(int i=1;i<=q;++i) {
int opt,l1,r1,l2,r2,w;
scanf("%d",&opt);
if(opt==1) scanf("%d%d",&l1,&l2),r1=l1,r2=l2;
if(opt==2) scanf("%d%d%d",&l1,&l2,&r2),r1=l1;
if(opt==3) scanf("%d%d%d",&l2,&l1,&r1),r2=l2;
scanf("%d",&w);
Addedge(l1,r1,l2,r2,1ll*w);
}
spfa();
for(int i=1;i<=n;++i) printf("%I64d ",dis[i]==inf?-1:dis[i]);
return 0;
}

  

CF786B Legacy 线段树优化建图 + spfa的更多相关文章

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

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

  2. 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 ...

  3. CF786B Legacy 线段树优化建图

    问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...

  4. G. 神圣的 F2 连接着我们 线段树优化建图+最短路

    这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...

  5. BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan

    Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...

  6. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

  7. 【ARC069F】Flags 2-sat+线段树优化建图+二分

    Description ​ 数轴上有 n 个旗子,第 ii 个可以插在坐标 xi或者 yi,最大化两两旗子之间的最小距离. Input ​ 第一行一个整数 N. ​ 接下来 N 行每行两个整数 xi, ...

  8. 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序

    题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆.  现在 ...

  9. 【bzoj4699】树上的最短路(树剖+线段树优化建图)

    题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...

随机推荐

  1. CSS3—— 多列 用户界面 图片 按钮

    多列 将文本内容设计成像报纸一样的多列布局 多列创建 间隙 列边框 边框颜色+宽度 指定列的宽度 指定元素跨越多少列 用户界面 由用户调整元素大小[谷歌浏览器等] 以确切的方式定义适应某个区域的具体内 ...

  2. 应用安全 - 工具 - freefloatftpserver - 漏洞汇总

    Freefloat FTP Server 1.0 Date 类型栈溢出导致远程代码执行 复现(1)启动服务 (2)FTP连接(账号密码任意) 分析(1)正常运行调试 (1)pwntools发送expl ...

  3. 【Qt开发】Qt测试计算时间

    方法1 利用QTime,其精度为ms级 </pre><pre code_snippet_id="1852215" snippet_file_name=" ...

  4. springboot项目中使用maven resources

    maven resource 组件可以把pom的变量替换到相关的resouces目录中的资源文件变量 示例项目:内容中心 (文章管理)  生成jar包,生成docker ,生成k8s文件 1.项目结构 ...

  5. P1182 数列分段`Section II` 二分

    https://www.luogu.org/problemnew/show/P1182 做了这个题才知道二分的强大 这个题可以假设我们有n个果子 m个容器 要能把果子全装进去 那么容器最小可以是多小 ...

  6. 记:第一次更新服务器CUDA和GPU驱动

    因有需求需要改动centos7中的CUDA(更新到10)和GUP 的driver(更新到410)的版本. 事先需要查看原版本的信息,使用nvidia-smi可以查看driver的版本信息(最新的也显示 ...

  7. tensorflow学习笔记二----------变量

    tensorflow里面的变量表示,需要使用特定的语法进行.如果想构造一个行(列)向量,需要调用Variable函数进行.对两个变量进行操作,也要调用相应的函数. import tensorflow ...

  8. org.apache.httpcomponents:httpclient 工具类

    基于httpclient 版本4.4.1 因为http连接需要三次握手,在需要频繁调用时浪费资源和时间 故采用连接池的方式连接 根据实际需要更改  连接池最大连接数.路由最大连接数 另一个需要注意的是 ...

  9. Let's encrypt 通配域名DNS验证方式的证书自动更新

    通配符域名不同于一般的单域名证书. 为了解决之前一篇短文中通配域名通过DNS方式验证的证书自动更新问题. 需要使用到第三方域名提供商的API, 用于自动添加域名的TXT记录, 实现自动验证并完成证书更 ...

  10. FFmpeg SDK开发模型之中的一个:解码器

    简单介绍 本例解说了怎样使用ffmpeg SDK解码媒体文件: 參考源代码是ffmpeg 自带的apiexample.c 一.源代码#include <stdlib.h>#include ...