[CodeForces]786B Legacy
线段树优化建图。 建立两棵线段树,其上点的点权分别表示“到达这个区间内所有点的最小花费”和“到达这个区间内任意一个点的最小花费”。
对于第一种路直接加边即可 对于第二种路,添加从v到第一棵线段树对应区间中的点的边 对于第三种路,添加从第二棵线段树对应区间中的点到v的边。
可以给每个区间设一个序号,将对应区间与对应点连边就行了。之前一直没有YY出来这个,一直放的。。。
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=300005;
struct Edge{int to,nxt,val;}e[2000005];
int head[N],ecnt,cnt,ql,qr,opt,n,q,S,rt1,rt2;
void add(int bg,int ed,int val) {e[++ecnt].nxt=head[bg];e[ecnt].to=ed;e[ecnt].val=val;head[bg]=ecnt;}
int ls[N],rs[N];
void build1(int &k,int l,int r) {
if(l<r) {
k=++cnt;int mid=l+r>>1;
build1(ls[k],l,mid);build1(rs[k],mid+1,r);
add(k,ls[k],0);add(k,rs[k],0);
}
else k=l;
}
void build2(int &k,int l,int r) {
if(l<r) {
k=++cnt;int mid=l+r>>1;
build2(ls[k],l,mid);build2(rs[k],mid+1,r);
add(ls[k],k,0);add(rs[k],k,0);
}
else k=l;
}
void update(int k,int l,int r,int u,int val) {
if(ql<=l&&r<=qr) {
opt==2?add(u,k,val):add(k,u,val);return;
}
int mid=l+r>>1;
if(ql<=mid) update(ls[k],l,mid,u,val);
if(mid<qr) update(rs[k],mid+1,r,u,val);
}
long long dis[N];
struct Node {
int id;long long dis;
bool operator < (const Node &rhs) const {return dis>rhs.dis;}
};
void dij() {
priority_queue<Node>q;
q.push({S,0});
memset(dis,0x3f,sizeof dis);
dis[S]=0;
while(!q.empty()) {
Node u=q.top();q.pop();
if(u.dis!=dis[u.id]) continue;
for(int i=head[u.id];i;i=e[i].nxt) {
int v=e[i].to;
if(dis[u.id]+e[i].val<dis[v]) {
dis[v]=dis[u.id]+e[i].val;q.push({v,dis[v]});
}
}
}
}
int main() {
scanf("%d%d%d",&n,&q,&S);
cnt=n;
build1(rt1,1,n);
build2(rt2,1,n);
int u,v,val;
while(q--) {
scanf("%d",&opt);
if(opt==1) {
scanf("%d%d%d",&u,&v,&val);add(u,v,val);
}
else {
scanf("%d%d%d%d",&u,&ql,&qr,&val);
update(opt==3?rt2:rt1,1,n,u,val);
}
}
dij();
for(int i=1;i<=n;i++)
printf("%lld ",(dis[i]==0x3f3f3f3f3f3f3f3f)?-1:dis[i]);
}
[CodeForces]786B Legacy的更多相关文章
- CodeForces 786B Legacy(线段树优化建图+最短路)
[题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...
- Codeforces 786B Legacy(线段树优化建图)
题目链接 Legacy 首先对于输入的$n$,建立一棵线段树. 显然线段树有大概$2n$个结点,每个节点对应一段区间 我们把这$2n$个结点加入我们的无向图中,一起跑最短路. 具体连边方案: 我们把 ...
- Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...
- CodeForces - 786B Legacy (线段树+DIjkstra+思维)
题意:给N个点和Q条选项,有三种类型的选项:1.从u到v花费w修建一条路:2.从u到下标区间为[L,R]的点花费w修建一条路; 3.从下标区间为[L,R]的点到u花费w修建一条路. 然后求起点s到其余 ...
- Codeforces 786B. Legacy 线段树+spfa
题目大意: 给定一个\(n\)的点的图.求\(s\)到所有点的最短路 边的给定方式有三种: \(u \to v\) \(u \to [l,r]\) \([l,r] \to v\) 设\(q\)为给定边 ...
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- [Codeforces 787D] Legacy
[题目链接] https://codeforces.com/contest/787/problem/D [算法] 线段树优化建边 , 然后用Dijkstra算法求单源最短路 时间复杂度 : O((N ...
- 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 787D Legacy 线段树 最短路
题意: 有\(n(1 \leq n \leq 10^5)\)个点,\(q(1 \leq q \leq 10^5)\)条路和起点\(s\) 路有三种类型: 从点\(v\)到点\(u\)需要花费\(w\) ...
随机推荐
- configure: error: XML configuration could not be found
运行: ./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm 之后出现 Running FastCGI Process M ...
- [ACM] hdu 1035 Robot Motion (模拟或DFS)
Robot Motion Problem Description A robot has been programmed to follow the instructions in its path. ...
- JVM中java类的载入时机
Java虚拟机把描写叙述类的数据从Class文件载入到内存.并对数据进行校验.转换解析和初始化.终于形成能够被虚拟机直接使用的Java类型.这就是虚拟机的载入机制. 类从被载入到虚拟机内存中開始,到卸 ...
- C#之简易猜数字游戏
游戏规则说明: 由系统生成一个随机数,玩家有三次猜数字的机会,如果在三次内猜出数字反馈玩家猜对了,否则Game Over! 代码设计说明: 1.首先设计一个简易的欢迎界面,并提示玩家是否开始游戏: p ...
- CSS学习(十六)-HSLA颜色模式
一.理论: 1.HSLA颜色模式 a.HSLA在HSL基础上添加了不透明度,值越大透明度越低 b.HSLA颜色模式的浏览器兼容性和HSL一样,仅仅有较新版本号的主流浏览器才支持 2.RGBA和HSLA ...
- xcode Automatic signing is unable to resolve an issue with the "ShowCar-IOS" target's entitlements
1.https://stackoverflow.com/questions/37806538/code-signing-is-required-for-product-type-application ...
- 国内物联网平台初探(八):中移物联网开放平台OneNet
平台定位 OneNET是中移物联网有限公司搭建的开放.共赢设备云平台,为各种跨平台物联网应用.行业解决方案,提供简便的云端接入.存储.计算和展现,快速打造物联网产品应用,降低开发成本. IoT Paa ...
- PHP 和 Java 的主要区别有哪些?
PHP 和 Java 的主要区别有哪些? 其实Java方面我要学的真的还有很多,要是有大项目的机会和经验就好,所以提前我肯定要把基础打扎实. 我要学的还有很多,比如前段,后端,还有linux,还有肯定 ...
- JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应其他操作,这是为了安全考虑
JavaScript 内存管理 & 垃圾回收机制 标记清除 js 中最常用的垃圾回收方式就是标记清除.当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为“进入环境”.从逻辑上讲 ...
- hihoCoder-1839 榶榶榶 数学
题面 题意:给你一个500000长度的数字,然后环形的让每位做头,例如123,就有123,231,312三个,然后问这n个数字的和S,S的最小非1因子是多少 题解:每个数字在每个位置都会有一次,如果说 ...