Description

\(n(n\leq10^5)\)个点构成的有向图,有\(m(m\leq10^5)\)条连通信息,信息有三种:

  • 1 u v w,表示存在一条边权为\(w\)的有向边\((u,v)\);
  • 2 u L R w,表示\(\forall v\in[L,R]\),存在一条边权为\(w\)的有向边\((u,v)\);
  • 3 u L R w,表示\(\forall v\in[L,R]\),存在一条边权为\(w\)的有向边\((v,u)\)。

其中\(w\leq10^9\)。求点\(s\)到每个点的最短路,不存在输出\(-1\)。

Solution

线段树优化建图。

建立两棵线段树,其上点的点权分别表示“到达这个区间内所有点的最小花费”和“到达这个区间内任意一个点的最小花费”。



第一棵线段树上,由于花费\(v_{[L,R]}\)能够到达\([L,R]\)中所有点,当然也包含\([L,mid]\)和\([mid+1,R]\),所以父节点向子节点连0边;第二棵线段树上,由于花费\(v_{[L,R]}\)能够到达\([L,R]\)中的一个点,这个点当然也包含在其父节点中,所以子节点向父节点连0边。

如果不做感性理解的话,两棵线段树上的点分别用于连和被连,连向第一棵树上的\([L,R]\)就等价于连向\([L,R]\)中的每一个点,被第二棵树上的\([L,R]\)连就等价于被\([L,R]\)中的每一个点连。

由于每一条信息最多建立\(O(logn)\)条边,所以总边数是\(O(mlogn+4n)\)。

建完图后直接跑一遍单源最短路就好啦。

Code

//Legacy
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long lint;
inline char gc()
{
static char now[1<<16],*s,*t;
if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
return *s++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
inline int min(int x,int y) {return x<y?x:y;}
const int N=1e5+10;
int n,m,s;
const int N1=3e5+110;
int cnt,rt1,rt2,ch[N1][2];
int h[N1],edCnt;
struct edge{int v,w,nxt;} ed[N*20];
inline void edAdd(int u,int v,int w)
{
edCnt++; ed[edCnt].v=v,ed[edCnt].w=w;
ed[edCnt].nxt=h[u],h[u]=edCnt;
}
void bldTr1(int &p,int L0,int R0)
{
if(L0==R0) {p=L0; return;}
p=++cnt;
int mid=L0+R0>>1;
bldTr1(ch[p][0],L0,mid);
bldTr1(ch[p][1],mid+1,R0);
edAdd(p,ch[p][0],0),edAdd(p,ch[p][1],0);
}
void bldTr2(int &p,int L0,int R0)
{
if(L0==R0) {p=L0; return;}
p=++cnt;
int mid=L0+R0>>1;
bldTr2(ch[p][0],L0,mid);
bldTr2(ch[p][1],mid+1,R0);
edAdd(ch[p][0],p,0),edAdd(ch[p][1],p,0);
}
int optL,optR;
void add(int p,int L0,int R0,int u,int w,int type)
{
if(optL<=L0&&R0<=optR)
{
if(type==2) edAdd(u,p,w); else edAdd(p,u,w);
return;
}
int mid=L0+R0>>1;
if(optL<=mid) add(ch[p][0],L0,mid,u,w,type);
if(mid<optR) add(ch[p][1],mid+1,R0,u,w,type);
}
const lint INF=0x3F3F3F3F3F3F3F3F;
lint dst[N1];
std::queue<int> Q;
void SPFA(int s)
{
memset(dst,0x3F,sizeof dst);
dst[s]=0; Q.push(s);
while(!Q.empty())
{
int u=Q.front(); Q.pop();
for(int i=h[u];i;i=ed[i].nxt)
{
int v=ed[i].v,w=ed[i].w;
if(dst[u]+w<dst[v]) dst[v]=dst[u]+w,Q.push(v);
}
}
}
int main()
{
n=read(),m=read(),s=read();
cnt=n;
bldTr1(rt1,1,n); bldTr2(rt2,1,n);
while(m--)
{
int opt=read(),u,v,w;
if(opt==1)
{
u=read(),v=read(),w=read();
edAdd(u,v,w); continue;
}
u=read(); optL=read(),optR=read(); w=read();
add(opt==2?rt1:rt2,1,n,u,w,opt);
}
SPFA(s);
for(int i=1;i<=n;i++) printf("%lld ",dst[i]<INF?dst[i]:-1);
puts("");
return 0;
}

Codeforces787D - Legacy的更多相关文章

  1. GeoIP Legacy City数据库安装说明

    Here is a brief outline of the steps needed to install GeoIP Legacy City on Linux/Unix. The installa ...

  2. BIOS设置之UEFI/Legacy BIOS切换图文详解

    近几年出现的电脑其中相当一部分都配置了UEFI BIOS,不过大多都默认以Legacy BIOS方式启动.而Win8正式上市后, 所有预装Win8(或Win8.1)的电脑都配置了UEFI BIOS并且 ...

  3. GPT vs MBR 分区 ,,, Legacy BIOS vs UEFI BIOS

    MBR与GPT两种磁盘分区格式的区别 http://itoedr.blog.163.com/blog/static/120284297201378114053240 GPT Partition Tab ...

  4. Neo4j 两种索引Legacy Index与Schema Index区别

    Legacy Indexes 在Neo4j 2.0版本之前,Legacy index被称作indexes.这个索引是通过外部图存储在外的Lucene实现,允许“节点”和“联系”以key:value键值 ...

  5. How to configure Veritas NetBackup (tm) to write Unified and Legacy log files to a different directory

    Problem DOCUMENTATION: How to configure Veritas NetBackup (tm) to write Unified and Legacy log files ...

  6. [论文笔记] Legacy Application Migration to the Cloud: Practicability and Methodology (SERVICES, 2012)

    Quang Hieu Vu, Rasool Asal: Legacy Application Migration to the Cloud: Practicability and Methodolog ...

  7. 安装win7或win8系统时UEFI和Legacy模式的设置

    很多新型号的笔记本或台式机主板都开始支持UEFI模式,比起原来的Legacy启动减少了BIOS自检,加快平台启动,如下图所示Legacy,UEFI启动过程: 安装系统,建议选择Legacy模式,在UE ...

  8. win7 64 + Ubuntu 14.04.1 64双系统安装,详解UEFI ~ GPT和legacy ~ MBR区别

    win7 64 + Ubuntu 14.04.1 64双系统安装 背景:我的笔记本之前的系统是window 7 64 + Ubuntu 14.04.1,用UEFI引导系统.安装过程是先装的win7,再 ...

  9. Legacy安装win7和Ubuntu14.04双系统

    Legacy安装win7和Ubuntu14.04双系统 安装环境 Legacy启动模式(传统引导) 笔记本已安装win7 硬盘启动顺序为: U盘 硬盘 光驱 安装方法 制作U盘启动盘 在Ubuntu官 ...

随机推荐

  1. NF!=1

    NF表示列数,不等于1表示列数不为1列

  2. MySQL备份还原介绍

    window系统下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql ...

  3. (二)maven之项目结构

    我们可以看一下Maven项目的大致结构:      项目结构: src/main/java:java源代码文件目录. src/main/resources:资源库,会自动赋值到classes目录里,像 ...

  4. Open Cascade:AIS_InteractiveContext如何调用函数选择AIS对象

    AIS_InteractiveContext如何调用函数选择AIS对象 myAISContext->MoveTo(point.x, point.y, myView); myAISContext- ...

  5. 连接器前置挂载U盾

    连接器前置挂载U盾 1. 宿主机配置及其信息 虚拟化软件版本 主机名 宿主机IP 账号及其密码 WorkStation windows idca- vm01 172.16.6.30 * Qemu-kv ...

  6. js之数组知识

    一.数组的定义(来源于Array.prototype) 1.构造函数方法: (1)var arr = new Array();//没有参数等价于 var arr = []; (2)var arr = ...

  7. CSS 隐藏 visibility 属性

    定义和用法 visibility 属性规定元素是否可见. 提示:即使不可见的元素也会占据页面上的空间.请使用 "display" 属性来创建不占据页面空间的不可见元素. 说明 这个 ...

  8. (23)zabbix单位符号Unit symbols

    概述 在zabbix里面,我们不需要使用大数字来,例如我们可以不使用86400来表示一天,这个数字又不容易理解也容易出错.用什么办法来解决大数字问题呢?我们可以使用单位来简化,例如简化zabbix触发 ...

  9. Mac OS 终端强化美化:iterm2 + zsh + oh~my~zsh 设置教程

    为了获得更好的排版效果,文章改用markdown撰写,故重发一次. 前言 mac自带的terminal终端没有文件名高亮等功能,而且界面不是很好看,故今晚学舍友折腾了终端,可以让自己使用起来更加方便, ...

  10. php登录加密加盐

    1         背景 涉及身份验证的系统都需要存储用户的认证信息,常用的用户认证方式主要为用户名和密码的方式,为了安全起见,用户输入的密码需要保存为密文形式,可采用已公开的不可逆的hash加密算法 ...