CodeForces - 786B -- 线段树优化建图
刚开始想了两个小时,打算把区间分块然后计算,但是这就很灵性了
看了一个大佬的博客,侵删
#include<cstring>
#include<iostream>
#include<vector>
#include<cstdio>
#include<queue>
#define maxn 302020 using namespace std;
typedef long long ll;
const ll INF = 10000000000000;
int root1 = 0;
int root2 = 0;
struct Node {
int p;
ll len;
Node(int a, ll b) :p(a), len(b) {}
};
vector<Node>G[maxn];
void insert(int be, int en, ll len) {
G[be].push_back(Node(en, len));
} ll dis[maxn];
int vis[maxn];
int num;
int lc[maxn];
int rc[maxn]; int bult1(int &node, int be, int en) {
if (be == en) {
node = be;
return 0;
}
node = ++num;
int mid = (be + en) / 2;
bult1(lc[node], be, mid);
bult1(rc[node], mid + 1, en);
insert(node, lc[node], 0);
insert(node, rc[node], 0);
return 0;
} int bult2(int &node, int be, int en) {
if (be == en) {
node = be;
return 0;
}
node = ++num;
int mid = (be + en) / 2;
bult2(lc[node], be, mid);
bult2(rc[node], mid + 1, en); insert(lc[node], node, 0);
insert(rc[node], node, 0);
return 0;
}
int n, m, s;
ll length;
int LL, RR;
int querry(int node, int be, int en, int op,int begin) {
if (LL <= be && en <= RR) { if (op == 2) insert(begin, node, length);
if (op == 3) insert(node, begin, length);
return 0;
}
int mid = (be + en) / 2;
if (LL <= mid) querry(lc[node], be, mid, op, begin);
if (mid < RR) querry(rc[node], mid + 1, en, op, begin);
return 0;
}
int dijstra(int be) {
for (int i = 0; i < maxn -100; i++) {
vis[i] = 0;
dis[i] = INF;
}
queue<int>que;
que.push(be);
dis[be] = 0;
while (!que.empty()) {
int x = que.front();
que.pop();
vis[x] = 0;
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
if (dis[p] > dis[x] + G[x][i].len) {
dis[p] = dis[x] + G[x][i].len;
if (!vis[p]) {
vis[p] = 1;
que.push(p);
} }
}
}
return 0;
}
int main() {
int t;
scanf("%d %d %d", &n, &m, &s);
num = n+1;
bult1(root1, 1, n);
bult2(root2, 1, n);
int be, en; for (int i = 0; i < m; i++) {
scanf("%d", &t);
if (t == 1) {
scanf("%d %d %lld", &be, &en, &length);
insert(be, en, length);
}
else {
scanf("%d %d %d %lld", &be, &LL, &RR,&length);
if (t == 2) querry(root1, 1, n, t, be);
else querry(root2, 1, n, t, be);
}
}
dijstra(s);
for (int i = 1; i <= n; i++) {
if (dis[i] == INF) printf("-1 ");
else printf("%lld ", dis[i]);
}
return 0;
}
CodeForces - 786B -- 线段树优化建图的更多相关文章
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
- BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图
复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- codeforces 787D - Legacy 线段树优化建图,最短路
题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...
- Codeforces 1045A Last chance 网络流,线段树,线段树优化建图
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...
- BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图
Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢 ...
随机推荐
- Linux保证运行一个实例
1. ; // 默认最大路径长度 inline std::string current_exe_name() { }; int ret = readlink("/proc/self/exe& ...
- 关于取List中的指定几条数据以及注意事项
list1 = list2.subList(start, end); start,end分别是第几个到第几个. 注意的是此方法和substring一样,包含前不包含结尾,取下标索引 另一个注意的地方是 ...
- XAML 很少人知道的科技 - walterlv
原文:XAML 很少人知道的科技 - walterlv XAML 很少人知道的科技 发布于 2019-04-30 02:30 更新于 2019-04-30 11:08 本文介绍不那么常见的 XAML ...
- jQuery Css类
通过 jQuery,可以很容易地对 CSS 元素进行操作 jQuery 操作 CSS jQuery 拥有若干进行 CSS 操作的方法.我们将学习下面这些: addClass() - 向被选元素添加一个 ...
- JQuery------库
JQuery-------------模块.类库 集成了DOM/BOM/JS的类库 一.查找元素 DOM 10左右 JQuery: 选择器: 筛选: ps:版本: 1.x:兼容性最好.1.12推荐 2 ...
- 9 模版语言 jinja2
from flask import Flask,redirect,render_template,jsonify,send_file,request,Markup,sessionimport json ...
- python基础之内置装饰器
装饰器 简介 功能与格式 内置装饰器 @classmethod @propertry @staticmethod 其它 ---------------------------------------- ...
- SpringBoot2集成Activiti6
Activiti是领先的轻量级的,以Java为中心的开源BPMN(Business Process Modeling Notation)引擎,实现了真正的流程自动化.下面介绍如何在SpringBoot ...
- 为你的 SuperSocket 启用动态语言
步骤如下: 1.添加 DLR (dynamic language runtime) 配置片段; Section 定义: <section name="microsoft.scripti ...
- Python--day25--面向对象之封装
狭义上的封装的例子:(例1)Python就只有两种类型:公有和私有,没有Java中说的那种保护类型 例2: 例3:正常的方法调用私有方法 封装总结: