膜拜(离散化差分模板题)

简介: 题目描述小鱼有 n 名优秀的粉丝。粉丝们得知小鱼将会在一条直线上出现,打算去膜他。为了方便,粉丝们在这条直线上建立数轴。第 i 名粉丝有一个侦查区间[li,ri] 。如果小鱼在 j(li≤j≤ri) 处出现,这名粉丝将立刻发现并膜他。小鱼希望膜他的人越多越好,但是他不能分身,因此只能选择一个位置出现。小鱼想知道自己最多能被多少个人膜。

题目描述


小鱼有 n 名优秀的粉丝。


粉丝们得知小鱼将会在一条直线上出现,打算去膜他。为了方便,粉丝们在这条直线上建立数轴。


第 i 名粉丝有一个侦查区间[li,ri] 。如果小鱼在 j(li≤j≤ri) 处出现,这名粉丝将立刻发现并膜他。


小鱼希望膜他的人越多越好,但是他不能分身,因此只能选择一个位置出现。


小鱼想知道自己最多能被多少个人膜。


输入


第一行一个整数n —— 粉丝的个数。


接下来 n 行,每行两个整数 li,ri ,分别表示第 i 名粉丝的侦查区间的两个端点。两个数之间用空格隔开。


输出


共一行,一个整数,表示小鱼最多能被多少人膜。


样例输入


4
3 5
4 8
1 2
5 10


样例输出


3


提示


样例解释:

如图所示,小鱼可出现在5处,此时第1,2,4号粉丝可以膜他。小鱼最多只能被3个粉丝膜。

微信图片_20220530200800.png

对于20%的数据,n≤2

对于60%的数据,n≤2000

对于100%的数据,1 ≤ n ≤ 5 × 104,1 ≤ li ≤ ri <230

这个题很容易就可以想起来差分数组,但是以看数据范围,有点感人,因此需要进行离散化

#include <bits/stdc++.h>
using namespace std;
#define wuyt main
typedef long long ll;
template<class T> inline T min(T &x,const T &y){return x>y?y:x;}
template<class T> inline T max(T &x,const T &y){return x<y?y:x;}
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
    if(c == '-')Nig = -1,c = getchar();
    while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
    return Nig*x;}
#define read read()
ll maxx=-1,minn=inf;
ll num[maxn],a[maxn],num2[maxn];
ll res,ans;
int n;
ll cnt[maxn];
pair<ll,ll> together[maxn];
vector <ll> vet;
int main()
{
    n=read;
    for(int i=1;i<=n;i++){
        ll left=read,right=read;
        vet.push_back(left);
        vet.push_back(right);
        together[i]={left,right};
    }
    sort(vet.begin(),vet.end());
    vet.erase(unique(vet.begin(),vet.end()),vet.end());
    for(int i=1;i<=n;i++){
        ll left=together[i].first;
        ll right=together[i].second;
        ll templeft=lower_bound(vet.begin(),vet.end(),left)-vet.begin();
        ll tempright=lower_bound(vet.begin(),vet.end(),right)-vet.begin();
        num[templeft]+=1;
        num[tempright+1]-=1;
    }
    int len=vet.size();
    for(int i=1;i<len;i++) num[i]+=num[i-1];
    ans=num[0];
    for(int i=1;i<len;i++) if(num[i]>=ans) ans=num[i];
    cout<<ans<<endl;
    return 0;
}


开发者涨薪指南

48位大咖的思考法则、工作方式、逻辑体系

目录
相关文章
|
3月前
|
算法 安全 Java
非启发式算法——中国剩余定理
非启发式算法——中国剩余定理
52 0
|
6月前
|
存储 算法 C++
C++基础算法离散化及区间合并篇
C++基础算法离散化及区间合并篇
|
9月前
|
人工智能 算法
算法提高:组合数学| 容斥原理常见应用
容斥原理常见的问题如下。 (1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人? (2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?
101 0
算法提高:组合数学| 容斥原理常见应用
|
5月前
差分方程模型:兔子繁殖问题(斐波拉契数列)
差分方程模型:兔子繁殖问题(斐波拉契数列)
|
9月前
|
算法 Android开发
LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
47 0
|
9月前
|
机器学习/深度学习 算法
算法提高:组合数学| 卡特兰数的实现
卡特兰数列是组合数学中在各种计数问题中常出现的数列,其前几项为1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012…… 卡特兰数首先是由欧拉在计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,即在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数用Hn表示,Hn即卡特兰数。
84 0
算法提高:组合数学| 卡特兰数的实现
|
12月前
|
人工智能 移动开发 算法
基础算法-差分
基本思路 差分和前缀和是互为逆运算的关系。
|
存储 移动开发 算法
【基础算法】差分
【基础算法】差分
54 0
【基础算法】差分
|
机器学习/深度学习 人工智能 开发框架
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分2
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
73 0
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分2
|
人工智能 移动开发 算法
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
88 0
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分