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, ...
随机推荐
- 【leetcode】951. Flip Equivalent Binary Trees
题目如下: For a binary tree T, we can define a flip operation as follows: choose any node, and swap the ...
- HTML5 原生API input file 来实现多图上传,并大图预览
闲来无事,突然想用原生来实现图片的多图上传. 一.效果图大致如下: 1.上传时可以选择多图 2.上传之后缩略图下过图如下: 3.点击缩略图,大图展示当前所点击的图片,并可以左右滑动查看其它的缩略图对应 ...
- 【JZOJ6431】【luoguP5658】【CSP-S2019】括号树
description analysis 用栈维护一下树上路径未匹配的左括号,然后在树上找右括号匹配,设\(f[i]\)为\(i\)节点的贡献,\(g[i]\)是答案 为左括号可以直接继承父节点的信息 ...
- html中设置一个div可编辑文本
<div contenteditable="true"></div> <!-- outline: none;设置获取焦点没有高亮边框 -->
- Vue学习笔记【23】——Vue组件(组件的定义)
定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: ...
- Yii2的一些问题
Yii2中删除能不能串着用 Yii2中find.findAll有什么区别 Yii2中User::findOne($id)和User::find->where(['id'=>1])-> ...
- CSP-S2019退役记
分两次写完思路不是很清晰. 作为一名强迫症患者我选择以后再更新一些细节…… upd 真·退役,D1T1为什么都是95分算法他们AC了我挂成了70分555555555555 普及-的题目A不掉我死了55 ...
- Android中ViewPgae中的Fragment如何确认当前页面可见的问题
由于在ViewPage中PageAdapter来管理所有的Fragment.在加载一个Fragment的时候,会自动缓存左右几个(默认是一个)页面,此时也会调用到正常的生命周期函数,onCreate, ...
- 服务器安装TeamViewer 13
服务器安装TeamViewer 13 服务器上安装TeamViewer,网上找了个教程开始安装,里面有坑,安装时要根据自己的情况而定.Linux系统更新太快,网上教程可能会有一些出入. TeamVie ...
- JAVA学习之跨平台性
Java语音的特点:跨平台性什么是跨平台性通过Java语音编写的应用程序再不同的系统平台上都可以运行. 原理是什么只要在需要运行Java应用程序的操作系统上.先安装一个Java虚拟机(JVM Java ...