线段树优化建树 CF786B

news/2025/2/1 15:08:48/文章来源:https://www.cnblogs.com/sadlin/p/18696309

看到区间操作想到用线段树优化建树,建一棵外向树一棵内向树,用线段树点代表整个区间内的所有点。

大佬的图

https://www.luogu.com.cn/article/ypjofq71

从树上找节点然后连边就可以,最后跑个dijktra就完成了。

我一次就过样例了,改了几次内存就过了这题,太好了!!!

#include <bits/stdc++.h>
#define ll long long
#define int ll
#define ls p<<1
#define rs p<<1|1 
#define re register 
#define pb push_back
#define pir pair<int,int>
#define f(a,x,i) for(int i=a;i<=x;i++)
#define fr(a,x,i) for(int i=a;i>=x;i--)
#define lb(x) x&(-x); 
using namespace std;
const int N=1e6+10;
const int M=8e6+10;
const int mod=1e9+7;int n,q,s;
int cnt;
struct sss{int v,w;
};vector<sss> a[N];struct ss{int l,r,id;
}t1[N<<1],t2[N<<1];int top1,top2;int build1(int p,int l,int r){if(l==r){return t1[l].id;}t1[p].id=p;int mid=(l+r)>>1;t1[p].l=build1(++cnt,l,mid);t1[p].r=build1(++cnt,mid+1,r);a[p].push_back({t1[p].l,0});a[p].push_back({t1[p].r,0});return p;
}int build2(int p,int l,int r){if(l==r){return t2[l].id;}t2[p].id=p;int mid=(l+r)>>1;t2[p].l=build2(++cnt,l,mid);t2[p].r=build2(++cnt,mid+1,r);a[t2[p].l].push_back({p,0});a[t2[p].r].push_back({p,0});return p;
}void change1(int p,int pl,int pr,int l,int r,int x,int w){if(pl>=l&&pr<=r){a[x].push_back({p,w});return;}int mid=(pl+pr)>>1;if(l<=mid) change1(t1[p].l,pl,mid,l,r,x,w);if(r>mid) change1(t1[p].r,mid+1,pr,l,r,x,w);
}void change2(int p,int pl,int pr,int l,int r,int x,int w){if(pl>=l&&pr<=r){a[p].push_back({x,w});return;}int mid=(pl+pr)>>1;if(l<=mid) change2(t2[p].l,pl,mid,l,r,x,w);if(r>mid) change2(t2[p].r,mid+1,pr,l,r,x,w);
}
int dis[N];
int vis[N];
void dijkstra(int s){for(int i=1;i<=cnt;i++) dis[i]=1e18;dis[s]=0;priority_queue<pir,vector<pir>,greater<pir> > q;q.push({0,s});while(!q.empty()){int u=q.top().second;q.pop();if(vis[u]) continue;vis[u]=1;for(auto i:a[u]){int v=i.v;int w=i.w;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;q.push({dis[v],v});}}}
}signed main(){ios::sync_with_stdio(0);cin.tie(nullptr);   cin>>n>>q>>s;for(int i=1;i<=n;i++){t1[i].id=i;t2[i].id=i+n;a[i].push_back({i+n,0});a[i+n].push_back({i,0});}cnt=2*n;top1=build1(++cnt,1,n);top2=build2(++cnt,1,n);for(int i=1;i<=q;i++){int op,u,v,w,l,r;cin>>op;if(op==1){cin>>u>>v>>w;a[u].push_back({v,w});}else if(op==2){cin>>u>>l>>r>>w;change1(top1,1,n,l,r,u+n,w);}else{cin>>u>>l>>r>>w;change2(top2,1,n,l,r,u,w);}}dijkstra(s);for(int i=1;i<=n;i++){if(dis[i]==1e18) cout<<"-1 ";else cout<<dis[i]<<" ";}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877585.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库安全管理中的用户和角色管理:打造安全高效的数据环境

title: 数据库安全管理中的用户和角色管理:打造安全高效的数据环境 date: 2025/2/1 updated: 2025/2/1 author: cmdragon excerpt: 在数字化时代,数据库作为信息存储和处理的核心,安全管理显得尤为重要。用户和角色管理是保障数据库安全性的重要手段,合理的管理策略不仅能…

如何成为销售顶尖高手?这4个方法绝了!

在销售的世界里,业绩高手们总有一套独特的“制胜法则”。他们不仅对产品了如指掌,更擅长与客户沟通,能够在复杂多变的市场中游刃有余,稳操胜券。玩变化:灵活应变,精准出击 高手们深知,销售没有一成不变的模式。他们懂得根据不同客户、场合和时间,灵活调整沟通方式和销售…

分布式事务之2PC两阶段提交

1. 分布式事务概述 1.1 问题背景 在分布式系统中,业务操作可能跨越多个服务或数据库(如订单服务、库存服务、支付服务),传统单机事务(ACID)无法满足跨网络节点的数据一致性需求。网络不可靠:服务间调用可能失败或超时。 数据一致性:不同节点间的状态需最终一致。 性能与…

【SQL】存储过程、函数、触发器

存储过程 存储过程(Stored Procedure)是一种在数据库中保存的SQL语句集合,它可以执行一系列的数据库操作,例如插入、更新、查询等。存储过程可以提高数据库操作的效率,减少网络流量,并且可以封装复杂的逻辑。定义: 存储过程是一组为了完成特定功能的SQL语句集,这些语句…

[Tools] GitHub Action 部署文档网站

关于部署网站,理论上来讲,只要你有一个服务器,你要采用什么样的方式来部署都是可以的。但是前提是你需要有一个服务器(物理机、云服务器)。 这节课我们部署文档网站选择使用 github 来进行部署,因为 GitHub 为我们提供了一个免费的服务器,一个账号只有一个,只要你在 Gi…

[Tools] VitePress搭建文档网站

创建 API 文档可以选择如下的 3 种方式:功能较少,可以直接写在 README.md 文件里面 内容较多,可以单独写一个文件 API 数量众多(Vue、React 这种级别),需要考虑单独拿一个网站来做详细的文档支持这里我们要搭建的网站实际上就是一个文档网站,这个时候我们可以选择静态站…

[Tools] 搭建文档网站

创建 API 文档可以选择如下的 3 种方式:功能较少,可以直接写在 README.md 文件里面 内容较多,可以单独写一个文件 API 数量众多(Vue、React 这种级别),需要考虑单独拿一个网站来做详细的文档支持这里我们要搭建的网站实际上就是一个文档网站,这个时候我们可以选择静态站…

java中的HsahMap

HsahMap HashMap 是 Java 中最常用的集合类之一,它实现了 Map 接口,基于哈希表存储键值对 HashMap的存储是无顺序的 HashMap存储的是键值对(key-value)其中键key是唯一的,值(value)可以重复。 HashMap的底层是数组和链表 HashMap的常见方法 添加方法: 1,put(K key, V valu…

MyBatis的增删改查实现

首先还是使用上一篇文章相同的数据表和实体类,如下图所示1 package com.loubin.pojo;2 3 public class User {4 private int id;5 private String name;6 private String pwd;7 8 public int getId() {9 return id; 10 } 11 12 public void …

Reqable:现代化 API 调试工具

Reqable 是一款专为开发者设计的现代化 API 调试工具,旨在简化 API 开发、测试和调试的流程。 它支持多种协议(如 HTTP、HTTPS、WebSocket 等),并提供了丰富的功能,帮助开发者更高效地构建、调试和分析 API 请求与响应。 Reqable 以其简洁的设计、强大的功能和卓越的性能,…