首页 > 其他分享 >线段树优化建图

线段树优化建图

时间:2024-07-19 20:07:37浏览次数:5  
标签:dist int 线段 cin 建图 edge using 优化

线段树优化建图

  • 用途:处理区间连边
  • 做法:建两颗线段树,一颗处理区间的入边,另一颗处理出边(如果用一颗线段树的话,边权就都为0了)

例题: Legacy

板子题,直接看代码

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
const int N = 1e6 + 10;
struct EDGE{int to,next,w;}edge[N<<1];
int head[N],cnt;
auto add = [](int u,int v,int w) -> void {edge[++cnt] = {v,head[u],w};head[u] = cnt;};
int t1[N<<2],t2[N<<2],tot;
void build(int k,int l,int r){
    if(l == r){t1[k] = t2[k] = l;return;}//将叶子节点设为原点
    int mid = (l+r)>>1;
    build(k<<1,l,mid);build(k<<1|1,mid+1,r);
    t2[k] = ++tot;t1[k] = ++tot;
    //出树建图
    add(t2[k<<1],t2[k],0);
    add(t2[k<<1|1],t2[k],0);
    //入树建图
    add(t1[k],t1[k<<1],0);
    add(t1[k],t1[k<<1|1],0);
}
void updateIn(int k,int l,int r,int L,int R,int u,int w){
    if(L <= l && r <= R)return add(u,t1[k],w);//当前区间已经覆盖
    int mid = (l+r)>>1;
    if(L <= mid) updateIn(k<<1,l,mid,L,R,u,w);
    if(R > mid) updateIn(k<<1|1,mid+1,r,L,R,u,w);
}
void updateOut(int k,int l,int r,int L,int R,int u,int w){
    if(L <= l && r <= R) return add(t2[k],u,w);
    int mid = (l+r)>>1;
    if(L <= mid) updateOut(k<<1,l,mid,L,R,u,w);
    if(R > mid) updateOut(k<<1|1,mid+1,r,L,R,u,w);
}
#define pli pair<ll,int>
#define mk make_pair
ll dist[N];
bitset<N> vis;
void dijkstra(int s){
    memset(dist,0x3f,sizeof dist);
    vis.reset();
    dist[s] = 0;
    priority_queue<pli,vector<pli>,greater<pli> > q;
    q.push(mk(0,s));
    while(q.size()){
        int x = q.top().second;q.pop();
        if(vis[x]) continue;
        vis[x] = true;
        for(int i = head[x]; i;i = edge[i].next){
            int y = edge[i].to;
            if(dist[y] > dist[x] + edge[i].w){
                dist[y] = dist[x] + edge[i].w;
                q.push(mk(dist[y],y));
            }
        }
    }
}
int n,q,s;
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    cin>>n>>q>>s;
    tot = n;//提前将前n个点留出来
    build(1,1,n);
    for(int i = 1;i <= q; ++i){
        int op;cin>>op;
        if(op == 1){
            int u,v,w;
            cin>>u>>v>>w;
            add(u,v,w);
        }
        if(op == 2){
            int u,l,r,w;
            cin>>u>>l>>r>>w;
            updateIn(1,1,n,l,r,u,w);
        }
        if(op == 3){
            int v,l,r,w;
            cin>>v>>l>>r>>w;
            updateOut(1,1,n,l,r,v,w);
        }
    }
    dijkstra(s);
    for(int i = 1;i <= n; ++i){
        cout<<(dist[i] == dist[0]?-1:dist[i])<<' ';
    }
}

标签:dist,int,线段,cin,建图,edge,using,优化
From: https://www.cnblogs.com/hzoi-Cu/p/18312292

相关文章

  • 聚类优化:Scikit-Learn中的数据标签分配艺术
    聚类优化:Scikit-Learn中的数据标签分配艺术在聚类分析中,标签分配是一个关键步骤,它直接影响聚类的解释性和实用性。Scikit-Learn(简称sklearn),作为Python中广受欢迎的机器学习库,提供了多种工具和方法来优化聚类标签的分配。本文将详细介绍这些方法,并提供详细的解释和代码示例......
  • mysql联合索引优化
    【MySQL】之联合索引与最左匹配原则王廷云的博客已于2023-12-1009:48:32修改阅读量2k收藏24点赞数28分类专栏:MySQL文章标签:mysql数据库版权MySQL专栏收录该内容27篇文章3订阅订阅专栏前言:最左匹配原则在我们MySQL开发过程中和面试过程中经常遇到,为了加深印象和......
  • 基于Java和MySQL的数据库优化技术
    基于Java和MySQL的数据库优化技术大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何基于Java和MySQL进行数据库优化,提升系统的性能和稳定性。我们将从查询优化、索引使用、事务管理以及连接池配置几个方面来介绍具体的优化技术。1.查询......
  • P3373 【模板】线段树 2(区间乘+加操作,先乘后加原则)
    题目来源:https://www.luogu.com.cn/problem/P3373//题意:对区间[l,r]可以乘法,加法操作,查询和操作。//思路:既有乘法又有加法,肯定是要有两个标记。纯加法和纯乘法操作是很简单的,但是既有乘法又有加法涉及到先乘后加和先加后乘的顺序。//////所以现在是如何将先加后成也可以......
  • Java中的线程池管理与并发性能优化
    Java中的线程池管理与并发性能优化大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Java中有效管理线程池,以及如何通过优化并发性能提升应用的效率。线程池是管理线程的一个重要工具,能够提高系统的并发处理能力,并减少线程创建和销毁的......
  • 101文章解读与程序——中国电机工程学报EI\CSCD\北大核心《考虑气电联合需求响应的
    ......
  • 51文章解读与程序——论文可在知网下载-面向削峰填谷的电动汽车多目标优化调度策略-附
     ......
  • 前端性能优化
    减少请求数量【合并】如果不进行文件合并,有如下3个隐患1、文件与文件之间有插入的上行请求,增加了N-1个网络延迟2、受丢包问题影响更严重3、经过代理服务器时可能会被断开但是,文件合并本身也有自己的问题1、首屏渲染问题2、缓存失效问题......
  • Java垃圾收集器选择与优化策略
    1.垃圾收集算法有哪些,可以聊一下吗?如何确定一个对象是垃圾?要想进行垃圾回收,得先知道什么样的对象是垃圾。1.1引用计数法对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾。如果一个对象没有任何指针对其引用,它就是垃圾。弊端:如果A和B相互持有引......
  • 【数据结构】- 线段树
    前言线段树用于维护区间上的值,可以在$O(\logn)$的时间复杂度内实现单点,区间修改及查询。并且所有满足结合律的运算都可以用线段树进行加速。基本操作建树给你长度为$n$的正整数序列$A$,要你实现单点修改与区间查询。(加和)这就是线段树的基本题目。线段树,字面上来看就是把......