题意:

有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 线段树优化建图,最短路的更多相关文章

  1. CF786B Legacy 线段树优化建图

    问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...

  2. Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)

    题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...

  3. 【BZOJ4383】[POI2015]Pustynia 线段树优化建图

    [BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...

  4. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  5. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  6. bzoj3073: [Pa2011]Journeys 线段树优化建图

    bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...

  7. BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图

    复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...

  8. bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...

  9. Codeforces 1045A Last chance 网络流,线段树,线段树优化建图

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...

随机推荐

  1. openflow流表分析(草稿)

    OVS bridge 有两种模式:“normal” 和 “flow”.“normal” 模式的 bridge 同普通的 Linux 桥,而 “flow” 模式的 bridge 是根据其流表(flow ...

  2. 为奋战在HIS创新路上的医院信息科赋能

    为奋战在HIS创新路上的医院信息科赋能 南京都昌信息科技有限公司 袁永福 2017-7 ◆◆前言 近日,上海瑞金医院向我司表示:“我院从2000年开始自主开发医院信息系统,走出了一条可持续的信息化发展 ...

  3. jmeter beanshell 中使用map

    1.使用第三方jar包的时候可以放在lib目录下也可以放在lib/ext目录下,放在这两个目录都可以引用jar包成功,通过引用json的jar包在另个目录都实验过成功. 2.通过学习知道可以在bean ...

  4. 通过CONN_MAX_AGE优化Django的数据库连接

    上周对我们用Django+Django-rest-framework提供的一套接口进行了压力测试.压测的过程中,收到DBA通知——数据库连接数过多,希望我们优化下程序.具体症状就是,如果设置mysql ...

  5. Jenkins与sonar扫描的集成问题

    记录本周遇到的头疼了很久的一个问题,由于公司需要使用jenkins来自动管理构建项目,然后在关联sonar对项目代码质量进行审核. 接着坑爹的问题来了,原有的技术手段为项目构建成功后通过jenkins ...

  6. Python——Django-manage.py的内容

    在项目的根目录下(也就是有manage.py的那个目录),运行: python3 manage.py runserver IP:端口--> 在指定的IP和端口启动 python3 manage. ...

  7. opencv 增强现实(二):特征点匹配

    import cv2 as cv import numpy as np # def draw_keypoints(img, keypoints): # for kp in keypoints: # x ...

  8. java 日期格式化

    DateFormat DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. SimpleDateFormat SimpleDateFormat 是一个以与 ...

  9. Win10修改编辑文件无法保存怎么办(没有权限)

    Win10修改编辑hosts文件无法保存怎么办 修改一些系统文件无法保存说明这个账户没有“写”这个权限 这里以hosts文件为例,为账户增加读写权限: 首先进入Win10系统的hosts文件所在位置 ...

  10. es6常用的

    常用: let关键字: 1. 作用: * 与var类似, 用于声明一个变量2. 特点: * 在块作用域内有效 * 不能重复声明 * 不会预处理, 不存在提升3. 应用: * 循环遍历加监听 * 使用l ...