当前位置: 首页 > news >正文

CF786B Legacy

CF786B Legacy

题意:
给定\(n\)个点
一共有\(m\)个连边,边有三种。
1.从\(u_i\)\(v_i\)的一条长度为\(w_i\)的边。
2.从\(u_i\)\([l,r]\)的一条长度为\(w_i\)的边。
3.从\([l,r]\)\(v_i\)的一条长度为\(w_i\)的边。

问从\(s\)到每一个点的最短路。
\(n,m<=10^5\)


很有意思的题目

显然不可以暴力连边,我们可以拿线段树的思想,让线段树的一个区间代表一个点。

拿两颗线段树分别维护区间连点和点连区间

以点连区间为例,直接拿点连树1的区间。而树1上面的边可以以费用0走到孩子节点。

对应区间连点,就是那树2的区间直接连点。而树2上面的边可以以费用0走到父亲节点。

连接树1树2就行了


Code:

#include <cstdio>
#include <cstring>
#include <queue>
#define ls ch[now][0]
#define rs ch[now][1]
#define ll long long
using namespace std;
const int N=100010;
const ll inf=0x3f3f3f3f3f3f3f3f;
int head[N<<3],to[N<<4],Next[N<<4],cnt;
int n,m,s,ch[N<<3][2],tot,typ;
ll edge[N<<4];
void add(int u,int v,ll w)
{
    edge[++cnt]=w;to[cnt]=v;Next[cnt]=head[u];head[u]=cnt;
}
int build1(int l,int r)
{
    if(l==r) return l;
    int now=++tot;
    int mid=l+r>>1;
    ls=build1(l,mid);
    rs=build1(mid+1,r);
    add(now,ls,0);
    add(now,rs,0);
    return now;
}
int build2(int id,int l,int r)
{
    if(l==r) return l;
    int now=++tot;
    int mid=l+r>>1;
    ls=build2(ch[id][0],l,mid);
    rs=build2(ch[id][1],mid+1,r);
    add(ls,now,0);
    add(rs,now,0);
    add(id,now,0);
    return now;
}
void connect(int now,int l,int r,int L,int R,int pos,ll w)
{
    if(l==L&&r==R)
    {
        if(typ==1)  add(pos,now,w);
        else add(now,pos,w);
        return;
    }
    int mid=L+R>>1;
    if(r<=mid)
        connect(ls,l,r,L,mid,pos,w);
    else if(l>mid)
        connect(rs,l,r,mid+1,R,pos,w);
    else
        connect(ls,l,mid,L,mid,pos,w),connect(rs,mid+1,r,mid+1,R,pos,w);
}
int root[2];
void init()
{
    scanf("%d%d%d",&n,&m,&s);
    tot=n;
    root[0]=build1(1,n);
    root[1]=build2(root[0],1,n);
    int opt,u,v,l,r;ll w;
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&opt);
        if(opt==1)
        {
            scanf("%d%d%lld",&u,&v,&w);
            add(u,v,w);
        }
        else if(opt==2)
        {
            scanf("%d%d%d%lld",&u,&l,&r,&w);//点连区间
            typ=1;
            connect(root[0],l,r,1,n,u,w);
        }
        else
        {
            scanf("%d%d%d%lld",&v,&l,&r,&w);
            typ=0;
            connect(root[1],l,r,1,n,v,w);
        }
    }
}
queue <int> q;
ll dis[N<<3];
int used[N<<3];
void work()
{
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        used[u]=0;
        q.pop();
        for(int i=head[u];i;i=Next[i])
        {
            int v=to[i];
            ll w=edge[i];
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!used[v])
                {
                    used[v]=1;
                    q.push(v);
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(dis[i]==inf)
            printf("-1 ");
        else
            printf("%lld ",dis[i]);
    }
}
int main()
{
    init();
    work();
    return 0;
}

2018.7.20

转载于:https://www.cnblogs.com/butterflydew/p/9342150.html

相关文章:

  • Mysql----管理知识
  • solr搜索分词优化
  • Windows server 2012配置WebDeploy发布网站
  • linux内核(五)虚拟文件系统
  • 如何屏蔽垃圾短信
  • 转载:手把手教你搭建 vue 环境
  • 在 win10 环境下,设置自己写的 程序 开机自动 启动的方法
  • 7-26 单词长度(15 分)
  • HDU 1258 Sum It Up(dfs 巧妙去重)
  • RPC 工作原理
  • MySql的replace into 语句
  • 大数据平台搭建-基础环境安装
  • SQLServer编写自己的切分函数 SPLIT和带排序的切割函数 SPLITSort
  • OPC和DCOM配置
  • 异步IO
  • @angular/forms 源码解析之双向绑定
  • ECMAScript入门(七)--Module语法
  • flutter的key在widget list的作用以及必要性
  • Java小白进阶笔记(3)-初级面向对象
  • LintCode 31. partitionArray 数组划分
  • Linux CTF 逆向入门
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Phpstorm怎样批量删除空行?
  • TypeScript实现数据结构(一)栈,队列,链表
  • 前嗅ForeSpider采集配置界面介绍
  • 设计模式 开闭原则
  • 微信支付JSAPI,实测!终极方案
  • 详解NodeJs流之一
  • 小李飞刀:SQL题目刷起来!
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 整理一些计算机基础知识!
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (十六)串口UART
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)80c52学习之旅-起始篇
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .bat文件调用java类的main方法
  • .net 发送邮件
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @ModelAttribute 注解
  • @RequestMapping 的作用是什么?
  • @ResponseBody
  • [<死锁专题>]
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [20180129]bash显示path环境变量.txt
  • [Angular] 笔记 21:@ViewChild
  • [bzoj1038][ZJOI2008]瞭望塔
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++]C++入门--引用
  • [codeforces]Levko and Permutation