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时间中选出一个时间进行抢劫,并计划抢 ...
随机推荐
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛: B. Coin 【概率题】【数论】
Bob has a not even coin(就是一个不均匀的硬币,朝上的概率不一定是1/2), every time he tosses the coin, the probability tha ...
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H Skiing【拓扑排序,关键路径】
2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H Skiing In this winter holiday, Bob has a plan for skiing at the moun ...
- python 检测目录
#!/usr/bin/env python# -*- coding:utf-8 -*-import osimport win32fileimport win32con ACTIONS = { 1 : ...
- oracle函数 RPAD(c1,n[,c2])
[功能]在字符串c1的右边用字符串c2填充,直到长度为n时为止 [参数]C1 字符串 n 追加后字符总长度 c2 追加字符串,默认为空格 [返回]字符型 [说明]如果c1长度大于n,则返回c1左边n个 ...
- LRJ-Example-06-04-Uva11988
单向链表的元素存放在数组s[]中,next指针存放在数组next[]中. 链表初始为空,next[0] == 0 代表链表结尾,类似NULL指针,在最后打印链表的时候作为for循环结束的条件. 依次插 ...
- oracle使用表的别名(Alias)
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. (Column歧义指的是由于SQL中不同 ...
- HTML静态网页--表单验证和事件
1.表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电话号码, ...
- POJ2752 Seek the Name, Seek the Fame 题解 KMP算法
题目链接:http://poj.org/problem?id=2752 题目大意:给你一个字符串 \(S\) ,如果它的一个前缀同时也是它的后缀,则输出这个前缀(后缀)的长度. 题目分析:next函数 ...
- 纯JS前端分页方法(JS分页)
1.JS分页函数:开发过程中,分页功能一般是后台提供接口,前端只要传page(当前页码)和pageSize(每页最大显示条数)及对应的其他查询条件,就可以返回所需分页显示的数据. 但是有时也需要前端本 ...
- 理解java面向对象基础
1. 类和对象 一切皆对象,这可以说是面向对象的核心思想了. 类,就是具有相同性质对象的抽象. 而类的每一个具体的实例就是一个对象. 我们可以定义一个Person类,这个Person类就是所有的人的抽 ...