题面:786B - Legacy

代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define ll long long
using namespace std;
inline ll rd(){
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=(1e5)+,maxq=maxn;
const ll inf=1ll<<;
int N,S,Q,o,v,u,ql,qr,num_edge=,edge_head[maxn*];
int tr[maxn*][],cnt;
ll w,Dis[maxn*];
bool vis[maxn*];
struct Num_{
int id;ll dis;
bool operator < (const Num_&a) const{
return a.dis<dis;
}
}e;
priority_queue<Num_>pri;
struct Edge{ int to,nx; ll dis; }edge[maxn*];
inline void Add_edge(int from,int to,int dis){
edge[++num_edge].nx=edge_head[from];
edge[num_edge].to=to;
edge[num_edge].dis=dis;
edge_head[from]=num_edge;
return;
}
void Build(int x,int l,int r){
if(l==r){
tr[x][]=tr[x][]=l;
return;
}
int m=(l+r)>>;
tr[x][]=++cnt; tr[x][]=++cnt;
Build(x<<,l,m); Build(x<<|,m+,r);
Add_edge(tr[x][],tr[x<<][],);
Add_edge(tr[x][],tr[x<<|][],);
Add_edge(tr[x<<][],tr[x][],);
Add_edge(tr[x<<|][],tr[x][],);
return;
}
void Update(int x,int l,int r,int ql,int qr,int u,int val,int op){
if(ql<=l&&r<=qr){
if(op==) Add_edge(u,tr[x][],val);
else Add_edge(tr[x][],u,val);
return;
}
int m=(l+r)>>;
if(ql<=m)Update(x<<,l,m,ql,qr,u,val,op);
if(qr>m)Update(x<<|,m+,r,ql,qr,u,val,op);
return;
}
inline void Dijkstra(int s){
for(int i=;i<=cnt;i++)Dis[i]=inf;
Dis[s]=;
e.id=s;e.dis=;
pri.push(e);
while(!pri.empty()){
int x=(pri.top()).id;
pri.pop();
if(vis[x])continue;
vis[x]=;
for(int i=edge_head[x];i;i=edge[i].nx){
int y=edge[i].to;
if(Dis[x]+edge[i].dis<Dis[y]){
Dis[y]=Dis[x]+edge[i].dis;
e.id=y;e.dis=Dis[y];
pri.push(e);
}
}
}
return;
}
int main(){
N=rd();Q=rd();S=rd();
cnt=N;
Build(,,N);
while(Q--){
o=rd();
if(o==){
v=rd();u=rd();w=rd();
Add_edge(v,u,w);
}
else {
v=rd();ql=rd();qr=rd();w=rd();
if(o==)
Update(,,N,ql,qr,v,w,);
else//o==3
Update(,,N,ql,qr,v,w,);
}
}
Dijkstra(S);
for(int i=;i<=N;i++)
if(Dis[i]!=inf)printf("%lld ",Dis[i]);
else printf("-1 ");
return ;
}

邻接表建图版

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define make(a,b) (make_pair(a,b))
#define ll long long
using namespace std;
inline ll rd(){
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=(1e5)+,maxq=maxn;
const ll inf=1ll<<;
int N,Q,S,trIn[maxn<<],trOut[maxn<<];
int u,v,ql,qr,o,cnt;
bool vis[maxn<<];
vector<pair<int,ll> >edge[maxn<<];//to,val
ll w,Dis[maxn<<];
struct Num_{
ll dis;
int id;
bool operator < (const Num_&a) const {
return a.dis<dis;
}
}b;
priority_queue<Num_>pri;
void Build(int x,int l,int r){
if(l==r){
trIn[x]=l;
trOut[x]=l;
return;
}
int mid=(l+r)>>;
trIn[x]=++cnt;trOut[x]=++cnt;
Build(x<<,l,mid);Build(x<<|,mid+,r);
edge[trIn[x]].push_back(make(trIn[x<<],));
edge[trIn[x]].push_back(make(trIn[x<<|],));
edge[trOut[x<<]].push_back(make(trOut[x],));
edge[trOut[x<<|]].push_back(make(trOut[x],));
return;
}
void Update(int x,int l,int r,int ql,int qr,int u,int val,int o){
if(ql<=l&&r<=qr){
if(o==)//In
edge[u].push_back(make(trIn[x],val));
else//Out
edge[trOut[x]].push_back(make(u,val));
return;
}
int mid=(l+r)>>;
if(ql<=mid)Update(x<<,l,mid,ql,qr,u,val,o);
if(qr>mid)Update(x<<|,mid+,r,ql,qr,u,val,o);
return;
}
inline void Dijkstra(int s){
for(int i=;i<=cnt;i++)Dis[i]=inf;
Dis[s]=;
b.dis=;b.id=s;
pri.push(b);
while(!pri.empty()){
int x=(pri.top()).id;
pri.pop();
if(vis[x])continue;
vis[x]=;
int toi=edge[x].size();
for(int i=;i<toi;i++){
int y=edge[x][i].first;
if(Dis[y]>Dis[x]+edge[x][i].second){
Dis[y]=Dis[x]+edge[x][i].second;
b.id=y;b.dis=Dis[y];
pri.push(b);
}
}
}
return;
}
int main(){
N=rd();Q=rd();S=rd();
cnt=N;
Build(,,N);
while(Q--){
o=rd();
if(o==){
v=rd();u=rd();w=rd();
edge[v].push_back(make(u,w));
}
else if(o==){
v=rd();ql=rd();
qr=rd();w=rd();
Update(,,N,ql,qr,v,w,);
}
else {//o==3
v=rd();ql=rd();
qr=rd();w=rd();
Update(,,N,ql,qr,v,w,);
}
}
Dijkstra(S);
for(int i=;i<=N;i++){
if(Dis[i]!=inf) printf("%lld ",Dis[i]);
else printf("-1 ");
}
return ;
}

Vector建图版


By:AlenaNuna

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【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 ...

  9. 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra

    题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...

随机推荐

  1. 远程连接mysql要点 虚拟主机定义与分类

    远程连接mysql:通过主机地址与端口号连接 1. 主机地址:找到主机电脑 2. 端口号:找到对应mysql软件 mysql客户端访问服务端需要进行寻找匹配:连接认证-h 主机地址 例如 -hloca ...

  2. React之js实现跳转路由

    1.新增知识 /* 实现js跳转路由:https://reacttraining.com/react-router/web/example/auth-workflow 1.要引入Redirect im ...

  3. 微信分享图标设置,以及wx.config配置

    最近公司要求我做一个关于页面分享微信显示小图和描述的功能,由于之前没有做过,所以说是从零开始,看jssdk说明文档,网上搜索各种资料,甚至连三四年前的内容都搜索出来了,也试过以前的简单方法,包括在页面 ...

  4. Cocos2d-X多线程(1) 在cocos2d-x中使用多线程

    教科书上说:进程是资源分配的最小单位,线程是CPU调度的最小单位. 进程是程序在计算机上的一次执行活动.直观的讲就是会产生一个pid. int main() {     //业务逻辑代码     re ...

  5. Python学习之数据库

    9.6 表的查询 [结构]select distinct 字段1,字段2 from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit 限制条数 [ ...

  6. python基础--面向对象之绑定非绑定方法

    # 类中定义的函数分为两大类, #一,绑定方法(绑定给谁,谁来调用就自动将它本身当做第一个参数传入) # 1,绑定到类的方法:用classmethod装饰器装饰的方法. # 对象也可以掉用,仍将类作为 ...

  7. MySQL 常用命令和基础语法

    -- mysql 命令 SHOW DATABASES; #查看目前系统中存在的数据库 use database_name; #切换数据库 SHOW TABLES; #显示当前数据库下面的所有可用的表 ...

  8. 第七周课程总结&实验报告

    课程总结 主要学习了抽象类与接口的应用 1.抽象类的成员可以具有访问级别 接口的成员全部public级别 2.抽象类可以包含字段 接口不可以 3.抽象类可以继承接口 接口不能继承抽象类 4.抽象类的成 ...

  9. Spring(三)--Spring bean的生命周期

    Spring bean的生命周期 ApplicationContext Bean生命周期流程 1.需要的实体类 ackage com.xdf.bean; import org.springframew ...

  10. redis 命令都在这了

    DEL key [key ...]删除指定的key(一个或多个) DUMP key导出key的值 EXISTS key [key ...]查询一个key是否存在 EXPIRE key seconds设 ...