问题描述

CF786B

LG-CF786B


题解

线段树优化建图

线段树的一个区间结点代表 \([l,r]\) 区间点。

然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率。

优质题解传送门


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; #define int long long template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
} const int maxn=100100;
int INF=0x3f3f3f3f3f3f3f3fll; #define pii(x,y) make_pair(x,y) #define mid ((l+r)>>1)
#define lfc (x<<1)
#define rgc ((x<<1)|1) vector < pair < int , int > > e[maxn*10];
int n,T,S;
int cnt,out[maxn<<2],in[maxn<<2]; void build(int x,int l,int r){
if(l==r){
out[x]=in[x]=l;return;
}
build(lfc,l,mid);build(rgc,mid+1,r);
out[x]=++cnt,in[x]=++cnt;
e[out[lfc]].push_back(pii(out[x],0));
e[out[rgc]].push_back(pii(out[x],0));
e[in[x]].push_back(pii(in[lfc],0));
e[in[x]].push_back(pii(in[rgc],0));
} int L,R,st,val; void change_in(int x,int l,int r){
if(L<=l&&r<=R){
e[st].push_back(pii(in[x],val));return;
}
if(r<L||R<l) return;
change_in(lfc,l,mid);change_in(rgc,mid+1,r);
} void change_out(int x,int l,int r){
if(L<=l&&r<=R){
e[out[x]].push_back(pii(st,val));return;
}
if(r<L||R<l) return;
change_out(lfc,l,mid);change_out(rgc,mid+1,r);
} int dis[maxn*10];
priority_queue< pair <int,int> > q; bool vis[maxn*10]; void dijkstra(){
memset(dis,0x3f,sizeof(dis));dis[S]=0;
q.push(pii(0,S));
while(!q.empty()){
int x=q.top().second;q.pop();
if(vis[x]) continue;
vis[x]=1;
for(auto &i:e[x]){
int y=i.first;
if(y==0) continue;
if(i.second+dis[x]<dis[y]){
dis[y]=dis[x]+i.second;
q.push(pii(-dis[y],y));
}
}
}
} signed main(){
read(n);read(T);read(S);
cnt=n;build(1,1,n);
while(T--){
int op;read(op);
if(op==1){
int aa,bb,cc;read(aa);read(bb);read(cc);
e[aa].push_back(pii(bb,cc));
}
else if(op==2){
int aa,bb,cc,dd;read(aa);read(bb);read(cc);read(dd);
L=bb,R=cc,st=aa,val=dd;change_in(1,1,n);
}
else{
int aa,bb,cc,dd;read(aa);read(bb);read(cc);read(dd);
L=bb,R=cc,st=aa,val=dd;change_out(1,1,n);
}
}
dijkstra();
for(int i=1;i<=n;i++){
printf("%lld%c",(dis[i]==INF)?-1:dis[i]," \n"[i==n]);
}
return 0;
}

CF786B Legacy 线段树优化建图的更多相关文章

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

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

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

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

  3. G. 神圣的 F2 连接着我们 线段树优化建图+最短路

    这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...

  4. BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan

    Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...

  5. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

  6. 【ARC069F】Flags 2-sat+线段树优化建图+二分

    Description ​ 数轴上有 n 个旗子,第 ii 个可以插在坐标 xi或者 yi,最大化两两旗子之间的最小距离. Input ​ 第一行一个整数 N. ​ 接下来 N 行每行两个整数 xi, ...

  7. 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序

    题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆.  现在 ...

  8. 【bzoj4699】树上的最短路(树剖+线段树优化建图)

    题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...

  9. 【BZOJ4276】[ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流

    [BZOJ4276][ONTAK2015]Bajtman i Okrągły Robin Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2 ...

随机推荐

  1. 201871010123-吴丽丽《面向对象程序设计(Java)》第十二周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十二周学习总结 项目 内容 这个作业属于哪个课程  https://www.cnblogs.com/nwnu-daizh/ ...

  2. awk命令使用整理

    1. awk默认以空格分隔, 可摘出指定位置的内容, 通常用法如下( 文件名称为file.txt ): 文件中行内容为:  12:3   a  4:56   b awk  '{print $1}'  ...

  3. Java并发编程:Java实现多线程的几种方式

    在Java中,多线程主要的实现方式有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService ...

  4. 【深度学习】K-L 散度,JS散度,Wasserstein距离

    度量两个分布之间的差异 (一)K-L 散度 K-L 散度在信息系统中称为相对熵,可以用来量化两种概率分布 P 和 Q 之间的差异,它是非对称性的度量.在概率学和统计学上,我们经常会使用一种更简单的.近 ...

  5. JQuery学习笔记(4)——ajax

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML) 原生 例子 点击按钮,访问服务器上的ajax_info.txt文件,获得txt ...

  6. JQuery学习笔记(2)——数组 属性 事件

    each遍历 JQueryObjectArray.each(function(index,Element)) $(".myTable").each(function(i,ele){ ...

  7. java基础(15):常用API(Object、String、StringBuffer)

    1. Java的API及Object类 在以前的学习过程中,我们都在学习对象基本特征.对象的使用以及对象的关系.接下来我们开始使用对象做事情,那么在使用对象做事情之前,我们要学习一些API中提供的常用 ...

  8. 服务端性能测试技能tree

    ALL: Left: Right: 摘抄一下(觉得不错) 以下来自百度百科 ---- 软件性能测试 软件性能测试是在交替进行负荷和强迫测试时常用的术语.理想的“软件性能测试”(和其他类型的测试)应在需 ...

  9. ZooKeeper安装、配置和使用

    Zookeeper的概述: ZooKeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. ZooKeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架, ...

  10. GALAXY OJ NOIP2019联合测试2-普及组

    概要: 今天比了个赛,还挺水,只不过不太理想. 题目: Problem : 韬韬抢苹果 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果.每个韬韬都想要最大的苹果,所以发 ...