UPC-膜拜

42 篇文章 1 订阅
30 篇文章 8 订阅

世上没有绝望的处境

只有对处境绝望的人

UPC-膜拜

问题描述

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

输入

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

输出

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

Sample Input

4
3 5
4 8
1 2
5 10

Sample Outputr

3

Hint

如图所示,小鱼可出现在5处,此时第1,2,4号粉丝可以膜他。小鱼最多只能被3个粉丝膜。
对于20%的数据,n≤2
对于60%的数据,n≤2000
对于100%的数据,1≤n≤5×104,1≤li≤ri<230

思路分析

思路就是差分数组的思路,只不过这里有一些稍许不一样。
这里是起始点的时候就算上,在终点的时候去除。这就和差分的思路是一样的了。(差分数组是在一段区域内的头加一,尾减一,这里是起始点加一,终点减一)
按照这个思路,咱们就可以AC了.
需要注意一下,起点和终点交界的地方,这里应该算做存在范围内。
提问:为什么要排序
你要从第一个时间点开始,进行加减操作。
所以你得让时间是有序的,然后才能到点加,到点减。所以要排序

AC时间到

#include<algorithm>
#include<iostream>
#include<string.h>
#include <iomanip>
#include<stdio.h>
#include<vector>
#include<string>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<deque>
#include<map>
#include<set>
#pragma warning(disable:4244)
#define PI 3.141592653589793
#pragma GCC optimize(2)
#define accelerate cin.tie(NULL);cout.tie(NULL);ios::sync_with_stdio(false);
#define EPS 1.0e-8
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll ll_inf = 9223372036854775807;
const int int_inf = 2147483647;
const short short_inf = 32767;
const char char_inf = 127;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline 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;
}
inline void out(ll a) {
    if (a < 0)putchar('-'), a = -a;
    if (a >= 10)out(a / 10);
    putchar(a % 10 + '0');
}
ll phi(ll n)
{
    ll ans = n, mark = n;
    for (ll i = 2; i * i <= mark; i++)
        if (n % i == 0) { ans = ans * (i - 1) / i; while (n % i == 0)n /= i; }
    if (n > 1)ans = ans * (n - 1) / n; return ans;
}
ll qpow(ll x, ll n, ll mod) {
    ll res = 1;
    while (n > 0) {
        if (n & 1)res = (res * x) % mod;
        x = (x * x) % mod;
        n >>= 1;
    }
    return res;
}
ll mat_mod;
struct Mat {
    ll m[10][10];
};
Mat Mul(Mat A, Mat B, ll mat_size) {
    Mat res;
    memset(res.m, 0, sizeof(res.m));
    for (int i = 0; i < mat_size; i++)for (int j = 0; j < mat_size; j++)for (int k = 0; k < mat_size; k++)
        res.m[i][j] = (res.m[i][j] + (A.m[i][k] * B.m[k][j]) % mat_mod) % mat_mod;
    return res;
}
Mat mat_qpow(Mat data, ll power, ll mat_size) {
    Mat res;
    memset(res.m, 0, sizeof(res.m));
    for (int i = 0; i < mat_size; i++)res.m[i][i] = 1;
    while (power) {
        if (power & 1)res = Mul(res, data, mat_size);
        data = Mul(data, data, mat_size), power >>= 1;
    }
    return res;
}
#define Floyd for(int k = 1; k <= n; k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
#define read read()
struct node {
    int val;
    bool sta;
}save[1000005];
int cnt = 0;
bool cmp(node a, node b)
{
    if (a.val != b.val)
        return a.val < b.val;
    return a.sta > b.sta;
}
int main()
{
    int num = read;
    for (int i = 0; i < num; i++)
    {
        save[cnt].val = read;
        save[cnt++].sta = 1;
        save[cnt].val = read;
        save[cnt++].sta = 0;
    }
    sort(save, save + cnt, cmp);
    int ans = 0;
    int res = 0;
    for (int i = 0; i < cnt; i++)
    {
        if (save[i].sta)ans++;
        else ans--;
        res = max(ans, res);
    }
    cout << res << endl;
}

By-轮月

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Round moon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值