Haybale Stacking

时间限制: 1 Sec 内存限制: 64 MB
[提交] [状态]
题目描述
Feeling sorry for all the mischief she has caused around the farm recently,Bessie has agreed to help Farmer John stack up an incoming shipment of hay bales.

She starts with N (1 <= N <= 1,000,000, N odd) empty stacks, numbered 1…N. FJ then gives her a sequence of K instructions (1 <= K <= 25,000), each of the form “A B”, meaning that Bessie should add one new haybale to the top
of each stack in the range A…B. For example, if Bessie is told “10 13”, then she should add a haybale to each of the stacks 10, 11, 12, and 13.

After Bessie finishes stacking haybales according to his instructions, FJ would like to know the median height of his N stacks – that is, the height of the middle stack if the stacks were to be arranged in sorted order (conveniently, N is odd, so this stack is unique). Please help Bessie determine the answer to FJ’s question.
输入

  • Line 1: Two space-separated integers, N K.
  • Lines 2…1+K: Each line contains one of FJ’s instructions in the form of two space-separated integers A B (1 <= A <= B <= N).
    输出
  • Line 1: The median height of a stack after Bessie completes the instructions.
    样例输入 Copy
    7 4
    5 5
    2 4
    4 6
    3 5
    样例输出 Copy
    1
    提示
    There are N=7 stacks, and FJ issues K=4 instructions. The first instruction is to add a haybale to stack 5, the second is to add haybales to stacks 2…4, etc.After Bessie is finished, the stacks have heights 0,1,2,3,3,1,0. The median stack height is 1, since 1 is the middle element in the sorted ordering 0,0,1,1,2,3,3.
    题目大意转换一下就是给出K个instructions,每个instruction给定一个区间,在该区间内的所有的数(初始均为0)增加1,求最后从小到大排序后中间的那个数是多少
    这个题常规方法是对每次询问遍历区间内所有的数,对其进行加一操作,但考虑到题目中N,K过大,这种方法一定会超时。仔细一想,就是对某个区间上所有的数增加一个常数的操作,可以用差分+前缀和来处理,时间复杂度为O(n)
    此题考查差分的应用,思路来自这篇文章差分思路很简单,就是对每次询问,将区间左端点的数增加一个常数,区间右端点的下一个数减少同一个常数,然后对询问之后的差分数列再求前缀和得到原数列,在这个题中,得到原数列后还要进行一次qsort(或sort)快排获得中间的数
#include<stdio.h>
#include<stdlib.h>
int a[1000005]={0};
int cmp(const void*a,const void*b)
{
    return *(int*)a-*(int*)b;
}
int main()
{
    int n;
    int k;
    int i;
    int l;
    int r;
    scanf("%d %d",&n,&k);
    while(k--)
    {
        scanf("%d %d",&l,&r);
        a[l]++;//每次询问后都要操作区间端点的数
        a[r+1]--;
    }
    for(i=1;i<=n;i++)a[i]+=a[i-1];
    qsort(a+1,n,sizeof(int),cmp);//快排的首地址是a+1
    printf("%d",a[(n+1)/2]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值