codeforces 787D - Legacy 线段树优化建图,最短路
题意:
有n个点,q个询问,
每次询问有一种操作。
操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w;
操作2:[l,r]→u的距离为w
操作3:u到v的距离为w
最终求起点到其他点的最短距离,到达不了输出-1
题解
线段树优化建图+最短路...
不知道这种东西,百度了一下,好像最早的是POI2015的PUS,然后2017/2018的oi也都出过,
还是要见识一下的...
顺便记录一下,封装好的djisktra和graph
代码如下:
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(ii,x) for(int ii=head[x];ii;ii=e[ii].next)
#pragma GCC optimize("Ofast")
#define show(x) cout<<#x<<"="<<x<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<" "<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
using namespace std;
const int maxn=1e6+10,maxm=2e6+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double PI=acos(-1.0);
//head
int casn,n,m,k;
int num[maxn];
class graph{
public:
struct edge{
int from,to;ll cost;
edge(int a,int b,ll c){from=a,to=b,cost=c;}
};
vector<vector<edge>> node;
int ud=0;
graph(int n=maxn,int f=0){node.resize(n+2);ud=f;}
void add(int a,int b,int c=1){node[a].emplace_back(a,b,c);if(ud)node[b].emplace_back(b,a,c);}
}; class dijkstra{
public:
struct road{
int now;ll dis;
road(int a,ll b){now=a,dis=b;}
bool operator<(const road &rhs)const{return dis>rhs.dis;}
};
vector<ll> dis;
priority_queue<road>q;
ll INF;
dijkstra(graph &g,int st){
INF=0x3f3f3f3f3f3f3f3f;
dis.resize(g.node.size()+1,INF);
q.emplace(st,0);
dis[st]=0;
while(!q.empty()){
road t=q.top();q.pop();
for(auto e:g.node[t.now]){
ll cost=t.dis+e.cost;
if(cost<dis[e.to]){
dis[e.to]=cost;
q.emplace(e.to,cost);
}
}
}
}
}; class segtree{
public:
#define nd node[now]
#define ndl node[now<<1]
#define ndr node[now<<1|1]
struct segnode {
int l,r;int id;
int mid(){return (r+l)>>1;}
int len(){return r-l+1;}
};
graph *g;
int cnt,flag;
vector<segnode> node;
vector<int> ff;
segtree(int n,graph *x,int y,int id) {
g=x;cnt=id;flag=y;
node.resize(n<<2|3);
maketree(1,n);
}
void pushup(int now){
if(!flag){
g->add(nd.id,ndl.id,0);
g->add(nd.id,ndr.id,0);
}else {
g->add(ndl.id,nd.id,0);
g->add(ndr.id,nd.id,0);
}
}
void maketree(int s,int t,int now=1){
nd={s,t,++cnt};
if(s==t){
if(!flag) g->add(nd.id,s,0);
else g->add(s,nd.id,0);
return ;
}
maketree(s,nd.mid(),now<<1);maketree(nd.mid()+1,t,now<<1|1);
pushup(now);
}
void query(int s,int t){
ff.clear();
count(s,t);
}
void count(int s,int t,int now=1){
if(s>nd.r||t<nd.l)return ;
if(s<=nd.l&&t>=nd.r) {
ff.emplace_back(nd.id);
return ;
}
count(s,t,now<<1);count(s,t,now<<1|1);
}
}; int main() {
IO;
int n,q,s;
cin>>n>>q>>s;
graph g(n*10);
segtree intree(n,&g,1,n);
segtree outtree(n,&g,0,intree.cnt);
int k,a,b;ll c,d;
while(q--){
cin>>k;
if(k==1){
cin>>a>>b>>c;
g.add(a,b,c);
}else if(k==2){
cin>>a>>b>>c>>d;
outtree.query(b,c);
for(auto &i:outtree.ff) g.add(a,i,d);
}else{
cin>>a>>b>>c>>d;
intree.query(b,c);
for(auto &i:intree.ff) g.add(i,a,d);
}
}
dijkstra ne(g,s);
rep(i,1,n) cout<<(ne.dis[i]>=ne.INF?-1:ne.dis[i])<<' ';
return 0;
}
codeforces 787D - Legacy 线段树优化建图,最短路的更多相关文章
- CF786B Legacy 线段树优化建图
问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...
- Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
- BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图
复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- Codeforces 1045A Last chance 网络流,线段树,线段树优化建图
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...
随机推荐
- jenkins的安装部署
jenkins安装 参考连接: https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions ...
- Facebook第三方网页登录(JavaScript SDK)
文档网址:https://developers.facebook.com/docs/facebook-login/web#logindialog 一.应用配置 https://www.faceboo ...
- Elastic Stack-Elasticsearch使用介绍(一)
一.前言 Elasticsearch对外提供RESTful API,下面的演示我们主要使用Postman,进行一系列的Demo演示,这款工具方便各位前端大大或者对接口调试的神器: 安装过于简单 ...
- 多项目管理中PMO的作用
随着现代企业规模的不断扩大,多项目同时运行成为了现代企业的常态,以及企业项目化进程的不断深入,大部分企业不再仅仅只运行一个项目,而且数量之大已经超出了人们的想象,如惠普公司每年有3000个左右的项目, ...
- CGPoint、CGSize、CGRect、CGRectEdge的详细使用
http://blog.sina.com.cn/s/blog_953e22700101r7lz.html 在CGGeometry.h里的 CGPoint.CGSize.CGRect.CGRectEdg ...
- Spring Cloud微服务Ribbon负载均衡/Zuul网关使用
客户端负载均衡,当服务节点出现问题时进行调节或是在正常情况下进行 服务调度.所谓的负载均衡,就是当服务提供的数量和调用方对服务进行 取舍的调节问题,在spring cloud中是通过Ribbon来解决 ...
- java异常处理规范
异常处理的优势[存在意义]:异常检测者有检测出异常的能力,但不知道在出现该异常的情况下应该怎么处理.故库方法一般会抛出异常给调用者来处理.所以总结而言,异常处理的优势就是,将处理错误(调用者处理)从检 ...
- JAXB注解的使用详解
前言: 最近一直在做各种接口的对接,接触最多的数据类型就是JSON和XML数据,还有XML中包含JSON的数据,而在Java中对象和XML之间的转换经常用到JAXB注解,抽空在这里总结一下,首先做一下 ...
- [模板] 虚树 && bzoj2286-[Sdoi2011]消耗战
简介 虚树可以解决一些关于树上一部分节点的问题. 对于一棵树 \(T\) 的一个子集 \(S\), 可以在 \(O(|S| \log |S|)\) 的时间复杂度内求出 \(S\) 的虚树. 虚树包括根 ...
- 利用 Python_tkinter 完成 2048 游戏
成品展示 具备基本的数据合并以及分数统计,不同数字的色块不同 产生随机数, 数据无法合并判定以及重新开始选项 同时可以判定游戏失败条件 需求分析 完成基本数据合并算法 游戏结束条件 界面展示 重置按钮 ...