BZOJ 4144: [AMPPZ2014]Petrol 最短路+最小生成树+倍增

xctf攻防世界 MISC高手进阶区 low 1. 进入环境,下载附件 给出的一张bmp图片,没有其他信息 2. 问题分析 扔进binwalk中,没有发现有用信息 使用zsteg,没有有用信息 塞入StegSolve中,发现有点猫腻,如图: 有点二维码的感觉,emmm,需要像素处理,但不知道如何下手,参考网上的wp,发现是让使用lsb隐写,copy代码: from PIL import Image img = Image.open('./pic/low.bmp') img_tmp = img.copy() pix = img_tmp.load() 阅读详情

时空隧道


首先还是说这道题的收获吧…
一定要dij一定要把点和dis都扔进堆里,之前都是开一个数组保存dis,这样会T:
TLE:

struct M{
    int node;
    friend bool operator < (M a,M b){
        return dis[a.node]>dis[b.node];
    }
    M(int a=0){
        node=a;
    }
};
inline void dijkstra(void){
 priority_queue<M>pq;
 memset(vis,0,sizeof(vis));memset(dis,inf,sizeof(dis));
 for(int i=1;i<=S;i++)
    vis[c[i]]=1,dis[c[i]]=0,pq.push(M(c[i])),from[c[i]]=c[i];
    while(!pq.empty()){
        int top=pq.top().node;pq.pop();
        for(int i=hd[top];i!=-1;i=nxt[i])
            if(dis[to[i]]>dis[top]+w[i]){
                dis[to[i]]=dis[top]+w[i],from[to[i]]=from[top];
                if(!vis[to[i]])
                    vis[to[i]]=1,pq.push(to[i]);
            }
    }
}

快一点的:

struct M{
    int node;
    long long di;
    friend bool operator < (M a,M b){
        return a.di>b.di;
    }
    M(int a=0,long long b=0){
        node=a;di=b;
    }
};
inline void dijkstra(void){
    priority_queue<M> pq;
    for(int i=1;i<=S;i++)
        dis[c[i]]=0,pq.push(M(c[i],0)),from[c[i]]=c[i];
    while(!pq.empty()){
        int top=pq.top().node;long long di=pq.top().di;pq.pop();
        if(di!=dis[top])
            continue;
        for(int i=hd[top];i!=-1;i=nxt[i])
            if(dis[to[i]]>dis[top]+w[i])
                 dis[to[i]]=dis[top]+w[i],
                 from[to[i]]=from[top],
                 pq.push(M(to[i],dis[to[i]]));
    }
}

然后就是如果数组是long long其他相关数组也要开成long long…
一定要掌握好inf的大小…
不要随便用clock()…bzoj是会RE的…(调试的时候为了看时间用了clock,教的时候忘记删RE到死QAQ)…


分析:
我们考虑从一个点走到另一点显然是经过了若干个加油站的…那么这条路上的限制只和加油站之间的距离有关系…其他点都是打酱油的QAQ…
所以我们求出来各个加油站之间的最短路,然后做最小生成树…查询的时候倍增查询…
由于原图不联通,所以我们需要一个虚根…


代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
//by NeighThorn
#define inf 1000000000000000000
using namespace std;
const int maxn=200000+5,maxm=200000+5; 
int n,S,m,tot,c[maxn],hd[maxn],to[maxm*4],nxt[maxm*4],cnt,q,from[maxn],fa[maxn][30],dep[maxn];
long long diss[maxn][30],dis[maxn],w[maxm*4];
struct M{
    int node;
    long long di;
    friend bool operator < (M a,M b){
        return a.di>b.di;
    }
    M(int a=0,long long b=0){
        node=a;di=b;
    }
};
struct edge{
    int x,y;
    long long ww;
    friend bool operator < (edge a,edge b){
        if(a.ww==b.ww)
            return min(a.x,a.y)<min(b.y,b.x);
        return a.ww<b.ww;
    }
}lala[maxm*4],e[maxm];
inline int read(void){
    char ch=getchar();int x=0;
    while(!(ch>='0'&&ch<='9'))
        ch=getchar();
    while(ch>='0'&&ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x;
}
inline void add(int x,int y,long long s){
    w[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
    w[cnt]=s;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++;
}
inline int find(int x){
    return fa[x][0]==x?x:fa[x][0]=find(fa[x][0]);
}
inline void dijkstra(void){
    priority_queue<M> pq;
    for(int i=1;i<=S;i++)
        dis[c[i]]=0,pq.push(M(c[i],0)),from[c[i]]=c[i];
    while(!pq.empty()){
        int top=pq.top().node;long long di=pq.top().di;pq.pop();
        if(di!=dis[top])
            continue;
        for(int i=hd[top];i!=-1;i=nxt[i])
            if(dis[to[i]]>dis[top]+w[i])
                dis[to[i]]=dis[top]+w[i],from[to[i]]=from[top],pq.push(M(to[i],dis[to[i]]));
    }
}
inline void kruskal(void){
    sort(lala+1,lala+tot+1);
    for(int i=1;i<=tot;i++){
        int fx=find(lala[i].x),fy=find(lala[i].y);
        if(fx!=fy)
            fa[fx][0]=fy,add(lala[i].x,lala[i].y,lala[i].ww);
    }
}
inline void dfs(int root,int f){
    for(int j=1;j<=25;j++)
        fa[root][j]=fa[fa[root][j-1]][j-1],diss[root][j]=max(diss[root][j-1],diss[fa[root][j-1]][j-1]);
    for(int i=hd[root];i!=-1;i=nxt[i])
        if(to[i]!=f)
            fa[to[i]][0]=root,diss[to[i]][0]=w[i],dep[to[i]]=dep[root]+1,dfs(to[i],root);
}
inline bool redouble(int x,int y,int b){
    long long ans=0;
    if(dep[x]<dep[y])
        swap(x,y);
    int d=dep[x]-dep[y];
    for(int i=25;i>=0;i--)
        if(dep[fa[x][i]]>=dep[y]){
            ans=max(ans,diss[x][i]),x=fa[x][i];
            if(ans>b)
                return false;
        }
    if(x==y)
        return ans<=b;
    for(int i=25;i>=0;i--)
        if(fa[x][i]!=fa[y][i]){
            ans=max(ans,max(diss[x][i],diss[y][i])),x=fa[x][i],y=fa[y][i];
            if(ans>b)
                return false;
        }
    ans=max(ans,max(diss[x][0],diss[y][0]));
    return ans<=b;
}
signed main(void){
    n=read();S=read();m=read();
    memset(hd,-1,sizeof(hd));
    for(int i=1,x;i<=S;i++)
        c[i]=read();
    for(int i=1,s,x,y;i<=m;i++)
        x=read(),y=read(),s=read(),add(x,y,(long long)s),e[i].x=x,e[i].y=y,e[i].ww=s;
    for(int i=1;i<=n;i++)
        fa[i][0]=i,dis[i]=inf;
    dijkstra();cnt=0;tot=0;
    for(int i=1;i<=m;i++)
        if(from[e[i].x]!=from[e[i].y])
            lala[++tot].x=from[e[i].x],lala[tot].y=from[e[i].y],lala[tot].ww=dis[e[i].x]+dis[e[i].y]+e[i].ww;
    memset(hd,-1,sizeof(hd));
    for(int i=1;i<=S;i++)
        lala[++tot].x=0,lala[tot].y=c[i],lala[tot].ww=inf;
    kruskal();dep[0]=0;fa[0][0]=0;dfs(0,-1);
    q=read();int x,y,b;
    while(q--){
        x=read();y=read();b=read();
        if(!redouble(x,y,b))
            puts("NIE");
        else
            puts("TAK");
    }
    return 0;
}

by >_< NeighThorn

cuMotion 入门教程(一)面向机器人学的GPU加速运动生成技术 NVIDIA cuMotion是一款高性能机器人运动生成库,专注于机械操作任务,利用GPU加速技术提升性能。开发者预览版支持运动学/逆运动学、碰撞感知路径规划、轨迹优化等功能,兼容任意自由度机器人。该库提供C++和Python接口,支持从URDF/XRDF文件加载机器人模型,包含世界建模、碰撞检测等工具。教程详细介绍了安装配置、机器人描述加载、运动学计算、世界建模、逆运动学求解以及轨迹优化等核心功能。cuMotion整合了Lula和cuRobo库的技术优势,将成为Isaac ROS的核心组件,适用于工业机器 阅读详情

相关推荐

IC设计新手必看:如何正确使用去耦电容(decap)避免电源噪声?

本文深入探讨了IC设计中去耦电容(decap)的应用技巧,从核心原理到布局实现,帮助新手工程师有效抑制电源噪声。文章详细解析了MIM、MOM等电容类型的特性与选择策略,并提供了先进的布局技巧和验证方法,特别适用于28nm以下先进工艺的电路设计挑战。

weixin_30555125的博客 113

bzoj4144

最短路+最小生成树 因为所有东西都只跟加油站有关,那么我们只留加油站就行了。 先预处理出每个点到加油站的最短距离,这个用多源最短路,就是把所有加油站放到堆里,然后就是重构图,我们不用直接连边,计算出每条边的贡献,然后跑最小生成树,这里直接离线查询就行了。 #include<bits/stdc++.h> using namespace std; const i...

weixin_30896763的博客 241

数据结构实验1.2—高精度计算PI值(西工大)

这是数据结构第二题的题目,是让我们根据用户的需求来计算派的值 这是题目的详细描述,刚看到这道题的时候,我是真的头大,完全没有思路,于是查找了一些大佬的笔记后才开始编写 这是我在写这些代码是所运用到的数学反三角函数幂次展开式的知识。 下面是正确的代码以及我的一些见解,和需要注意的一些地方。希望能对你有所帮助。如有更加精简的算法,请在评论区留下你的算法!!!谢谢!!! #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdl

abcdef0623的博客 5831

[bzoj4144]Petrol——最小生成树+最短路

题目大意: 给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。 q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走到y。 思路: 不难发现如果要顺利地完成旅程,一定是从一个加油站跑到另外一个加油站去,并且任意两个加油站之间地距离不可以超过b。 ...

aizhuji9626的博客 360

ENVI中Landsat8大气校正法实现地表温度精准反演

本文详细介绍了在ENVI软件中,利用大气校正法对Landsat8热红外数据进行地表温度反演的完整流程。该方法通过辐射定标、大气参数获取、发射率估算及温度转换四个核心步骤,精准剔除大气干扰,还原地表真实温度,是城市热岛效应监测、农业旱情分析等应用的关键技术。

weixin_29292535的博客 148

Multisim 14.0 实战:手把手教你仿真一个9MHz高频小信号放大器(附完整电路文件)

本文详细介绍了如何使用Multisim 14.0仿真一个9MHz高频小信号谐振放大器,从环境准备、电路设计到仿真参数设置与调试,手把手教你掌握射频电路仿真的核心技巧。适合电子工程师和学生快速上手高频电路设计,附完整电路文件供参考。

weixin_30335575的博客 112

【BZOJ】4144: [AMPPZ2014]Petrol

题意 给定一个\(n\)个点、\(m\)条边的带权无向图,其中有\(s\)个点是加油站。每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满。\(q\)次询问,每次给出\(x,y,b\),表示出发点是\(x\),终点是\(y\),油量上限为\(b\),且保证\(x\)点和\(y\)点都是加油站,请回答能否从\(x\)走到\(y\)。(\(2 \le s ...

247

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4318

【BZOJ】【4144】【AMPPZ2014】Petrol

最短路+最小生成树+倍增   图论问题中综合性较强的一题= =(Orzvfk)   比较容易发现,关键的还是有加油站的这些点,其他点都是打酱油的。   也就是说我们重点是要求出关键点之间的最短路。   这玩意……如果枚举加油站所在的点,然后跑单源最短路什么的……肯定TLE啊。   我们记from[i]表示离i最近的关键点,仔细考虑一下,A->B的最短路径上,一定是前一半...

weixin_30398227的博客 281

《斯图尔特微积分》实战指南:从理论到解题技巧的跨越

本文深入解析《斯图尔特微积分》教材的独特价值与实用学习策略,重点介绍其理论深度与实际应用的完美平衡。通过概念理解、符号语言转换、解题思维框架等五个关键跨越,帮助读者高效掌握微积分核心技巧。文章还提供分层练习、可视化工具等教学实践方法,是提升微积分学习效率的实战指南。

weixin_28432777的博客 395

基于学术研究于NASA官网GPM卫星数据下载详细教程

基于学术研究于NASA官网GPM卫星数据下载详细教程

珞瑜的博客 8654

【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)

Description 给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。 q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走到y。 Input 第一行包含三个正整数n,s,m(2<=s<=n<=200000,1<=m<=2...

weixin_33937913的博客 236

强化学习:在智能交通系统中的应用

作者:禅与计算机程序设计艺术 这篇文章将探索如何利用强化学习(RL)这一强大的机器学习方法,在智能交通系统中实现自动驾驶、优化路线规划和提高道路安全等方面的突破。RL通过让智能体与环境互动并从这些互动中学习,从而解决复杂的决策过程问题,这正是现代智能交通系统所需要的。 背景介绍 随着城市化进程的加速,交通拥堵、能源消耗和交通事

AI天才研究院 1117

[BZOJ 4144] [AMPPZ2014]Petrol

BZOJ传送门 题目描述 给定一个nnn个点、mmm条边的带权无向图,其中有sss个点是加油站。 每辆车都有一个油量上限bbb,即每次行走距离不能超过bbb,但在加油站可以补满。 qqq次询问,每次给出x,y,bx,y,bx,y,b,表示出发点是xxx,终点是yyy,油量上限为bbb,且保证xxx点和yyy点都是加油站,请回答能否从xxx走到yyy。 输入输出格式 输入格式 第一行包含三个正整数n...

LPA的博客 399

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

BZOJ4144 [AMPPZ2014]Petrol

做多源最短路,跑每个点到哪个加油站最近,记录每个点是哪个点来的,如果两个点之间有边并且两个点不是从一个点来的,那么两个加油站连一条边,然后跑最小生成树,在树上倍增即可 注意判不联通 #include #include #include #include #include #include #include #include #include #include #include #include

neither_nor 787

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【bzoj4144】[AMPPZ2014]Petrol

感觉这类型的题都出烂了。。。 和bzoj 4242差不多。。。 只不过那个是n×n的然后有些小技巧罢了。多源最短路+最小生成树+链上查询(+倍增?)如果要直接查询u->v的路径是很困难的一件事,所以尝试着把图转换成一棵树。注意到只要一条边足够短那么它就是一定可以走的。既然所有的查询点都是加油站,那么就相当于在一棵每一条边都足够小的生成树上查询两点之间的最大边权。把所有加油站扔进队列里跑多源最短路

GEOTCBRL 1444

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

bzoj 4144: [AMPPZ2014]Petrol

http://www.elijahqi.win/archives/1759 Description 给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。 q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走到y。 Input 第一行包含三个正整数...

Elijahqi 361

BZOJ 4144: [AMPPZ2014]Petrol

4144: [AMPPZ2014]Petrol Time Limit:10 SecMemory Limit:256 MBSubmit:457Solved:170[Submit][Status][Discuss] Description 给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。...

weixin_30699955的博客 185

bzoj 4144 [AMPPZ2014]Petrol 最短路+最小生成树+倍增

Description给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。 q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走到y。 Input第一行包含三个正整数n,s,m(2<=s<=n<=200000,1<=m<=200000),表示点数、加油站

mars_ch的博客 548

bzoj4144 [AMPPZ2014]Petrol(spfa+贪心+离线+并查集)

首先对于每个点i,记离它最近的加油站为from[i],我们可以贪心的发现,在加油站a到加油站b的最短路(只经过非加油站)上,所有的点的from一定是这样的:前一部分都是a,后一部分都是b。也就是说只存在这样的一条边,他的两端点的from不同,记这条边的边权为w,则a到b的最短路为dis[a]+w+dis[b]。(dis[i]表示i到离它最近的加油站的距离)于是我们以所有加油站为源点,做一遍多源最短路

Icefox的博客 466

bzoj4144【AMPPZ2014】Petrol

题解: 首先注意到起点和终点都是加油站; 假设中途经过某个非加油站的点u,u连到v,离u最近的加油站是x,那么从u到x加油后回到u,再到v一定不比直接从u到v差; 因为u一定从某个加油站来,设最后经过的加油站为y,u点油量为B1 = b - dis(y,u),而如果u不可以走到x一定不能走到其他任何加油站自然也到不了...

weixin_34085658的博客 212

【BZOJ 4144】[AMPPZ2014]Petrol 最短路+最小生成树

首先可以很显然的知道题目中只与加油站有关,也就是说其他的点都是无用的,所以先考虑如何取代其他无用的点,如下图: 黑色代表加油站,红色代表无用的点,现在要去掉红色4号,那么考虑对于1,2,3节点新的边应该是什么样子。 考虑从3号节点到达1号,如果直接沿简单路径走,油量最小为7,而如果从3到2再到1,就只需要5就可以了,原因: b 顾这样的走法是最优的,这样一来我们就能得到一个性质,从

pbihao的博客 1197

BZOJ4144: [AMPPZ2014]Petrol(最短路 最小生成树)

题意 题目链接 Sol 做的时候忘记写题解了 可以参考这位大爷 #include&lt;bits/stdc++.h&gt; #define Pair pair&lt;int, int&gt; #define MP make_pair #define fi first #define se second using namespace std; const int MAXN = 2e6 + 10;...

weixin_34019144的博客 204

bzoj4144: [AMPPZ2014]Petrol 最短路经典问题

链接 Description 给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。 q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走到y。 Input 第一行包含三个正整数n,s,m(2&lt;=s&lt;=n&lt;=200000,1&lt;=m&lt...

执子之手,与子偕老 536

bzoj 4144: [AMPPZ2014]Petrol spfa+最小生成树

题意给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。 q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走到y。 2<=s<=n<=200000,1<=m<=200000,1<=q<=200000分析感觉上比较巧妙的一道题(大爷们都说这是水题,可能是

beginend 646

【AMPPZ2014】【BZOJ4144】Petrol

Description给定一个n个点、m条边的带权无向图,其中有s个点是加油站。 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满。 q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走到y。 Input第一行包含三个正整数n,s,m(2<=s<=n<=200000,1<=m<=200000),表示点数、加油站

CreationAugust is 14 years old forever 1824
上一篇: BZOJ 1122: [POI2008]账本BBB
下一篇: BZOJ 4385: [POI2015]Wilcze doły 单调队列
NeighThorn
博客等级 码龄11年 20粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值