题目链接:点击查看

题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下:

  1. 1uvw1 \ u \ v \ w1 u v w:点 uuu 向点 vvv 连一条权值为 www 的边
  2. 2ulrw2 \ u \ l \ r \ w2 u l r w:点 uuu 向点 i∈[l,r]i \in[l,r]i∈[l,r] 连一条权值为 www 的边
  3. 3ulrw3 \ u \ l \ r \ w3 u l r w:点 i∈[l,r]i \in[l,r]i∈[l,r] 向点 uuu 连一条权值为 www 的边

题目分析:区间操作不难想到线段树,对于这个题而言考虑拆点,建两棵对顶的线段树用来描述边的关系,形状如下:

按照上图建边,所有的边权都为 000,再考虑三种加边操作:

  1. u→vu \to vu→v:树 BBB 的叶子节点 →\to→ 树 AAA 的叶子节点
  2. u→[l,r]u\to[l,r]u→[l,r]:树 BBB 的叶子节点 →\to→ 树 AAA 中代表区间 [l,r][l,r][l,r] 的节点
  3. [l,r]→u[l,r]\to u[l,r]→u:树 BBB 中代表区间 [l,r][l,r][l,r] 的节点 →\to→ 树 AAA 的叶子节点

然后跑最短路就好了

妙啊

代码:

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const LL inf=0x3f3f3f3f3f3f3f3f;
const int N=1e6+100;
template<typename T>
struct Dij
{const static int N=1e6+100;const static int M=5e6+100;struct Edge{int to,next;T w;}edge[M];int head[N],cnt;//链式前向星 T d[N];bool vis[N];void addedge(int u,int v,T w){edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;}struct Node{int to;T w;Node(int TO,T W){to=TO;w=W;}bool operator<(const Node& a)const{return w>a.w;}};void Dijkstra(int st){priority_queue<Node>q;memset(vis,false,sizeof(vis));memset(d,0x3f,sizeof(d));d[st]=0;q.push(Node(st,0));while(q.size()){Node cur=q.top();int u=cur.to;q.pop();if(vis[u])continue;vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next)//扫描出所有边 {int v=edge[i].to;T w=edge[i].w;if(d[v]>d[u]+w)//更新 {d[v]=d[u]+w;q.push(Node(v,d[v]));}}}}void init(){memset(head,-1,sizeof(head));cnt=0; }
};
Dij<LL>t;
int id=0;
struct Seg
{struct Node{int l,r,id;}tree[N<<2];void build(int k,int l,int r,bool flag)//flag=0:fa->son,flag=1:son->fa{tree[k].id=++id;tree[k].l=l,tree[k].r=r;if(l==r) return;int mid=(l+r)>>1;build(k<<1,l,mid,flag),build(k<<1|1,mid+1,r,flag);if(flag) t.addedge(tree[k<<1].id,tree[k].id,0),t.addedge(tree[k<<1|1].id,tree[k].id,0);else t.addedge(tree[k].id,tree[k<<1].id,0),t.addedge(tree[k].id,tree[k<<1|1].id,0);}void update(int k,int l,int r,int p,int w,bool flag)//flag=0:p->[l,r],flag=1:[l,r]->p{if(tree[k].l>r||tree[k].r<l) return;if(tree[k].l>=l&&tree[k].r<=r){if(flag) t.addedge(tree[k].id,p,w);else t.addedge(p,tree[k].id,w);return;}update(k<<1,l,r,p,w,flag),update(k<<1|1,l,r,p,w,flag);}int query(int k,int pos){if(tree[k].l==tree[k].r) return tree[k].id;int mid=(tree[k].l+tree[k].r)>>1;if(pos<=mid) return query(k<<1,pos);else return query(k<<1|1,pos);}void dfs(int k){if(tree[k].l==tree[k].r){int p=tree[k].id;if(t.d[p]==inf) write(-1),putchar(' ');else write(t.d[p]),putchar(' ');return;}dfs(k<<1),dfs(k<<1|1);}
}A,B;
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);t.init();int n,m,st;read(n),read(m),read(st);A.build(1,1,n,0),B.build(1,1,n,1);for(int i=1;i<=n;i++)t.addedge(A.query(1,i),B.query(1,i),0);while(m--){int op;read(op);if(op==1)//u->v{int u,v,w;read(u),read(v),read(w);t.addedge(B.query(1,u),A.query(1,v),w);}else if(op==2)//p->[l,r]{int u,l,r,w;read(u),read(l),read(r),read(w);int p=B.query(1,u);A.update(1,l,r,p,w,0);}else if(op==3)//[l,r]->p{int u,l,r,w;read(u),read(l),read(r),read(w);int p=A.query(1,u);B.update(1,l,r,p,w,1);}}t.Dijkstra(A.query(1,st));B.dfs(1);return 0;
}

CodeForces - 787D - Legacy(线段树优化建图+最短路)相关推荐

  1. Codeforces 786B Legacy (线段树优化建图)

    Codeforces 786B Legacy (线段树优化建图) 题意:\(n\)个点,有\(3\)种连边操作:1.将\(u\)指向\(v\):2.将\(v\)指向编号在区间\([l,r]\)的点:3 ...

  2. CodeForces---787D:Legacy【线段树优化建图+最短路】

    题目: 戳这里啊~~~ 题意: 给你三种操作:(1)点到点建边:(2)点到区间建边:(3)区间到点建边:最后求起点到其他点的最短距离 分析: 最短距离无非建边跑Dijkstra即可,考虑如何对区间建边 ...

  3. Gym - 102174G 神圣的 F2 连接着我们 (线段树优化建图 + 多源最短路)

    Description 小白非常喜欢玩 "县际争霸" 这款游戏,虽然他的技术并不容乐观."县际争霸" 的地图共有两个县,每个县里各有 n n n 个据点.同一个 ...

  4. 【CF1045A】A Last chance【贪心】【线段树优化建图】【网络流构造方案】

    题意:有nnn个武器和mmm个飞船,武器有下面三种 从给定的集合SSS中击破一个. 在给定的区间[L,R][L,R][L,R]中击破一个. 对于给定的a,b,ca,b,ca,b,c,选择000个或22 ...

  5. 线段树优化建图详解——区间连边之技巧,吊打紫题之利器

    我们从一道例题开始. CF786B Description Solution 朴素解法: 暴力连边+最短路 对于每次连边操作,我们逐一连边,最后在图上跑一遍单源最短路径算法即可. 时间复杂度 O ( ...

  6. 洛谷P3588 [POI2015]PUS(线段树优化建图)

    题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...

  7. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  8. P6348 [PA2011]Journeys 线段树优化建图 区间连区间

    传送门 文章目录 题意: 思路: 题意: 每次连接[a,b][a,b][a,b]与[c,d][c,d][c,d]之间所有点,让后跑最短路. 思路: 比普通的优化建图能简单点,我们只需要加两个虚点之间边 ...

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

    传送门 ovo这题该怎么做呢?我们首先考虑暴力建图,但是因为建图的操作太多直接就会MLE,所以这个就别想了-- 我们考虑如何优化建图.因为发现一个点可以向一个区间连边,一个区间也可以向一个点连边,想到 ...

最新文章

  1. ComponentOne Wijmo Editor 在光标处添加文本
  2. GitHub上的这本开源算法书火爆了
  3. python strip函数用法_python strip()函数 介绍
  4. python3命令行安装pip_win10系统下python3安装及pip换源和使用教程
  5. 爱奇艺体验Serverless极致扩缩容,资源利用率提升40%
  6. step7db块寻址_step7中的难点:间接寻址示例,中文详细注释。
  7. linux多进程优先级,Linux多线程之优先级
  8. 【无人机】无人机产业链全景图
  9. 全面理解Unity加载和内存管理
  10. 安全认证Kerberos
  11. 如何实现异地远程登录计算机,两台异地电脑怎么实现远程控制
  12. 什么是线程安全问题 及怎么解决线程安全问题
  13. 求字符串的全排列的递归实现(对字符串中有相同字符也适用)
  14. 【游戏设计笔记】游戏开发团队
  15. html window 网络邻居,解决Windows7系统局域网网上邻居看不到其它同事电脑方法
  16. Android本地数据持久化:内部存储和外部存储
  17. Redis 的 MOVED 转向与 ASK 转向
  18. IEEE 802.1AS-2011 第八章 IEEE 802.1AS的概念和术语
  19. 技能提升之Latex控制图片位置
  20. 重磅!顶尖AI学者全职回国,拟加入清华大学

热门文章

  1. 如何自己动手写一个搜索引擎?我是一份害羞的教程
  2. Java和WebSocket开发网页聊天室
  3. cefsharp 网页打印不好用_2019年成人高考打印准考证常见问题解答
  4. 计算机科学与技术专业的课程体系,基于业务的计算机科学与技术专业课程体系...
  5. sun java ide,1.6 JAVA IDE安装
  6. MySQL的4大版本
  7. Oracle vs MySQL
  8. RabbitMQ死信实战(消费者1)
  9. MyBatis关键配置-接口注入使用
  10. 定义和使用含有泛型的类