传送门

  • n个节点且固定起点最短路,三种加边方法
  • 1.u->v, 边权为w;2. u->[l, r], 边权为w;3. [l, r]->u, 边权为w

AC_Code

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define lson rt << 1
#define rson rt << 1 | 1
using namespace std;
typedef long long LL; const LL INF = 0x3f3f3f3f3f3f3f3f;
const int MXN = 1e6 + 6;
const int MXE = 4e6 + 6; int n, m, q, st;
int inde;
vector<int>vs;
struct lp{
int v, w, nex;
friend bool operator < (const lp &a,const lp &b) {
return a.w > b.w;
}
}cw[MXE], A, B;
int head[MXN], tot;
LL dis[MXN];
void add_edge(int u,int v,int w) {
cw[++tot].v = v; cw[tot].w = w; cw[tot].nex = head[u];
head[u] = tot;
}
int seg[MXN][2];
void build(int id,int l,int r,int rt) {
seg[rt][id] = ++inde;
if(l == r) {
if(id) add_edge(seg[rt][id], l, 0);
else add_edge(l, seg[rt][id], 0);
return;
}
int mid = (l + r) >> 1;
build(id, l, mid, lson); build(id, mid + 1, r, rson);
if(id) {
add_edge(seg[rt][id], seg[lson][id], 0); add_edge(seg[rt][id], seg[rson][id], 0);
}else {
add_edge(seg[lson][id], seg[rt][id], 0); add_edge(seg[rson][id], seg[rt][id], 0);
}
}
void query(int id,int L,int R,int l,int r,int rt) {
if(L <= l && r <= R) {
vs.push_back(seg[rt][id]);
return;
}
int mid = (l + r) >> 1;
if(L > mid) query(id, L, R, mid+1, r, rson);
else if(R <= mid) query(id,L,R,l,mid,lson);
else {
query(id,L,mid,l,mid,lson); query(id,mid+1,R,mid+1,r,rson);
}
}
void dij() {
for(int i = 1; i <= inde; ++i) dis[i] = INF;
dis[st] = 0;
A.v = st; A.w = 0;
priority_queue<lp> Q;
Q.push(A);
while(!Q.empty()) {
B = Q.top(); Q.pop();
int u = B.v;
if(dis[u] < B.w) continue;
for(int i = head[u]; ~i; i = cw[i].nex) {
int v = cw[i].v;
if(dis[v] > dis[u] + cw[i].w) {
dis[v] = dis[u] + cw[i].w;
A.v = v; A.w = dis[v];
Q.push(A);
}
}
}
}
int main() {
scanf("%d%d%d", &n, &q, &st);
int op, l, r, w, u, v;
memset(head, -1, sizeof(head));
tot = -1;
inde = n;
build(1, 1, n, 1); build(0, 1, n, 1);
while(q--) {
scanf("%d", &op);
if(op == 1) {
scanf("%d%d%d", &u, &v, &w);
add_edge(u, v, w);
}else if(op == 2) {
scanf("%d%d%d%d", &u, &l, &r, &w);
vs.clear();
query(1, l, r, 1, n, 1);
for(auto x : vs) add_edge(u, x, w);
}else if(op == 3) {
scanf("%d%d%d%d", &u, &l, &r, &w);
vs.clear();
query(0, l, r, 1, n, 1);
for(auto x : vs) add_edge(x, u, w);
}
}
dij();
for(int i = 1; i <= n; ++i) {
if(dis[i] >= INF) dis[i] = -1;
printf("%lld ", dis[i]);
}
printf("\n");
return 0;
}

Problem Description

Codeforces786B的更多相关文章

  1. CodeForces786B 线段树 + 最短路

    给定n颗行星,q次处理,地球位置为s,求解在q次处理后,地球到每一颗行星的位置. 其中q有三种不同的操作: 输入v,u,wv,u,w,构建一条从vv到uu的代价为ww的路线 输入u,l,r,wu,l, ...

随机推荐

  1. sql 投影查询

    使用SELECT * FROM <表名> WHERE <条件>可以选出表中的若干条记录.我们注意到返回的二维表结构和原表是相同的,即结果集的所有列与原表的所有列都一一对应. 如 ...

  2. PXE预启动执行环境的搭建

    搭建DHCP地址服务器 DHCP地址分配的四次会话:(广播形式)[先到先得]    Discovery---->Offer---->Request---->Ack 一个局域网内不能同 ...

  3. A*寻路算法C++简单实现

    搜索区域    如图所示简易地图, 其中绿色方块的是起点 (用 A 表示), 中间蓝色的是障碍物, 红色的方块 (用 B 表示) 是目的地. 为了可以用一个二维数组来表示地图, 我们将地图划分成一个个 ...

  4. nuxt 2.0采坑计之 (引入静态文件css)

    nuxt 2.0采坑计之静态文件css 外部引入css 全局引用方法为   (在nuxt.config.js配置中在   module.exports = {}  中添加) head: { meta: ...

  5. LINIX上Nginx的从零安装

    源码编译方式: #一般系统中已经装了了make和g++,无须再装 安装make: yum -y install autoconf automake make 安装g++: yum -y install ...

  6. (转)OpenFire源码学习之十七:HTTP Service插件

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43457645 HTTP Service插件 这里的http接口插件是神马? Openfi ...

  7. Elasticsearch介绍和安装与使用

    转载:https://blog.csdn.net/weixin_42633131/article/details/82902812 1.Elasticsearch介绍和安装 1.1.简介1.1.1.E ...

  8. csdn左侧个人栏目美化,css英文颜色大全,跑马灯效果,点击转到qq联系,点击转到发送邮件。

    跑马灯效果: <a href="http://mmmmmm.me" target="_blank"><marquee><font ...

  9. 24. Jmeter GUI 及NON GUI实现分布式

    什么是分布式: Jmeter的集群模式可以让我们将多台机器联合起来一起产生负载,从而弥补单台机器负载生成能力不足的问题. 假设我们的测试计划会产生100个threads,我们使用6台机器进行分布式测试 ...

  10. java.lang.Double.byteValue() 方法

    java.lang.Double.byteValue() 方法(通过转换成一个字节)返回此Double为一个字节的值. 声明 以下是java.lang.Double.byteValue()方法的声明 ...