0
点赞
收藏
分享

微信扫一扫

干草堆(寒假每日一题 2)

贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来。

开始时,共有 干草堆(寒假每日一题 2)_排序 个空干草堆,编号 干草堆(寒假每日一题 2)_差分_02 ~ 干草堆(寒假每日一题 2)_排序

约翰给贝茜下达了 干草堆(寒假每日一题 2)_排序_04 个指令,每条指令的格式为 ​​​A B​​​,这意味着贝茜要在 干草堆(寒假每日一题 2)_前缀和_05 范围内的每个干草堆的顶部添加一个新的干草捆。

例如,如果贝茜收到指令 干草堆(寒假每日一题 2)_c++_06 干草堆(寒假每日一题 2)_前缀和_07,则她应在干草堆 干草堆(寒假每日一题 2)_排序_08 中各添加一个干草捆。

在贝茜完成了所有指令后,约翰想知道 干草堆(寒假每日一题 2)_排序 个干草堆的中值高度——也就是说,如果干草堆按照高度从小到大排列,位于中间的干草堆的高度。

方便起见,干草堆(寒假每日一题 2)_排序 一定是奇数,所以中间堆是唯一的。

请帮助贝茜确定约翰问题的答案。

输入格式
第一行包含 干草堆(寒假每日一题 2)_排序干草堆(寒假每日一题 2)_排序_04

接下来 干草堆(寒假每日一题 2)_排序_04 行,每行包含两个整数 干草堆(寒假每日一题 2)_差分_14,用来描述一个指令。

输出格式
输出完成所有指令后,干草堆(寒假每日一题 2)_排序 个干草堆的中值高度。

数据范围
干草堆(寒假每日一题 2)_前缀和_16,
干草堆(寒假每日一题 2)_差分_17,
干草堆(寒假每日一题 2)_c++_18

输入样例:

7 4
5 5
2 4
4 6
3 5

输出样例:

1

样例解释
贝茜完成所有指令后,各堆高度为 干草堆(寒假每日一题 2)_差分_19
将各高度从小到大排序后,得到 干草堆(寒假每日一题 2)_前缀和_20,位于中间的是 干草堆(寒假每日一题 2)_差分_02

解题思路

  1. 用差分数组实现区间加操作
  2. 前缀和求原数组,然后排序后输出中间值

​注意 sort 函数的右区间是开区间(取不到)左闭右开​

​AC Code​

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1000010;

int a[N], b[N];

void insert(int l, int r, int c){
b[l] += c;
b[r+1] -= c;
}

int main(){

int n, k, l, r;

scanf("%d%d", &n, &k);

while(k--){
scanf("%d%d", &l, &r);
insert(l, r, 1);
}

for(int i = 1; i <= n; i++) a[i] = b[i] + a[i-1];

sort(a + 1, a + n + 1); // 优化:nth_element(a + 1, a + mid, a + n + 1);

int mid = 1 + n >> 1;

cout << a[mid] << endl;

return 0;
}

优化

本题 ​​sort(a + 1, a + n + 1)​​​ 函数
可采用 ​​​nth_element(a + 1, a + mid, a + n + 1);​​ 进行优化

nth_element(); 函数参数 (begin, pos, end)

nth_element 函数相当于求第 干草堆(寒假每日一题 2)_排序_22 大的数。


举报

相关推荐

《每日一题》干草堆

2041 干草堆

【414.干草堆】

干草堆(差分)

AcWing 2041. 干草堆

AcWing 2041.干草堆

0 条评论