问题 I: 堆积干草

题目描述

约翰的其中一头奶牛贝里斯最近非常为他自己的行为感到愧疚,因为他经常给约翰捣乱!于是他决定帮助约翰摆放新进来的一批干草。
开始的时候,总共有N(N一定是奇数)个空的器皿,编号从1到N。约翰给予了贝里斯K条命令来摆放干草。每条命令的形式都是:A B,意思是贝里斯应该把编号为A到B的器皿中每个都添加一束干草。例如,如果约翰的命令是:10 13,那么贝里斯应该在编号为10到13的器皿中各加入一束干草。
在贝里斯执行完这K条命令之后,约翰想要知道所有器皿中干草数量的中位数。这个中位数就是:把每个器皿中的干草数量从小到大排序之后,最中间的那个干草数量就是中位数(即排序后第(N+1)/2位置上的数)。
请帮助贝里斯计算这个中位数。

输入

第一行两个正整数N和K,表示N个器皿和K条命令。
接下来第2行到第K+1行,每行两个正整数,表示命令。

输出

输出这个中位数。

样例输入
7 4 
5 5
2 4 
4 6 
3 5 
样例输出
1
提示

数据范围:1<=N<=1000000,1<=K<=25000,1<=A<=B<=N。
说明:贝里斯放好以后每个器皿中干草的数量分别是0,1,2,3,3,1,0,排序后是0,0,1,1,2,3,3,中间第四个位置上的1就是中位数。

#include<bits/stdc++.h>
using namespace std;
int n,k,s[1000001],a,b;
int main()
{
    cin>>n>>k; 
    while(k--)
    {
        cin>>a>>b;
        s[a]++;
        s[b+1]--;
    }
    for(int i=2;i<=n;i++)
        s[i]=s[i]+s[i-1];
    sort(s+1,s+n+1);
    cout<<s[(n+1)/2];
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值