题目描述

a180285非常喜欢滑雪。他来到一座雪山,这里分布着 MM 条供滑行的轨道和 NN 个轨道之间的交点(同时也是景点),而且每个景点都有一编号 ii ( 1 \le i \le N1≤i≤N )和一高度 H_iHi​ 。a180285能从景点 ii 滑到景点 jj 当且仅当存在一条 ii 和 jj 之间的边,且 ii 的高度不小于 jj 。 与其他滑雪爱好者不同,a180285喜欢用最短的滑行路径去访问尽量多的景点。如果仅仅访问一条路径上的景点,他会觉得数量太少。于是a180285拿出了他随身携带的时间胶囊。这是一种很神奇的药物,吃下之后可以立即回到上个经过的景点(不用移动也不被认为是a180285 滑行的距离)。请注意,这种神奇的药物是可以连续食用的,即能够回到较长时间之前到过的景点(比如上上个经过的景点和上上上个经过的景点)。 现在,a180285站在 11 号景点望着山下的目标,心潮澎湃。他十分想知道在不考虑时间胶囊消耗的情况下,以最短滑行距离滑到尽量多的景点的方案(即满足经过景点数最大的前提下使得滑行总距离最小)。你能帮他求出最短距离和景点数吗?

输入输出格式

输入格式:

输入的第一行是两个整数 N,MN,M 。

接下来 11 行有 NN 个整数 H_iHi​ ,分别表示每个景点的高度。

接下来 MM 行,表示各个景点之间轨道分布的情况。每行 33 个整数, U_i,V_i,K_iUi​,Vi​,Ki​ 。表示编号为 U_iUi​ 的景点和编号为 V_iVi​ 的景点之间有一条长度为 K_iKi​ 的轨道。

输出格式:

输出一行,表示a180285最多能到达多少个景点,以及此时最短的滑行距离总和。

输入输出样例

输入样例#1:

3 3
3 2 1
1 2 1
2 3 1
1 3 10
输出样例#1:

3 2

说明

【数据范围】

对于 30\%30% 的数据,保证 1 \le N \le 20001≤N≤2000

对于 100\%100% 的数据,保证 1 \le N \le 10^51≤N≤105

对于所有的数据,保证 1 \le M \le 10^61≤M≤106 , 1 \le H_i \le 10^91≤Hi​≤109 , 1 \le K_i \le 10^91≤Ki​≤109 。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(题外话:今天真是亢奋了一天ovo)

首先bfs一遍,筛出从1号点可以到达的点,并且用这些点建立一个新图

然后用最小生成时树跑一遍新图,记录路径长度....然后就没有然后了?

这是代码

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define N 1000010
#define LL long long
using namespace std;
int n,m;
LL sum,ans,fa[N],h[N];
struct rockdu
{
LL u,v,w,nxt;
}e[N*],d[N*];
int first[N],cnt,cnnt,head[N];
bool vis[N];
bool cmp(rockdu x,rockdu y)
{//终点的高度为第一关键字从大到小排序,边长为第二关键字从小到大排序
if(h[x.v]!=h[y.v]) return h[x.v]>h[y.v];
return x.w<y.w;
}
void ade(LL u,LL v,LL w)
{
e[++cnt].nxt=first[u];first[u]=cnt;
e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;
}
void adenew(LL u,LL v,LL w)
{
d[++cnnt].nxt=head[u];head[u]=cnnt;
d[cnnt].u=u;d[cnnt].v=v;d[cnnt].w=w;
}
void bfs()//buildnew
{
queue<LL>q;
q.push();vis[]=;
while(!q.empty())
{
LL u=q.front(); q.pop();
for(register LL i=first[u];i;i=e[i].nxt)
{
LL v=e[i].v;
adenew(u,v,e[i].w);
if(!vis[v])
{
vis[v]=;
sum++;
q.push(v);
}
}
}
}
//kruskal
inline long long la(long long x)
{
if(fa[x]!=x) fa[x]=la(fa[x]);
return fa[x];
}
inline char nc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
inline long long read(){
char ch=nc();int sum=;
while(!(ch>=''&&ch<=''))ch=nc();
while(ch>=''&&ch<='')sum=sum*+ch-,ch=nc();
return sum;
}
int main()
{
n=read();m=read();
for(register LL i=;i<=n;i++)
{
h[i]=read();
fa[i]=i;
}
for(register LL i=;i<=m;i++)
{
LL a,b,c;
a=read();b=read();c=read();
if(h[a]>=h[b]) ade(a,b,c);
if(h[a]<=h[b]) ade(b,a,c);
}
bfs();
sort(d+,d+cnnt+,cmp);
for(register LL i=;i<=cnnt;i++)
{
register LL x=la(d[i].u),y=la(d[i].v);
if(x!=y)
{
fa[x]=y;
ans+=d[i].w;
}
}
printf("%lld %lld",sum+,ans);
return ;
}

ovo

.

SCOI 2010 滑雪的更多相关文章

  1. SCOI 2010 连续攻击游戏(贪心,图论)

    SCOI 2010 连续攻击游戏 solution 直接就硬刚 我愿称贪心为暴力 因为题目中要求一定从小到大贪心,那么当前点的下标有能够选取的较大点,那么它一定可以和前面的一个较小点连接,所以可以直接 ...

  2. [SCOI 2012]滑雪与时间胶囊

    Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi. ...

  3. [SCOI 2010] 股票交易

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1855 [算法] 单调队列优化动态规划 [代码] #include<bits/s ...

  4. 【BZOJ 1857】【SCOI 2010】传送带

    三分套三分,虽然简单,但是也得掌握,,, 时间复杂度$O(log_{1.5}^2 n)$ 一开始WA好几次发现是快速读入里没有return,这样也能过样例?_(:3J∠)_ #include<c ...

  5. SCOI 2010 序列操作

    题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b ...

  6. [SCOI 2010]传送带

    Description 题库链接 在一个 \(2\) 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段 \(AB\) 和线段 \(CD\) .在 \(AB\) 上的移动速度为 ...

  7. [SCOI 2010]字符串

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...

  8. bzoj 2753 [SCOI 2012] 滑雪与时间胶囊 - Prim

    题目传送门 传送点I 传送点II 题目大意 给定一个有$n$个点$m$条边的图,每个点有一个高度$h_{i}$,能从$u$经过一条边到达$v$,当且仅当存在一条边是$(u, v)$或$(v, u)$, ...

  9. 解题:SCOI 2010 序列操作

    题面 线段树......模板题(雾? 然而两种标记会互相影响,必须保证每次只放一个(不然就不知道怎么放了),具体的影响就是: 翻转标记会使得覆盖标记一起翻转,下放的时候就是各种swap 覆盖标记会抹掉 ...

随机推荐

  1. IDEA安装及基本配置

    IDEA基本介绍 IntelliJ IDEA是JetBrains公司开发的一款开发Java的开发工具,简称IDEA,JetBrains公司还有其他几款优秀的开发工具. IDEA是一款收费软件,在财力允 ...

  2. Android 开发干货,键盘状态

    地址:http://www.imooc.com/article/4711 [A]stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 [B]stateU ...

  3. 利用任务计划自动删除指定日期的SQLServer备份文件

    利用任务计划自动删除指定日期的SQLServer备份文件 命令FORFILES [/P pathname] [/M searchmask] [/S]         [/C command] [/D ...

  4. Linux文件压缩命令

    一.zip命令(常用) 用zip命令压缩的文件在Windows系统下也是可以解压缩的,即此格式压缩文件两个系统通用. 文件压缩:zip  filename.zip   filename 目录压缩:zi ...

  5. leetcode 179. Largest Number 、剑指offer33 把数组排成最小的数

    这两个题几乎是一样的,只是leetcode的题是排成最大的数,剑指的题是排成最小的 179. Largest Number a.需要将数组的数转换成字符串,然后再根据大小排序,这里使用to_strin ...

  6. ctDNA|endosymbiosis

    5.10叶绿体基因组编码多种蛋白质和RNA 叶绿体和线粒体的共同点:叶绿体和线粒体的大小,功能(编码区)大体一致,但叶绿体拥有更多基因,所以在编码tRNA时,也有内含子作为被剪切片段. 因为在原核生物 ...

  7. Bootstrap历练实例:标签修饰

    您可以使用修饰的 class label-default.label-primary.label-success.label-info.label-warning.label-danger 来改变标签 ...

  8. cocos2dx for iOS fmod的音效引擎接入

    上一个博客我写了一篇fmod的android接入过程,这一次介绍一下ios接入fmod的方法. 首先下载fmod的api包,解压后,在FMOD Programmers API/api文件夹下有lowl ...

  9. nodejs 静态资源服务与接口代理跨域

    首先需要 npm install express 和 npm install request 代码如下: const express = require('express'); const path ...

  10. Linux基础学习-用户的创建修改删除

    用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...