思路

线段树优化建图

基本思想就是要把一个区间连边拆成log个节点连边,

然后一颗入线段树,一颗出线段树,出线段树都由子节点向父节点连边(可以从子区间出发),入线段树从父节点向子节点连边(可以到达子区间),入线段树上每个节点向出线段树的每个对应节点连边(进来之后可以出去),题目里的边由出线段树连向入线段树

然后最短路就好了

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
int id1[800100*4],id2[800100*4],fir[800100*4],nxt[800100*4],v[800100*4],w[800100*4],lson[800100*4],rson[800100*4],root1,root2,Nodecnt,cnt,n,m,s;
void addedge(int ui,int vi,int wi){
++cnt;
v[cnt]=vi;
w[cnt]=wi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
void build(int l,int r,int &o1,int &o2){
o1=++Nodecnt;
o2=++Nodecnt;
addedge(o2,o1,0);
if(l==r){
id1[l]=o1;
id2[l]=o2;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson[o1],lson[o2]);
build(mid+1,r,rson[o1],rson[o2]);
addedge(lson[o1],o1,0);
addedge(rson[o1],o1,0);
addedge(o2,lson[o2],0);
addedge(o2,rson[o2],0);
}
void link(int L,int R,int l,int r,int o,int opt,int v,int w){//0:[l,r]->o 1:o->[l,r]
if(L<=l&&r<=R){
if(!opt)
addedge(o,v,w);
else
addedge(v,o,w);
return;
}
int mid=(l+r)>>1;
if(L<=mid)
link(L,R,l,mid,lson[o],opt,v,w);
if(R>mid)
link(L,R,mid+1,r,rson[o],opt,v,w);
}
struct QNode{
int p,val;
bool operator < (const QNode &b) const{
return val>b.val;
}
};
priority_queue<QNode> q;
int dis[800100*4],vis[800100*4];
void dijkstra(int s){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
q.push((QNode){s,0});
while(!q.empty()){
QNode x=q.top();
q.pop();
if(vis[x.p])
continue;
vis[x.p]=true;
for(int i=fir[x.p];i;i=nxt[i]){
if(dis[v[i]]>dis[x.p]+w[i]){
dis[v[i]]=dis[x.p]+w[i];
q.push((QNode){v[i],dis[v[i]]});
}
}
}
}
signed main(){
scanf("%lld %lld %lld",&n,&m,&s);
build(1,n,root1,root2);
for(int i=1;i<=m;i++){
int opt;
scanf("%lld",&opt);
if(opt==1){
int u,v,w;
scanf("%lld %lld %lld",&u,&v,&w);
addedge(id1[u],id2[v],w);
}
else if(opt==2){
int u,l,r,w;
scanf("%lld %lld %lld %lld",&u,&l,&r,&w);
link(l,r,1,n,root2,1,id1[u],w);
}
else if(opt==3){
int l,r,v,w;
scanf("%lld %lld %lld %lld",&v,&l,&r,&w);
link(l,r,1,n,root1,0,id2[v],w);
}
}
dijkstra(id2[s]);
for(int i=1;i<=n;i++)
printf("%lld ",dis[id1[i]]==0x3f3f3f3f3f3f3f3fLL?-1:dis[id1[i]]);
return 0;
}

CF786B Legacy的更多相关文章

  1. CF786B Legacy && 线段树优化连边

    线段树优化连边 要求点 \(x\) 向区间 \([L, R]\) 连边, 一次的复杂度上限为 \(O(n)\) 然后弄成线段树的结构 先父子连边边权为 \(0\) 这样连边就只需要连父亲就可以等效于连 ...

  2. CF786B Legacy(线段树优化建边)

    模板题CF786B Legacy 先说算法 如果需要有n个点需要建图 给m个需要建边的信息,从单点(或区间内所有点)向一区间所有点连边 如果暴力建图复杂度\(mn^2\) 以单点连向区间为例,在n个点 ...

  3. CF786B Legacy 线段树优化建图

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

  4. 线段树优化建图 || CF786B Legacy

    题面:786B - Legacy 代码: #include<cstdio> #include<cstring> #include<iostream> #includ ...

  5. CF786B Legacy(线段树优化建图)

    嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...

  6. CF786B Legacy 线段树优化建图 + spfa

    CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给 ...

  7. [题解] CF786B Legacy

    前言 题目链接 题意 有 \(n\) 个点,\(q\) 次连边,以及起点 \(s\) .连边具体分三种: \(1\) \(v\) \(u\) \(w\) 从 \(v\) 到 \(u\) 连一条边. \ ...

  8. 【CF786B】Legacy

    题目大意:初始给定 N 个点,支持三种操作:两点之间连边:一个点与一个连续区间编号的点之间连边:一个连续区间内的点和一个点连边,求执行 N 次操作之后的单源最短路. 题解:学会了线段树优化建图. 发现 ...

  9. 题解 CF786B 【Legacy】

    本题要求我们支持三种操作: ① 点向点连边. ② 点向区间连边. ③ 区间向点连边. 然后跑最短路得出答案. 考虑使用线段树优化建图. 建两颗线段树,入树和出树,每个节点为一段区间的原节点集合.入树内 ...

随机推荐

  1. LeetCode 538 Convert BST to Greater Tree 解题报告

    题目要求 Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the origi ...

  2. flutter 自定义输入框组件

    一.组件分析 ui如下 根据UI分析我们需要提取哪些是动态的,可以通过传递参数得到不同的结果? 1.左侧icon 2.输入的文本 3.是否是密码框 4.输入框的控制器:如何时时得到输入框的值 二.快速 ...

  3. JsonPath如何获取JSON数据中的值

    场景: 发送接口请求后,得到请求结果值是Json数据, 需要从Json数据信息中提取字段值. 响应值字符与字符之间有空格,导致用正则表达式方法提取比较麻烦,于是用java的JsonPath方法提取快速 ...

  4. linux 环境变量函数getenv()和putenv()的使用

    环境变量相关函数: getenv()和putenv() 代码示例[Linux程序设计(4th)_4.2小节配套代码]: 程序功能:编写一个程序来打印所选的任意环境变量的值:如果给程序传递第二个参数,还 ...

  5. vs2017无法安装

    vs2017无法安装,无错误提示和日志 参考:https://blog.csdn.net/jq0123/article/details/83987686 但是解决方法不一样,运行安装程序没有提示,需要 ...

  6. BeautifulSoup库的使用

    1.简介 BeautifulSoup库也是一个HTML/XML的解析器,其使用起来很简单,但是其实解析网站用xpath和re已经足矣,这个库其实很少用到.因为其占用内存资源还是比xpath更高. '' ...

  7. 动态代理处理service

    /* 动态代理处理service * 1.动态代理的核心是切面编程,去除重复代码: * 2.通过反射+注解可以灵活的获取传入对象内容: * 3.通过try+catch将多个操作包裹,实现事物的原子性: ...

  8. openssh-win64 on windows2016 ssh pub key config

    DO NOT follow the official M$ documentation at https://docs.microsoft.com/en-us/windows-server/admin ...

  9. 接口测试工具-fiddler

    1.fiddler拦截修改数据 命令介绍: bpu在请求开始时中断,bpafter在响应到达时中断,bps在特定http状态码时中断,bpv/bpm在特定请求method时中断. 提示:命令输入区域输 ...

  10. python类与对象-如何让对象支持上下文管理

    如何让对象支持上下文管理 问题举例 一个telnet客户端的类TelnetClient, 调用实例的connect(),login(),interact方法 启动客户端与服务器交互,交互完毕后需要调用 ...