题目描述:

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;
}

CF786B/CF787D Legacy的更多相关文章

  1. [CF787D] legacy

    题目 Rick和他的同事们研究出了一种新的有关放射的公式,于是许多坏人就在追赶他们.所以Rick希望在被坏人抓住之前把遗产给Morty. 在他们的宇宙里总共有n颗行星,每颗行星有它自己的编号(编号为1 ...

  2. 【CF786B】Legacy

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

  3. 题解 CF786B 【Legacy】

    本题要求我们支持三种操作: ① 点向点连边. ② 点向区间连边. ③ 区间向点连边. 然后跑最短路得出答案. 考虑使用线段树优化建图. 建两颗线段树,入树和出树,每个节点为一段区间的原节点集合.入树内 ...

  4. CF786B Legacy && 线段树优化连边

    线段树优化连边 要求点 \(x\) 向区间 \([L, R]\) 连边, 一次的复杂度上限为 \(O(n)\) 然后弄成线段树的结构 先父子连边边权为 \(0\) 这样连边就只需要连父亲就可以等效于连 ...

  5. CF786B Legacy(线段树优化建边)

    模板题CF786B Legacy 先说算法 如果需要有n个点需要建图 给m个需要建边的信息,从单点(或区间内所有点)向一区间所有点连边 如果暴力建图复杂度\(mn^2\) 以单点连向区间为例,在n个点 ...

  6. CF786B Legacy 线段树优化建图

    问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...

  7. 线段树优化建图 || CF786B Legacy

    题面:786B - Legacy 代码: #include<cstdio> #include<cstring> #include<iostream> #includ ...

  8. [CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)

    Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 ...

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

    嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...

随机推荐

  1. Linux目录结构详细

    今日内容 解析映射文件 在 window 和 Linux 系统中都有解析文件,一般名为 host,存放在配置目录 etc 中 在本地机访问网络输入域名时,首先会解析 host 文件,如果域名有对应的i ...

  2. Solution Set - Stirling 数相关杂题

      <好多题的题解>   「洛谷 P5408」第一类斯特林数·行   根据结论 \[x^{\overline{n}}=\sum_i{n\brack i}x^i, \] 我们只需要求出 \( ...

  3. Spring中publish如何将多个Event和多个Listener进行无误差匹配

    从命令模式的维度理解Spring 之Application Event - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中通自定义简单的Event和Listener阐述了Spring中pu ...

  4. Spring Cloud Feign 如何使用对象参数

    概述 Spring Cloud Feign 用于微服务的封装,通过接口代理的实现方式让微服务调用变得简单,让微服务的使用上如同本地服务.但是它在传参方面不是很完美.在使用 Feign 代理 GET 请 ...

  5. ClickHouse在大数据领域应用实践

    一.序言 面向大数据量查询数据库,优点是在较大数据量(千万级)的前提下具有较好的查询性能. 1.应用场景 ClickHouse应用于OLAP(在线分析处理)领域,具体来说满足如下特点使用此技术比较合适 ...

  6. [WPF] 使用 Effect 玩玩阴影、内阴影、 长阴影

    最近在学习怎么用 Shazzam Shader Editor 编写自定义的 Effect,并试着去实现阴影.内阴影和长阴影的效果.结果我第一步就放弃了,因为阴影用到的高斯模糊算法对我来说太太太太太太太 ...

  7. HTTP攻击与防范-PHP安全配置

    实验目的 1.了解PHP攻击带来的危险性. 2.掌握PHP攻击的原理与方法 3.掌握防范攻击的方法 实验原理 由于网站服务器是以单一系统使用者的模式在运行,因此这个系统的使用者账号必须能够读取每个使用 ...

  8. IP网络性能测试工具——Renix Perf

    一.Renix Perf 基于软件的网络及应用服务性能测试工具 · 双臂测试 · 单臂测试 通过测试端点产生网络流量对网络性能进行测量 · TCP.UDP.PING · 语音.视频.HTTP.FTP. ...

  9. RFC2544丢包率测试——信而泰网络测试仪实操

    文章关键词:RFC2544.丢包率.吞吐量. 丢包率概述: 丢包率(Frame Loss Rate)测试的目的是确定DUT在不同的负载和帧长度条件下的丢包率.在稳定负载下,由于网络设备资源缺乏,应该正 ...

  10. SaccadeNet:使用角点特征进行two-stage预测框精调 | CVPR 2020

    SaccadeNet基于中心点特征进行初步的目标定位,然后利用初步预测框的角点特征以及中心点特征进行预测框的精调,整体思想类似于two-stage目标检测算法,将第二阶段的预测框精调用的区域特征转化为 ...