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. 【Web应用-Web作业】Web 作业无法直接运行 jar 文件

    问题描述 在经典管理门户中将直接压缩的 jar 文件打包为 zip 包,上传到 web 作业时报错. 解决方法 jar 文件的运行需要依托于 java 进程,所以在运行 jar 文件时,我们都会以格式 ...

  2. 强化学习_PolicyGradient(策略梯度)_代码解析

    使用策略梯度解决离散action space问题. 一.导入包,定义hyper parameter import gym import tensorflow as tf import numpy as ...

  3. jni 开发

    创建android工程 -> 添加native 函数 添加库之后: 1. 用javah 生成c语言.h头文件时, 在cmd 窗口中cd 到bin/classes 目录下执行下代码无效: java ...

  4. MINST手写数字识别(三)—— 使用antirectifier替换ReLU激活函数

    这是一个来自官网的示例:https://github.com/keras-team/keras/blob/master/examples/antirectifier.py 与之前的MINST手写数字识 ...

  5. C#中Json进行序列化时去掉值为null的节点

    当我们用json文件为数据源时,并对json数据进行操作时可能会产生一些数值为null的节点生成,想要去掉null的节点需要一些操作 本文用一个简单的工具对json进行操作 工具:Newtonsoft ...

  6. 火狐浏览器返回不加载JS

    火狐浏览器 go(-1),返回后不加载JS,谷歌会加载. 总结: Firefox和Safari在back时不会触发load, ready事件! 解决方法: $(window).unload(funct ...

  7. shell脚本,计算学生分数的题目。

    1.计算学生平均分数的值是多少? 2.计算每门课都大于80分的学生姓名.3.计算每门课都小于90分的学生姓名.

  8. javaEE(14)_文件上传下载

    一.文件上传概述 1.实现web开发中的文件上传功能,需完成如下二步操作: •在web页面中添加上传输入项•在servlet中读取上传文件的数据,并保存到本地硬盘中. 2.如何在web页面中添加上传输 ...

  9. PAT 乙级 1037

    题目 题目地址:PAT 乙级 1037 题解 本题有两个版本的代码,初版因为种种问题写得比较繁琐,具体的分析见后文,更新的之后的版本相对来说要好很多,代码也比较清晰简洁. 初版的代码主要有如下几方面的 ...

  10. 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼

    离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...