[CF1602F/1601D] Difficult Mountain

前言

update 2021.11.1 我本以为紫名就不用打 Div2 了,没想到有 Div2 上限是2100,但是可以打 Div1 了,好耶ヾ(✿゚▽゚)ノ

难得的阳间比赛(指比赛时间),上大分!

虽然今天下午状态还行,可惜最后一场 Div2 没能AK,不过竟然上榜了!人生首次!

而且还是通过 Hack 了一个人从 rank5 翻到了 rank4,与机房大佬三连了。(rank2,3,4)

首次使用 Hack,体验极佳,下次继续。

所以水题解。

题目

CF

题目大意:

\(n\) 位登山者和一座初始困难度为 \(d\) 的山,每位登山者有两个值 \(s_i,a_i\) 表示TA的技能点和邋遢度。

登山者 \(i\) 可以登山的前提是其困难度不超过 \(s_i\),当登山者 \(i\) 成功登山后,困难度会变为 \(\max(d,a_i)\)

你需要找到一个合适的登山顺序以保证有最多的人成功登山,输出最大人数。

\(1\le n\le 5\times 10^5;0\le d,s_i,a_i\le 10^9.\)

讲解

这个贪心真的NB,完全想不到,但是知道了之后直呼NB!

直接按 \(\max(s_i,a_i)\) 的大小排序,如果相等按 \(s_i\) 大小排序,然后直接登山即可。

简单分类讨论一下:

  1. \(s_i<a_j\),这里指的是 \(i\) 的最大值为 \(s_i\)\(j\) 的最大值为 \(a_j\),下同。此时如果把 \(j\) 放前面,\(j\) 如果成功上山,那么 \(i\) 一定上不了,不如先让 \(i\) 试试,不优。
  2. \(a_i<s_j\),强的留在后面总是不劣的。
  3. \(s_i<s_j\),同理不劣。
  4. \(a_i<a_j\),此时 \(j\) 如果上山,\(i\) 一定上不了山,显然取邋遢度小的在前更优。

取等情况其实也差不多是这些思路,这道题就当缴智商税了。

时间复杂度 \(O(n\log_2n)\),瓶颈在排序。

还有码量较大的线段树优化DP做法,这里就不说了。

代码

超短代码
//12252024832524
#include <bits/stdc++.h>
#define TT template<typename T>
using namespace std;

typedef long long LL;
const int MAXN = 500005;
int n,d;
int s[MAXN],a[MAXN],p[MAXN];

LL Read()
{
	LL x = 0,f = 1; char c = getchar();
	while(c > '9' || c < '0'){if(c == '-') f = -1;c = getchar();}
	while(c >= '0' && c <= '9'){x = (x*10) + (c^48);c = getchar();}
	return x * f;
}
TT void Put1(T x)
{
	if(x > 9) Put1(x/10);
	putchar(x%10^48);
}
TT void Put(T x,char c = -1)
{
	if(x < 0) putchar('-'),x = -x;
	Put1(x); if(c >= 0) putchar(c);
}
TT T Max(T x,T y){return x > y ? x : y;}
TT T Min(T x,T y){return x < y ? x : y;}
TT T Abs(T x){return x < 0 ? -x : x;}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n = Read(); d = Read();
	for(int i = 1;i <= n;++ i) s[i] = Read(),a[i] = Read(),p[i] = i;
	sort(p+1,p+n+1,[](int x,int y){
		if(Max(s[x],a[x]) ^ Max(s[y],a[y])) return Max(s[x],a[x]) < Max(s[y],a[y]);
		return s[x] < s[y];
	});
	int ans = 0;
	for(int i = 1;i <= n;++ i)
		if(s[p[i]] >= d) ++ans,d = Max(d,a[p[i]]);
	Put(ans,'\n');
	return 0;
}

后记

有老哥按 \(a_i+s_i\)\(a_i\times s_i\) 排序,都过了!/jk

update ? 也可以用类似上面的方法证明。

posted @ 2021-10-25 21:01  皮皮刘  阅读(117)  评论(5编辑  收藏  举报