模板题CF786B Legacy

先说算法

如果需要有n个点需要建图

给m个需要建边的信息,从单点(或区间内所有点)向一区间所有点连边

如果暴力建图复杂度\(mn^2\)

以单点连向区间为例,在n个点上建一颗线段树,叶子节点即为这n个点,每个节点向它的左右儿子连一个权值为0的边,这样我们只要向一个节点连边,也就相当于向它所在的区间每个点都连边了(因为连到这个节点,就能顺着线段树中0边权的路一路走到叶子节点,也就是真正存在的节点)

这样可以用类似与线段树区间查找的方法,以\(logn\)的复杂度向\([l,r]\)内所有点连边

如果是区间连向区间(\([l,r]\)连向\([l',r']\)),可以建两颗线段树,一棵in(由外面往这颗树连边)树,一棵out(由这棵树向外连边)树,和一个虚拟节点

在out树中从\([l,r]\)向虚拟节点连边,再由虚拟节点向in树中的\([l',r']\)连边

注意这里out树是有区间往外连,所以线段树中的边是由儿子连向父亲,因为如果编号为pos的节点要向外连一条边,它要先顺着线段树中的边走到某一个父亲,再由此去其他节点

再看这道题就简单了

也是要建一颗in树一颗out树

第一种方案直接连边

第二种方案由节点v向in树中\([l,r]\)连边

第三种由out树中\([l,r]\)向v节点连边

最后跑个最短路就行了

具体实现见代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define R register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,m,s,nn;
int fir[500006],nex[4000005],to[4000006],len[4000006],tot;
struct tr{
tr *ls,*rs;
int id;
}dizhi[400006],*rootin=&dizhi[0],*rootout=&dizhi[1];
int dizhitot=1;
LL dis[500006];
int in[500006];
int dui[500006],size;
inline void push(int x){
dui[size++]=x;
R int i=size-1,fa;
while(i){
fa=i>>1;
if(dis[dui[fa]]<=dis[dui[i]]) return;
std::swap(dui[fa],dui[i]);i=fa;
}
}
inline int pop(){
int ret=dui[0];dui[0]=dui[--size];
R int i=0,ls,rs;
while((i<<1)<size){
ls=i<<1;rs=ls|1;
if(rs<size&&dis[dui[rs]]<dis[dui[ls]]) ls=rs;
if(dis[dui[ls]]>=dis[dui[i]]) break;
std::swap(dui[ls],dui[i]);i=ls;
}
return ret;
}
inline void dij(){
std::memset(dis,0x3f,sizeof dis);
in[s]=1;push(s);dis[s]=0;
while(size){
R int u=pop();in[u]=0;
for(R int i=fir[u];i;i=nex[i]){
R int v=to[i];
if(dis[v]>dis[u]+len[i]){
dis[v]=dis[u]+len[i];
if(!in[v]) push(v),in[v]=1;
}
}
}
}
inline void add(int u,int v,int w){
to[++tot]=v;len[tot]=w;
nex[tot]=fir[u];fir[u]=tot;
}
void build(tr *treein,tr *treeout,int l,int r){
if(l==r){treein->id=treeout->id=l;return;}
int mid=(l+r)>>1;
treein->ls=&dizhi[++dizhitot];treein->rs=&dizhi[++dizhitot];
treeout->ls=&dizhi[++dizhitot];treeout->rs=&dizhi[++dizhitot];
build(treein->ls,treeout->ls,l,mid);build(treein->rs,treeout->rs,mid+1,r);
treein->id=++nn;treeout->id=++nn;
add(treein->id,treein->ls->id,0);add(treein->id,treein->rs->id,0);
add(treeout->ls->id,treeout->id,0);add(treeout->rs->id,treeout->id,0);
}
void addtreein(tr *tree,int l,int r,int ql,int qr,int u,int w){
if(ql<=l&&r<=qr){add(u,tree->id,w);return;}
int mid=(l+r)>>1;
if(ql<=mid) addtreein(tree->ls,l,mid,ql,qr,u,w);
if(qr>mid) addtreein(tree->rs,mid+1,r,ql,qr,u,w);
}
void addtreeout(tr *tree,int l,int r,int ql,int qr,int v,int w){
if(ql<=l&&r<=qr){add(tree->id,v,w);return;}
int mid=(l+r)>>1;
if(ql<=mid) addtreeout(tree->ls,l,mid,ql,qr,v,w);
if(qr>mid) addtreeout(tree->rs,mid+1,r,ql,qr,v,w);
}
int main(){
nn=n=read();m=read();s=read();
build(rootin,rootout,1,n);
while(m--){
int op=read();
if(op==1){
int u=read(),v=read(),w=read();
add(u,v,w);
}
else if(op==2){
int u=read(),l=read(),r=read(),w=read();
addtreein(rootin,1,n,l,r,u,w);
}
else{
int v=read(),l=read(),r=read(),w=read();
addtreeout(rootout,1,n,l,r,v,w);
}
}
dij();
for(R int i=1;i<=n;i++)
std::printf("%lld ",dis[i]==0x3f3f3f3f3f3f3f3f?-1:dis[i]);
return 0;
}

最后丢下几个例题

洛谷P3588 [POI2015]PUS

题解

 

bzoj5017[Snoi2017]炸弹 /洛谷P5025 [SNOI2017]炸弹

题解,当时交了一页最后发现是没开long long

 

bzoj3073[Pa2011]Journeys,算是一个模板题了,就是那种边从区间连向区间的情况,而且这是01边权,用双端队列bfs就行,看网上好多人都写的dij

但需要权限,所以可以去这上面看看

题解没写

 

bzoj2143飞飞侠,一开始写了个那种三维的dp,但不知道是常数问题还是写炸了已知TLE,之后改的线段树建边

题解依旧没写

 

CF1045A Last chance,这个还需要网络流,不会,以后再写吧。。

CF786B Legacy(线段树优化建边)的更多相关文章

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

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

  2. CF786B Legacy && 线段树优化连边

    线段树优化连边 要求点 \(x\) 向区间 \([L, R]\) 连边, 一次的复杂度上限为 \(O(n)\) 然后弄成线段树的结构 先父子连边边权为 \(0\) 这样连边就只需要连父亲就可以等效于连 ...

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

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

  4. CF786B Legacy 线段树优化建图

    问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...

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

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

  6. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  7. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)

    题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...

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

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

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

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

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

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

随机推荐

  1. Android 启动一个Activity的几种方式

    启动一个Activity的几种方式在Android中我们可以通过下面两种方式来启动一个新的Activity,注意这里是怎么启动,而非启动模式!分为显示启动和隐式启动! 1.显式启动,通过包名来启动,写 ...

  2. search(4)- elastic4s-ElasticDsl

    上次分析了一下elastic4s的运算框架.本来计划接着开始实质的函数调用示范,不过看过了Elastic4s的所有使用说明文档后感觉还是走的快了一点.主要原因是elasticsearch在7.0后有了 ...

  3. Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统

    Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手  来源: 博客园  发布时间: 2011-04-19 11:18  阅读: 1282 次  推荐: 0 ...

  4. 关于连接内部服务器以及redis缓存基本操作

    1.linux命令行远程连接内部服务器 ssh -p 6637 mndevops@172.18.11.183 //建立连接命令 端口号和用户名+ip 输入密码 ./redis-cli 进入redis数 ...

  5. CentOS7.5 使用Docker部署Jumpserver

    1.环境准备 # 查看系统版本 $ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) # 查看内核版本 $ uname -a L ...

  6. Docker-Bridge Network 02 容器与外部通信

    本小节介绍bridge network模式下,容器与外部的通信. 1.前言2.容器访问外部2.1 访问外网2.2 原理2.3 一张图总结2.4 抓包3.外部访问容器3.1 创建nginx容器并从外部访 ...

  7. Salesforce 产品 | 协同办公“大魔王”,Salesforce Quip的使用攻略!

    Salesforce帮助企业渡过疫情难关,支持在线远程办公.7.5亿美金收购的动态文档共享平台Quip,即刻开放给所有Salesforce老客户还有非营利组织免费使用至2020年9月30日. Quip ...

  8. 【转】解决存储过程执行快,但C#程序调用执行慢的问题

    这两天遇到一个问题令人比较郁闷,一个大概120行左右的存储过程在SQL Server2012的查询分析器里面执行,速度非常理想,1秒不到,即可筛选抓取到大概500条数据记录.但在C#程序代码里调用,就 ...

  9. 你的网购价格监督利器——python+爬虫+微信机器人

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:风,又奈何 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  10. week homework: 大家来找茬

    上周课程主题为用户体验,每位同学也根据自己使用APP的体验,例举出一些手机或电脑客户端软件的bug或用户体验非常不好的地方: Tianfu: GitHub.com:界面不够直观,有许多功能不知道入口在 ...