[CF1601D]Difficult Mountain

2024-03-16 22:38
文章标签 mountain difficult cf1601d

本文主要是介绍[CF1601D]Difficult Mountain,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Difficult Mountain

题解

显然,我们可以把所有的人分成两类,一类是 a ⩽ s a\leqslant s as,一类是 a > s a>s a>s
对于 a ⩽ s a\leqslant s as的部分,我们有一个简单的贪心策略,将所有的按照 s s s排序,越大的越后面。
显然,后一个选择的 s s s是大于前面所有的 s s s的,自然是大于前面所有的 a a a的,所以只要它的 s s s大于 d d d,那么它一定是可以被选择的。
而对于 a > s a>s a>s的部分,我们也有一个简单的贪心策略,将所有的按照 a a a排序,能选则选。
显然,在这种情况下,所有我们选择的 ( a , s ) (a,s) (a,s)都可以被看成许多不相交的线段。
我们可以考虑将第二部分的所有 ( a , s ) (a,s) (a,s)都当成线段插入到部分一里面去,如果该线段没有影响到部分一的选择,那么它肯定可以被选择。
也就是当我们进行到第一个 s i s_{i} si不小于该线段的 a a a时,且其 s s s不小于当前的 d d d,我们可以将该线段加入答案,因为它不会对部分一的选择造成任何影响,而我们的第二类也是按我们的贪心方法排序,也是最优的。
而当我们的第二类影响到第一类时,我们可以发现,一个第二类线段最少会影响一个,但它最多只能贡献一个,因为其它贡献线段是与它不相交的,所以并不会影响它影响的第一类选择。
所以我们当然可以将那个第二类线段替换成第一类线段。
在这种情况下,所有被选择的第二类线段都不会对第一类造成影响。
显然,该方法可以在排序后通过双指针维护。

时间复杂度 O ( n log ⁡ n ) O\left(n\log\,n\right) O(nlogn)

源码

#pragma GCC optimize(2, 3, "Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MAXN 500005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
#define lson (rt<<1)
#define rson (rt<<1|1)
typedef long long LL;
typedef unsigned long long uLL;       
const int INF=0x3f3f3f3f;       
const int mo=998244353;
const int inv2=499122177;
const int jzm=2333;
const int zero=10000;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-5;
typedef pair<LL,int> pii;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int n,d,tot1,tot2,ans;
struct ming{int a,s;}p1[MAXN],p2[MAXN];
bool cmp1(ming x,ming y){return x.s<y.s;}
bool cmp2(ming x,ming y){return x.a<y.a;}
signed main(){read(n);read(d);for(int i=1;i<=n;i++){int s,a;read(s);read(a);if(a<=s)p1[++tot1]=(ming){a,s};else p2[++tot2]=(ming){a,s};}sort(p1+1,p1+tot1+1,cmp1);sort(p2+1,p2+tot2+1,cmp2);int i,j;for(i=1,j=1;i<=tot1;i++){while(j<=tot2&&p2[j].a<=p1[i].s){if(d<=p2[j].s)ans++,d=p2[j].a;j++;}if(p1[i].s>=d)d=max(d,p1[i].a),ans++;}while(j<=tot2){if(d<=p2[j].s)ans++,d=p2[j].a;j++;}printf("%d\n",ans);return 0;
}

谢谢!!!

这篇关于[CF1601D]Difficult Mountain的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816950

相关文章

【C++】【学习笔记】【未成功实现】关于指针的函数【very difficult】

注:由于参照C++primer 5th edition,这段程序并不能在博主的VS2012中运行,主要是GCC编译器版本过低导致。 /* 本节主要介绍 声明一个函数【easy】 创建容器对象并使其元素为指向函数的指针【略difficult】创建多个函数,用容器保存指向这些函数的指针指针上场,调用指针输出函数计算的结果*/#include <iostream>#include <vecto

Maximum Number in Mountain Sequence

Given a mountain sequence of n integers which increase firstly and then decrease, find the mountain top. Example Example 1: Input: nums = [1, 2, 4, 8, 6, 3] Output: 8 Example 2: Input: nums = [

Mountain climbing

Problem Description 又这是一个关于登山的问题。现有n座山位于一条直线上,每座山可以看成一条垂直于地面的线段,一端点在地面上, 这些山编号从左往右为1到n,第i座山位于xi高为hi。 对于任意的两座山a和b,如果a的顶端能看见b的顶端,则他们可以用绳索连接。a能看见b,当且仅当他们顶端的连线 不能穿过其他山或者触摸到其他山。若a与b能用绳索连接那么登山者可以用一个单位的时间

leetcode941-Valid Mountain Array

题目 给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false。 让我们回顾一下,如果 arr 满足下述条件,那么它是一个山脉数组: arr.length >= 3 在 0 < i < arr.length - 1 条件下,存在 i 使得: arr[0] < arr[1] < … arr[i-1] < arr[i] arr[i] > arr[i+1] > … > a

Wicked Cool PHP: Real-World Scripts That Solve Difficult Problems [ILLUSTRATED]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/topmvp - topmvp PHP is an easy-to-use scripting language perfect for quickly creating the Web features you need. Once y

FZU - 2109 Mountain Number

题 目 传 送 门:  x=a[0]a[1]...a[len-2]a[len-1],所有下标为奇数的数都>=他左右的数的称为Mountain Number ,找L~R中Mountain Number的个数 思路:数位dp,dp[i][j][k],i表示第i位,j表示奇数位还是偶数位,k表

LeetCode 题解:845. Longest Mountain in Array

Let’s call any (contiguous) subarray B (of A) a mountain if the following properties hold: B.length >= 3There exists some 0 < i < B.length - 1 such that B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B

CodeCombat_Mountain 参考答案 code by Python

code-combat Python 参考答案 mountain 安息之云山峰borrowed-sword 借刀the-two-flowers 双生花mountain-flower-grove 山花林 mountain 安息之云山峰 borrowed-sword 借刀 https://codecombat.com/play/level/borrowed-sword? Sol

Xcode 4.4 for Mountain Lion增加的新东西

系统升级到了Mountain Lion,更新了下开发工具Xcode,增加了些新东西,网上学习后记录下。 首先,升级时遇到了问题,重装完系统删除旧的Xcode后安装新的4.4版本,模拟器一直报错打不开,显示iOS模拟器意外退出,折腾后终于解决,先用一款MAC下的应用(CleanApp)把Xcode全部卸载,这款软件还不错,只需把要处理的应用脱进去让它自动分析就成,全部删除后再次重装Mount

Mountain Lake - Forest Pack

从头开始构建的50个岩石森林资源集合,充分利用了HDRP。还支持Universal 和Built-In。 支持Unity 2020.3+、高清渲染管线、通用渲染管线、标准渲染管线。导入包后,按照README中的说明进行操作。 Mountain Lake - Rock & Tree Pack是一个由50个准备好的资源组成的集合,从头开始构建,以充分利用高清渲染管道。这些资源经过精心雕刻、纹理化和