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
最终求起点到其他点的最短距离,到达不了输出-1
题解
线段树优化建图+最短路...
不知道这种东西,百度了一下,好像最早的是POI2015的PUS,然后2017/2018的oi也都出过,
还是要见识一下的...
顺便记录一下,封装好的djisktra和graph
代码如下:
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(ii,x) for(int ii=head[x];ii;ii=e[ii].next)
#pragma GCC optimize("Ofast")
#define show(x) cout<<#x<<"="<<x<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<" "<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
using namespace std;
const int maxn=1e6+10,maxm=2e6+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double PI=acos(-1.0);
//head
int casn,n,m,k;
int num[maxn];
class graph{
public:
struct edge{
int from,to;ll cost;
edge(int a,int b,ll c){from=a,to=b,cost=c;}
};
vector<vector<edge>> node;
int ud=0;
graph(int n=maxn,int f=0){node.resize(n+2);ud=f;}
void add(int a,int b,int c=1){node[a].emplace_back(a,b,c);if(ud)node[b].emplace_back(b,a,c);}
}; class dijkstra{
public:
struct road{
int now;ll dis;
road(int a,ll b){now=a,dis=b;}
bool operator<(const road &rhs)const{return dis>rhs.dis;}
};
vector<ll> dis;
priority_queue<road>q;
ll INF;
dijkstra(graph &g,int st){
INF=0x3f3f3f3f3f3f3f3f;
dis.resize(g.node.size()+1,INF);
q.emplace(st,0);
dis[st]=0;
while(!q.empty()){
road t=q.top();q.pop();
for(auto e:g.node[t.now]){
ll cost=t.dis+e.cost;
if(cost<dis[e.to]){
dis[e.to]=cost;
q.emplace(e.to,cost);
}
}
}
}
}; class segtree{
public:
#define nd node[now]
#define ndl node[now<<1]
#define ndr node[now<<1|1]
struct segnode {
int l,r;int id;
int mid(){return (r+l)>>1;}
int len(){return r-l+1;}
};
graph *g;
int cnt,flag;
vector<segnode> node;
vector<int> ff;
segtree(int n,graph *x,int y,int id) {
g=x;cnt=id;flag=y;
node.resize(n<<2|3);
maketree(1,n);
}
void pushup(int now){
if(!flag){
g->add(nd.id,ndl.id,0);
g->add(nd.id,ndr.id,0);
}else {
g->add(ndl.id,nd.id,0);
g->add(ndr.id,nd.id,0);
}
}
void maketree(int s,int t,int now=1){
nd={s,t,++cnt};
if(s==t){
if(!flag) g->add(nd.id,s,0);
else g->add(s,nd.id,0);
return ;
}
maketree(s,nd.mid(),now<<1);maketree(nd.mid()+1,t,now<<1|1);
pushup(now);
}
void query(int s,int t){
ff.clear();
count(s,t);
}
void count(int s,int t,int now=1){
if(s>nd.r||t<nd.l)return ;
if(s<=nd.l&&t>=nd.r) {
ff.emplace_back(nd.id);
return ;
}
count(s,t,now<<1);count(s,t,now<<1|1);
}
}; int main() {
IO;
int n,q,s;
cin>>n>>q>>s;
graph g(n*10);
segtree intree(n,&g,1,n);
segtree outtree(n,&g,0,intree.cnt);
int k,a,b;ll c,d;
while(q--){
cin>>k;
if(k==1){
cin>>a>>b>>c;
g.add(a,b,c);
}else if(k==2){
cin>>a>>b>>c>>d;
outtree.query(b,c);
for(auto &i:outtree.ff) g.add(a,i,d);
}else{
cin>>a>>b>>c>>d;
intree.query(b,c);
for(auto &i:intree.ff) g.add(i,a,d);
}
}
dijkstra ne(g,s);
rep(i,1,n) cout<<(ne.dis[i]>=ne.INF?-1:ne.dis[i])<<' ';
return 0;
}
codeforces 787D - Legacy 线段树优化建图,最短路的更多相关文章
- CF786B Legacy 线段树优化建图
问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...
- Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...
- 【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 1045A Last chance 网络流,线段树,线段树优化建图
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...
随机推荐
- Mysql完整约束性
一.介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...
- 【学习总结】Git学习-参考廖雪峰老师教程-总
公元2018-10-21 实验室台式机 win7 64位 参考教程: 廖雪峰Git教程 其他资料:Git-book 北大一只总结的笔记,最终整理的时候可以参考:Git笔记 评论区看到的另一个人,总结在 ...
- jsp中【<%=request.getContextPath()%>】项目路径
1 2 "request.getContextPath()的值是 "<%=request.getContextPath()%><br/> &q ...
- ABP中的拦截器之ValidationInterceptor(上)
从今天这一节起就要深入到ABP中的每一个重要的知识点来一步步进行分析,在进行介绍ABP中的拦截器之前我们先要有个概念,到底什么是拦截器,在介绍这些之前,我们必须要了解AOP编程思想,这个一般翻译是面向 ...
- 4月10日java多线程3
在之前我学习了java中的Thread 来实现多线程,今日我学习了ThreadGroup.Executor框架.ForkJoin框架.Executor 和ForkJoin都可以直接定义线程池,可以根据 ...
- Javascript初识之流程控制、函数和内置对象
一.JS流程控制 1. 1.if else var age = 19; if (age > 18){ console.log("成年了"); }else { console. ...
- Python 正则表达式使用问题集锦
在正则表达式中,如果直接给出字符,就是精确匹配.用\d可以匹配一个数字,\w可以匹配一个字母或数字,所以: '00\d'可以匹配'007',但无法匹配'00A':而且也无法匹配'1001',效果类似于 ...
- Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝
一.运算符及优先级 Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 1.算数运算符 运算符 描述 实例,a=20,b=10 + 加 a+b输出结果30 - 减 a-b输出结果 ...
- 20165223 《信息安全系统设计基础》 实现mypwd
一.学习pwd命令 1. pwd命令简介 英文原名:Print Working Directory 指令功能:打印出当前工作目录 执行权限:All User 指令所在路径:/usr/bin/pwd 或 ...
- 解决Parameter '__frch_item_0' not found. Available parameters 问题
1. 问题描述: 出现如下问题,执行报错信息 Caused by: org.mybatis.spring.MyBatisSystemException: nested exception is org ...