题目描述:

luogu

cf

cf

题解:

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

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

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

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

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

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

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100050;
const ll  Inf = 0x3f3f3f3f3f3f3f3fll;
template<typename T>
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<Pair>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

CF786B/CF787D Legacy相关推荐

  1. 【CF786B】Legacy

    题目大意:初始给定 N 个点,支持三种操作:两点之间连边:一个点与一个连续区间编号的点之间连边:一个连续区间内的点和一个点连边,求执行 N 次操作之后的单源最短路. 题解:学会了线段树优化建图. 发现 ...

  2. Luogu CF786B Legacy

    https://www.luogu.org/problemnew/show/CF786B CF786B Legacy 104通过 404提交 题目来源CodeForces 786B 评测方式Remot ...

  3. [CF786B]Legacy

    Legacy 题解 看到题目应该是容易想到最短路的,但是由于区间到单点与单点到区间的边我们需要想些办法来维护. 于是,我们就想到了通过虚点来进行维护.但总不能每个区间都建一个点,只能利用线段树来对各个 ...

  4. CF786B Legacy(线段树优化建边模板 + 最短路)

    整理的算法模板合集: ACM模板 目录 线段树优化建边 题目传送门 由于本题的数据达到了1e5,所以如果直接全部暴力连边的话会达到O(n2)O(n^2)O(n2),时间包括内存都受不了.因此我们需要使 ...

  5. CF-786B(Legacy) 区间最短路

    题意 有三种边[u,v], [u, [L,R]], [[L,R], v],求从S出发到其他所有点的最短路 思路 线段树维护区间建图 #include <bits/stdc++.h> con ...

  6. CF786B Legacy

    第一次写线段树优化建边. 根据本题的要求,我们可以建两棵线段树,然后在建$n$个点,然后把第一棵线段树上每一个点$(p, l, r)$(结点编号为$p$, 表示区间是$[l, r]$),连边$\for ...

  7. CF786B Legacy(线段树优化建图)

    传送门 ovo这题该怎么做呢?我们首先考虑暴力建图,但是因为建图的操作太多直接就会MLE,所以这个就别想了-- 我们考虑如何优化建图.因为发现一个点可以向一个区间连边,一个区间也可以向一个点连边,想到 ...

  8. CF786B Legacy 线段树优化建图

    洛谷题目链接 题意 首先想到单源最短路,但是如果暴力模拟就会导致从区间里每一个点连向另一个点时最坏情况时间复杂度达到O(N*N),显然会TLE.那么看到区间操作,自然会想到处理区间操作的数据结构,这一 ...

  9. codefores 786B. Legacy(最短路,线段树优化拆点,好题)

    题目链接 B. Legacy time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

最新文章

  1. 阿里、拼多多P8面试分享!
  2. 删除windows隐藏的本地连接
  3. jzoj1264,P2866-乱头发节,糟糕的一天Bad Hair Day【单调栈】
  4. ZZULIOJ 1096: 水仙花数(函数专题)
  5. jquery 表单验证
  6. 我的 Hive 为什么跑不起来/跑得慢?看看是不是少了这几行代码?
  7. [2018.07.31 T3] 第三题
  8. 最全计算机基础知识竞赛试题,计算机基础知识竞赛试题.doc
  9. 银联扫码支付java,银联商务扫码支付-被扫业务
  10. html万花筒相册旋转效果,jquery css3 3D万花筒图片相册展示特效
  11. canvas绘制竖排的数字_微信小程序利用Canvas绘制图片和竖排文字详解
  12. model.show_result()导致jupyter lab提示服务似乎挂掉,但会立刻重启
  13. (64)计数器设计(递减计数器)
  14. 停车场web项目(内含有数据库)
  15. Facebook多账号运营如何防关联
  16. 一款非常nice的国产U盘启动制作工具——Ventoy
  17. google gms安装
  18. 搞笑决战水源之巅收藏六 师傅
  19. 实用帖!分享5个素材丰富的资源网站
  20. 【C++IO流】C++打印浮点数小数点后多少的方法,序列化

热门文章

  1. jdk18是哪个版本_jdk18是哪个版本
  2. springMVC中的@ModelAttribute注解
  3. Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  4. Webpack升级优化小记:happyPack+dll初体验
  5. Linux 安装宝塔面板
  6. 矢量的点成(标量积)和矢量积
  7. oracle误删数据恢复的方法-delete
  8. python socket传输图片
  9. 2022浙大CS考研
  10. 简化生活之让AI以指定格式输出