问题描述

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. 201871020225-牟星源 《面向对象程序设计(java)》第一周学习总结

    正文 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daiz ...

  2. mysql中group by 使用

    问题描述 我现在需要查询表test,里面需要安装字段a 进行分组.分组之后还有按照b字段最大的.还要查询出字段c. 我先在使用的数据库是mysql8.0 解决 需注意: group by 分组的时候是 ...

  3. mybatis foreach方法遍历对象

    <delete id="deleteAppUserByIds">    delete from app_userinfo where     <foreach i ...

  4. mysql关联两张表时的编码问题

    Mysql关联两张表时,产生错误提示Illegal mix of collations 1.先用工具把数据库.两张表的编码方式改变 2.这步很重要,需要改变字段的编码方式. ALTER TABLE ` ...

  5. CSS旋转动画和动画的拼接

    旋转动画 第一个样式: @keyframes rotating { from { transform: rotate(0deg); } to { transform: rotate(360deg); ...

  6. oracle视图和索引

    视图和索引 视图 视图的作用 控制数据访问.简化查询.避免重复访问相同的数据 视图的优点 限制用户只能通过视图检索数据,用户看不到底层基表 注意事项 视图可以理解为临时表,会随着真实表的数据变化而自动 ...

  7. Java队列和定时器Timer

       一: Queue详解    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构    Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...

  8. jQuery 源码分析(十二) 数据操作模块 html特性 详解

    jQuery的属性操作模块总共有4个部分,本篇说一下第1个部分:HTML特性部分,html特性部分是对原生方法getAttribute()和setAttribute()的封装,用于修改DOM元素的特性 ...

  9. Linux常用命令之文件编辑命令vim

    vi命令 vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器.Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多 ...

  10. SpringBoot开发案例之mail中文附件名字乱码

    最近在开发一个邮件发送多附件的微服务,使用的是org.springframework.mail.javamail.JavaMailSender;包下面的JavaMailSender 但是发送出来的附件 ...