首页 > 其他分享 >P1119 灾后重建

P1119 灾后重建

时间:2024-05-16 10:42:35浏览次数:21  
标签:int P1119 询问 mid 时间 灾后 include 重建

题目链接P1119 灾后重建
先读题意,就是求在 \(t\) 时间时当前 \(a\) 到 \(b\) 的最短路,并且当前 \(a\) 和 \(b\) 村都必须重建完毕。即然一两点间距离。再看一眼数据范围,可以知道需要用到 Floyd 算法。

比较暴力的,可能会用 \(n\) 次 Floyd 把每次时间的两点间距算出,但这样是 \(O(n^4)\) 时间太高。
根据题意,有村庄修复有时间的限制,实际上,时间的限制不就是可通过村子的限制吗,再回想一下 Floyd 的方程,不就是在前可通过前 \(k\) 个点中,两点间最短距离吗?只要考虑到这点,这题就简单了。

比较好玩的,题目中点是 \(0\) 到 \(n - 1\) 的,我们可以把所有点 \(+1\) 变成 \(1\) 到 \(n\) 的便于操作。

题目很仁慈,村庄重建完成的时间和询问的时间都是不降的,这就不用我们去排序了。
因为是不降的,对于每次询问有个时间 \(t\),我们需要知道在 \(t\) 时有对少个村庄已经修复,这是什么?二分查找。在重建时间中二分,取最大的重建时间小于等于 \(t\) 的点,把这个询问加进,这个点的询问序列中。因为询问时间不降,你加进去的序列也就是不降的,且符合询问的顺序,也就不需要我们再去映射了。注意,二分的时候要存在时间为 \(0\) 的点。

到这题目就基本结束了,看看代码吧。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>

using namespace std;

const int N = 210, M = 50010;

int n, m;
int g[N][N];
int t[M];

struct Node
{
    int a, b, t;
}res[M];

vector<Node> q[N]; // 对于每个点i的询问

int find(int x) // 二分
{
    int l = 0, r = n;
    
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (x >= t[mid]) l = mid;
        else r = mid - 1;
    }
    return l;
}

int main()
{
    cin >> n >> m;
    
    memset(g, 0x3f, sizeof g);
    for (int i = 1; i <= n; i ++ ) 
    {
        cin >> t[i];
        g[i][i] = 0;
    }
    
    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        a ++ , b ++ ;  // 平移,点的坐标
        g[a][b] = g[b][a] = min(g[a][b], c);
    }
    cin >> m;
    
    for (int i = 1; i <= m; i ++ )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        a ++ , b ++ ;
        res[i] = {a, b, c}; // 存储的原询问,其实可以和下面一步写在一起,省空间
    }
    
    for (int i = 1; i <= m; i ++ ) // 分配询问
    {
        int x = find(res[i].t);
        q[x].push_back(res[i]);
    }
    
    for (int k = 0; k <= n; k ++ ) // 注意从0开始,防止有t = 0的询问,而重建时间里没有0
    {
        for (int i = 1; i <= n; i ++ ) // 基本的 Floyd 
            for (int j = 1; j <= n; j ++ )
                g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
        for (auto r : q[k]) // 解决当前点的询问,即在r询问的时间时,前k个村庄已经修复
        {
            int w = g[r.a][r.b];
            if (t[r.a] > r.t || t[r.b] > r.t) cout << -1 << endl;
            else if (w <= 0x3f3f3f3f / 2) cout << w << endl;
            else cout << -1 << endl;
        }
    }
    return 0;
}

标签:int,P1119,询问,mid,时间,灾后,include,重建
From: https://www.cnblogs.com/blind5883/p/18195504

相关文章

  • openGauss 例行重建索引
    例行重建索引背景信息数据库经过多次删除操作后,索引页面上的索引键将被删除,造成索引膨胀。例行重建索引,可有效的提高查询效率。数据库支持的索引类型为B-tree索引,例行重建索引可有效的提高查询效率。如果数据发生大量删除后,索引页面上的索引键将被删除,导致索引页面数量的减少......
  • 基于FBG传感器的形状重建算法仿真
    算法涉及基本的[[FBG传感器模型]],一般通过刻有若干个布拉格光栅的光纤集成到被测物体上,当光纤与被测物体同时发生形变的时候,布拉格光栅产生应变,从而产生波长的漂移,通过对入射光与反射光波长漂移的检测,可以计算得到光纤上若干个点的曲率与挠率。在微分几何中,可以通过[[Frenet–S......
  • 35天【代码随想录算法训练营34期】第八章 贪心算法 part04 ( ● 860.柠檬水找零 ● 4
    860.柠檬水找零classSolution:deflemonadeChange(self,bills:List[int])->bool:amt_five=0amt_ten=0amt_twenty=0foriinbills:ifi==5:amt_five+=1elifi==10:......
  • 重建计划 题解
    题意:一棵树,有边权,求边权平均值最大且经过点数在\([L,R]\)的路径长度.Solution首先二分答案\(x\),每条边权减去\(x\)后问题转为求最大路径长度,若答案\(\ge0\)则可行1边分治保平安。先转二叉树,这里有两种方法:一种是像线段树一样建,另一种是普通贪心的建,反正都可以然后边......
  • 基于dremio 安装包进行源码依赖包maven 私服重建的一个思路
    dremio25.0版本已经发布了,但是如果希望自己源码构建,但是缺少一些依赖造成编译会有问题,但是我们可以直接基于官方提供的下载包的文件进行maven私服的重建,以下说明下简单流程参考流程下载软件包这个可以从dremio官网下载到最好选择一个可以构建的分支本地构建下此步......
  • 最具有影响力的三个视觉平台 | 3D高斯、场景重建、三维点云、工业3D视觉、SLAM、三维
    大家好,我是小柠檬这里给大家推荐三个国内具有影响力的3D视觉方向平台!原文:最具有影响力的三个视觉平台|3D高斯、场景重建、三维点云、工业3D视觉、SLAM、三维重建、自动驾驶......
  • 使用miniforge平替anaconda,重建airflow服务
    背景因公司通知不能使用anaconda,可以采用miniforge作为开源平替,因之前环境搭建使用的就是anaconda,当前需要卸载并替换成miniforge。那为什么一定要用这个呢,其实也不是一定,而是用这个搭建环境比较省事,如果没用这个,我当前环境的python版本过低,解决这个问题耗费的时间会更久,所以最......
  • 重建大师带状的空三跑完变形,这种问题该怎么解决?
    跑条带状数据,建议设置下“pos高精度”增强POS约束。重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型,可一键完成空三、自动建模和LOD构建。下载地址:https://daspatial.com/cn/download#实景......
  • OccNet 栅格占据网络:重建智能驾驶场景表征
    随着高阶智能驾驶的发展,长尾障碍物感知成为智驾发力的关键点。驾驶场景中常见的行人、车、障碍物,能够通过3D物体检测等方式实现其位置、大小的估计。而现实世界城区的交通路况中,还存在海量长尾场景问题:如异形车辆、路上的石子、掉落的树叶等障碍物,以3D检测框、点云等传统表......
  • 代码随想录 Day35 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
    860.柠檬水找零 classSolution{public:boollemonadeChange(vector<int>&bills){intfive=0,ten=0,twenty=0;for(intbill:bills){//情况一if(bill==5)five++;//情况二......