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时间中选出一个时间进行抢劫,并计划抢 ...
随机推荐
- hdu 1950 最长上升子序列(lis) nlogn算法【dp】
这个博客说的已经很好了.http://blog.csdn.net/shuangde800/article/details/7474903 简单记录一下自己学的: 问题就是求一个数列最长上升子序列的长度 ...
- P2532 [AHOI2012]树屋阶梯
题目:P2532 [AHOI2012]树屋阶梯 思路: 打表之后不难看出是裸的Catalan数.简单证明一下: 对于任意一种合法方案,都可以表示为在左下角先放一个\(k*(n+1-k),k\in[1, ...
- Java练习 SDUT-1580_闰年
闰年 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 时间过得真快啊,又要过年了,同时,我们的人生也增长了一年的阅历,又 ...
- 薪资管理系统(Java面向对象思想)
package com.test3; import java.util.*; import java.io.*; /** * @author qingfeng * 重要思想:面向对象思想(添加员工管理 ...
- Datanodes-心跳机制
- Browse W3C's Open Source Software
https://www.w3.org/Status.html Browse W3C's Open Source Software Amaya - a Web browser/editor First ...
- top 9 Cloud Computing Failures
top 9 Cloud Computing Failures Outages, hacks, bad weather, human error and other factors have led t ...
- SuperSocket性能数据采集的应用程序接口的改动
性能数据采集的应用程序接口作了修改,两个虚方法已经被更改: protected virtual void UpdateServerSummary(ServerSummary serverSummary ...
- 【codeforces 520C】DNA Alignment
[题目链接]:http://codeforces.com/contest/520/problem/C [题意] 给你一个函数; 它的作用是评估两个字符串的相似程度; 评估的时候: 保持一个字符串不动, ...
- Python--day72--Cookie和Session内容回顾
1. Cookie是什么 保存在浏览器端的键值对 为什么要有Cookie? 因为HTTP请求是无状态的 Cookie的原理? 服务端可以在返回响应的时候 做手脚 在浏览器上写入键值对(Cookie) ...