Codeforces786B
- 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的更多相关文章
- CodeForces786B 线段树 + 最短路
给定n颗行星,q次处理,地球位置为s,求解在q次处理后,地球到每一颗行星的位置. 其中q有三种不同的操作: 输入v,u,wv,u,w,构建一条从vv到uu的代价为ww的路线 输入u,l,r,wu,l, ...
随机推荐
- ItunesConnect:苹果内购项目元数据缺失
问题描述: 添加内购的App审核时被拒,原因为:ios内购 元数据丢失 问题原因: 审核信息里的 “审核屏幕快照” 和 “备注” 要填写,不然就失败的. 示例图: 1.屏幕快照和审核备注都需要填写 ...
- AcWing 139. 回文子串的最大长度 hash打卡
如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...
- (转)oracle group by 和order by的关系(在一起使用注意事项)
转:http://lzfhope.blog.163.com/blog/static/636399220092554045196/ 环境:oracle 10g单单group by 或者order by本 ...
- diji模板
void diji(int x){ fill(dis,dis+n,INT_MAX); dis[x] = ; ;i < n;i++) pre[i] = i; ){ int minn = INT_M ...
- Django+paramiko实现webshell
说明 基于 python3.7 + django 2.2.3 实现的 django-webshell,支持颜色显示,支持 tab 命令补全,项目地址:https://github.com/leffss ...
- 2.2 webpack
webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安装 webpack 使用 命令行调用 配置文件 webpack 配置参数 entry ...
- Flink 配置文件详解
前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...
- upc组队赛2 Master of GCD 【线段树区间更新 || 差分】
Master of GCD 题目描述 Hakase has n numbers in a line. At fi rst, they are all equal to 1. Besides, Haka ...
- ajax中的onload和readychange区别
先补个知识点: readyState 状态码: 0:请求未初始化 1:服务器连接已建立 2:请求已接受 3:请求处理中 4:请求已完成,且响应已就绪 HTTP 状态码: 200 - 服务器成功返回网页 ...
- k小子串 SPOJ - SUBLEX 2
题意: 求字典序第K大的子串 题解: 先求出后缀自动机对应节点 // 该节点后面所形成的自字符串的总数 然后直接模拟即可 #include <set> #include <map&g ...