博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF786B/CF787D Legacy
阅读量:5237 次
发布时间:2019-06-14

本文共 2986 字,大约阅读时间需要 9 分钟。

题目描述:

题解:

最短路+线段树优化建图。

考虑本题的边是点->点、段->点和点->段,我们可以建线段树然后拆成入点和出点。

入点:儿子->父亲,边权为0;

出点:父亲->儿子,边权为0;

叶子:出点->入点,边权为0;

那么连续的一段可以用不超过$log\;n$个节点表示,最后跑最短路即可。

代码:

#include
#include
#include
#include
using namespace std;typedef long long ll;const int N = 100050;const ll Inf = 0x3f3f3f3f3f3f3f3fll;template
inline void read(T&x){ T f = 1,c = 0;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();} x = f*c;}int n,Q,S,hed[N*10],cnt,tot;ll dis[N*10];bool vis[N*10];struct EG{ int to,nxt; ll w;}e[30*N];void ae(int f,int t,ll w){ e[++cnt].to = t; e[cnt].nxt = hed[f]; e[cnt].w = w; hed[f] = cnt;}int sta[N],tl;struct segtree{ int s[N<<2][2]; void build(int l,int r,int u) { s[u][0]=++tot,s[u][1]=++tot; if(l==r){ae(s[u][1],s[u][0],0);return ;} int mid = (l+r)>>1; build(l,mid,u<<1),build(mid+1,r,u<<1|1); ae(s[u<<1][0],s[u][0],0),ae(s[u<<1|1][0],s[u][0],0); ae(s[u][1],s[u<<1][1],0),ae(s[u][1],s[u<<1|1][1],0); } int query(int l,int r,int u,int qx,int k) { if(l==r)return s[u][k]; int mid = (l+r)>>1; if(qx<=mid)return query(l,mid,u<<1,qx,k); else return query(mid+1,r,u<<1|1,qx,k); } void query(int l,int r,int u,int ql,int qr,int k) { if(l==ql&&r==qr){sta[++tl]=s[u][k];return ;} int mid = (l+r)>>1; if(qr<=mid)query(l,mid,u<<1,ql,qr,k); else if(ql>mid)query(mid+1,r,u<<1|1,ql,qr,k); else query(l,mid,u<<1,ql,mid,k),query(mid+1,r,u<<1|1,mid+1,qr,k); } void print(int l,int r,int u) { if(l==r){
if(dis[s[u][0]]==Inf)printf("-1 ");else printf("%lld ",dis[s[u][0]]);return ;} int mid = (l+r)>>1; print(l,mid,u<<1);print(mid+1,r,u<<1|1); }}tr;struct Pair{ int x;ll y; Pair(){} Pair(int x,ll y):x(x),y(y){} bool operator < (const Pair&a)const{
return y>a.y;}};priority_queue
q;void dij(){ memset(dis,0x3f,sizeof(dis)); S = tr.query(1,n,1,S,0); dis[S]=0;q.push(Pair(S,0)); while(!q.empty()) { Pair tp = q.top();q.pop(); int u = tp.x;if(vis[u])continue;vis[u] = 1; for(int j=hed[u];j;j=e[j].nxt) { int to = e[j].to; if(dis[to]>dis[u]+e[j].w) { dis[to] = dis[u]+e[j].w; q.push(Pair(to,dis[to])); } } }}int main(){// freopen("tt.in","r",stdin); read(n),read(Q),read(S); tr.build(1,n,1); for(int op,a,b,c,d,i=1;i<=Q;i++) { read(op),read(a),read(b),read(c); if(op==1) { a = tr.query(1,n,1,a,0),b = tr.query(1,n,1,b,1); ae(a,b,c); }else { read(d); if(op==2) { int f = tr.query(1,n,1,a,0); tl = 0;tr.query(1,n,1,b,c,1); for(int j=1;j<=tl;j++) ae(f,sta[j],d); }else { tl = 0;tr.query(1,n,1,b,c,0); int t = tr.query(1,n,1,a,1); for(int j=1;j<=tl;j++) ae(sta[j],t,d); } } } dij(); tr.print(1,n,1); puts(""); return 0;}
View Code

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/11130790.html

你可能感兴趣的文章
年薪二十万
查看>>
Reading Notes : 180211 概述计算机
查看>>
强连通tarjan模版
查看>>
javascript_09-数组
查看>>
多进程与多线程的区别
查看>>
Linux 系统下用源码包安装软件
查看>>
HDU3232 Crossing Rivers 数学期望问题
查看>>
PAT 1145 1078| hashing哈希表 平方探测法
查看>>
安装redis 后本地系统空间越来越小
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
SVD综述和Mahout中实现
查看>>
Linux第七周学习总结——可执行程序的装载
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
细说php(二) 变量和常量
查看>>
iOS开发网络篇之Web Service和XML数据解析
查看>>
Windows 7 x64环境下JDK8安装过程
查看>>
UVA - 11077 Find the Permutations (置换)
查看>>
个人寒假作业项目《印象笔记》第一天
查看>>
table 数据少时 ,tr高度变化
查看>>
使用ASP.NET加密口令
查看>>