问题描述

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. USACO Max Flow

    洛谷 P3128 [USACO15DEC]最大流Max Flow 洛谷传送门 JDOJ 3027: USACO 2015 Dec Platinum 1.Max Flow JDOJ传送门 Descrip ...

  2. redhat7.7(centOS7)安装ORACLE 11g出坑教程及问题总结与解决

    写在前面: 环境建议:VM 15.5,因为15.5修复了诸多bug,可以在安装过程中省去不少麻烦 添加新的虚拟机安装redhat7.7 准备redhat7.7的安装包...百度云不让上传噢噢噢噢,这里 ...

  3. HEC-ResSim原文档

              HEC-ResSim Reservoir System Simulation             User's Manual       Version 3.1 May 201 ...

  4. java(一)基础知识

    常见DOS命令: dir:列出当前目录下的文件以及文件夹 md:创建目录 rd: 删除目录 cd:进入指定目录 cd .. :返回上一级目录 cd \:返回根目录 del:删除文件 exit:退出do ...

  5. php+laravel依赖注入浅析

    laravel容器包含控制反转和依赖注入,使用起来就是,先把对象bind好,需要时可以直接使用make来取就好. 通常我们的调用如下. $config = $container->make('c ...

  6. 用sticky.js实现头部导航栏固定

    在页面中,如果页面长度过大,滑动页面时,头部导航栏则会跟着划走. 我的头部导航栏代码为: <div class="headbar"> <center class= ...

  7. SLB外部端口非80时---》转发到nginx---》URL跳转丢失端口的解决方案

    配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常: 如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端口丢 ...

  8. js获取计算机操作系统版本

    如题,想要获取当先计算机的操作系统和版本号的话,可以用如下方法. 首先,创建osversion.js文件,文件里面的代码如下 var osData = [ { name: 'Windows 2000' ...

  9. 数据库——SQL SERVER Transact-SQL 程序设计

    什么是Transact-SQL? 标准SQL不支持过程化控制, 不能完成复杂的功能.T-SQL是过程化SQL语言,   是SQL的扩展 增加了过程化语句 (变量,赋值,分支,循环...)是数据库服务器 ...

  10. C# consume RestApi

    1.RestSharp. Nuget install RestSharp,Newtonsoft.Json. using System; using RestSharp; using Newtonsof ...