cf 786 B 线段树优化建图
cf 786 B
链接
思路
n个点,3种建边方式,规模\(O(n^2)\)
线段树优化建图
注意
读入的数据好坑啊,说好的v,u变成了u,v。
两棵树,一棵出,一棵入。线段树的作用只不过是按照那个形状建边而已,并没啥用。
初始父亲儿子连边,两棵树的叶子结点一一连边,边权为0。(实际中可以直接共用叶子结点)
大佬的图很不错,引用一下
然后在把其他关系引用到上面就行了
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,q,S;
struct node {
int v,nxt;
ll q;
}G[N<<4];
int head[N<<3],tot,cnt;
void add(int u,int v,int q,int opt) {
if(opt) swap(u,v);
G[++tot].v=v;
G[tot].q=q;
G[tot].nxt=head[u];
head[u]=tot;
}
struct seg {
#define ls rt<<1
#define rs rt<<1|1
int id[N<<3];
void build(int l,int r,int rt,int opt) {
if(l==r) return id[rt]=l,void();
id[rt]=++cnt;
int mid=(l+r)>>1;
build(l,mid,ls,opt);
build(mid+1,r,rs,opt);
add(id[rt],id[ls],0,opt);
add(id[rt],id[rs],0,opt);
}
void modify(int L,int R,int u,int q,int l,int r,int rt,int opt) {
if(L<=l&&r<=R) return add(u,id[rt],q,opt);
int mid=(l+r)>>1;
if(L<=mid) modify(L,R,u,q,l,mid,ls,opt);
if(R>mid) modify(L,R,u,q,mid+1,r,rs,opt);
}
}a,b;
struct edge {
int id;
ll val;
edge(int a=0,ll b=0) {id=a,val=b;}
bool operator < (const edge &b) const {
return val>b.val;
}
};
priority_queue<edge> Q;
ll dis[N];
void dij() {
memset(dis,0x3f,sizeof(dis));
dis[S]=0;
Q.push(edge(S,0));
while(!Q.empty()) {
edge u=Q.top();
Q.pop();
if(dis[u.id]!=u.val) continue;
for(int i=head[u.id];i;i=G[i].nxt) {
int v=G[i].v;
if(dis[v]>dis[u.id]+G[i].q) {
dis[v]=dis[u.id]+G[i].q;
Q.push(edge(v,dis[v]));
}
}
}
}
int main() {
n=cnt=read(),q=read(),S=read();
a.build(1,n,1,0);
b.build(1,n,1,1);
for(int i=1;i<=q;++i) {
int opt=read();
if(opt==1) {
int u=read(),v=read(),w=read();
add(u,v,w,0);
} else if(opt==2) {
int u=read(),l=read(),r=read(),w=read();
a.modify(l,r,u,w,1,n,1,0);
} else if(opt==3) {
int u=read(),l=read(),r=read(),w=read();
b.modify(l,r,u,w,1,n,1,1);
}
}
dij();
for(int i=1;i<=n;++i) {
if(dis[i]==0x3f3f3f3f3f3f3f3fLL) dis[i]=-1;
printf("%I64d ",dis[i]);
}
return 0;
}
cf 786 B 线段树优化建图的更多相关文章
- 【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 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图
Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢 ...
- 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 最 ...
- Codeforces 1045A Last chance 网络流,线段树,线段树优化建图
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...
随机推荐
- linux下——java——new Font("Times New Roman", 0, 18)验证码图片变成字符
j'ava部署到了tomcat,发现了一个问题,我们登录的验证码出现了乱码,和字符 然而在windows服务器上,或者说我们本地的开发环境上面,则没有这种现象, 这是为什么? 查看源码,发现有一段代码 ...
- Kafka使用多个分区时 consumer的Assign配置
天天在给自己挖坑排坑... 因为要开多线程消费,所以分区加到了10,两个broker. Producer没有做特殊处理,所以是随机发到Partitions. 但是Consumer只做Subscribe ...
- Nginx 配置跨域权限
今天设置静态资源服务器时发现 Font from origin 'http://start.fbzl.org' has been blocked from loading by Cross-Origi ...
- ionic resources
下面是我在使用ionic,cordova,angularjs的时候经常使用的资源. ionic css components cordova documentation ionic icons ngC ...
- Ace教你一步一步做Android新闻客户端(三) JSON数据解析
对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,现在给大家讲解一下json这个知识点, 1 如何通过json-lib和gson这两个json解析库来对解析我们的j ...
- cloudera manager的7180 web界面访问不了的解决办法(图文详解)
说在前面的话 我的机器是总共4台,分别为ubuntucmbigdata1.ubuntucmbigdata2.ubuntucmbigdata3和ubuntucmbigdata4.(注意啦,以下是针对Ub ...
- 飞檐走壁navMesh
http://www.manew.com/thread-106030-1-1.html
- Linux文本处理工具
Linux文本处理工具 Linux中熟练的使用文本处理工具非常的重要, 因为Linux在设计的时候是采用一切皆文件的哲学的, 甚至连计算机中的配置也都使用伪文件系统来表示, 要查询里面的内容就是对文件 ...
- JavaScript对象 原型
javascript对象就是一组数据和功能的集合,除原始类型(string.number.boolean.null.undefined)之外,其余都是对象. 可以通过对象直接量(字面量).new.和O ...
- openssl命令使用
openssl openssl是个密码工具集,提供多端接口调用方式 组成: 1. 代码库 libcryto ,libssl(ssl/tls) 2. 工具集 openssl 对称加密 对称加密主要是用a ...