题目:

2344: 盖伦的告白

时间限制: 1 秒   内存限制: 128 MB
提交: 57   解决: 20
提交  状态

题目描述

盖伦和赵信这对基友又在打赌,谁输了就去向卡特琳娜告白。。

这一季中盖伦一如既往的怂。赵信为了帮他一把,故意表现出很厉害的样子,结果成功激活了盖伦的智商。

赵信手中有n张牌,每张牌上面有一个数,这些牌是非递减的。现在盖伦从他手中抽取k张牌,如果盖伦抽取后剩下的牌中相邻两张的差值的最大值最小,就算他赢。

结果当然是盖伦赢了。那么问题来了!

输入

第一行两个正整数n和k。

第二行n个数代表n张牌。

3≤n≤105

1≤k≤n-2

-109≤Ai≤109

输出

输出只有一个数,上述中的最小值。

样例输入

5 1
1 2 4 7 8
8 2
1 2 3 5 8 13 17 18
5 1
1 2 4 6 9

样例输出

3
5
2

提示

来源

Practice-Round#2

思路:

我们要在一个非递减序列相邻的差值最大的中找最小的,那么我们的最优策略是从两边拿,而不是从中间取。

我们先预处理出每两位的差,然后建立线段树,更新最小值就行

代码:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <string>
#include <set>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define mod 10000007
#define debug() puts("what the fuck!!!")
#define N 100200
#define M 1000000
#define ll long long
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 //位运算,|可以理解为+
int MAX[N<<2],a[N];
void pushup(int rt)//更新该节点维护的值,求和
{MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
}
void build(int l,int r,int rt)//建立线段树
{if(l==r){MAX[rt]=a[l+1]-a[l];return;}int m=(l+r)>>1;build(lson);build(rson);pushup(rt);
}
int query(int L,int R,int l,int r,int rt)//要查询的区间和当前的左右节点和根节点
{if(L<=l&&r<=R)//[l,r]∈[L,R]{return MAX[rt];}int m=(l+r)>>1;//找中间点int ret=0;if(L<=m)  ret=max(ret,query(L,R,lson));if(R>m)   ret=max(ret,query(L,R,rson));return ret;
}
int main()
{int n,k;while(~scanf("%d%d",&n,&k)){mem(MAX,0);for(int i=1; i<=n; i++)scanf("%d",&a[i]);build(1,n-1,1);int len=n-k-1,ans=inf;for(int i=1; i<=n-len; i++)//至少选len个ans=min(ans,query(i,len+i-1,1,n-1,1));printf("%d\n",ans);}return 0;
}

NYOJ-备用2344 盖伦的告白(线段树,区间最大值)相关推荐

  1. NYOJ备用2344 盖伦的告白(线段树||双端队列)

    2344: 盖伦的告白 时间限制: 1 Sec   内存限制: 128 MB 提交: 56   解决: 19 [ 提交][ 状态][ 讨论版] 题目描述 盖伦和赵信这对基友又在打赌,谁输了就去向卡特琳 ...

  2. 【线段树】nyoj-备用 2344: 盖伦的告白

    2344: 盖伦的告白 时间限制: 1 Sec   内存限制: 128 MB 提交: 44   解决: 16 [ 提交][ 状态][ 讨论版] 题目描述 盖伦和赵信这对基友又在打赌,谁输了就去向卡特琳 ...

  3. nyoj 盖伦的告白(线段树||双端队列)

    盖伦的告白 题目描述 盖伦和赵信这对基友又在打赌,谁输了就去向卡特琳娜告白.. 这一季中盖伦一如既往的怂.赵信为了帮他一把,故意表现出很厉害的样子,结果成功激活了盖伦的智商. 赵信手中有n张牌,每张牌 ...

  4. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  5. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  6. CF911G Mass Change Queries (线段树区间 合并)

    题意: 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 题解: 100个数,很容易想到要从这里进行突破,对于某次操作我们只需要把这个区间的数x给移动到y ...

  7. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  8. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  9. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

最新文章

  1. 腾讯和头条,构建类脑神经元网络的两条路线之争
  2. 输入对话框 android,android 输入对话框 确认对话框
  3. 为什么我的电脑输入法的图标和原来的活动窗口离得那么远
  4. 关于exchange 2013输入账号密码后owa空白页解决方法
  5. origin安装包_作图技巧|研究生需要会的20个Origin操作,作图又快又好看(二)...
  6. Java是如何实现跨平台的?原理是什么?
  7. Go的strconv二
  8. goldengate的实施过程
  9. JBuilder9+Weblogic8.1——Filter过滤器在Jbuilder9中的运用
  10. 数据挖掘肿瘤预测_科研套路不嫌多,数据挖掘发3分
  11. Buffer与Cache
  12. python api调用 验证码_Python调用创蓝253短信验证码API文档
  13. centos安装mysql wsl_win10安装wsl2和docker
  14. (25)梯度下降法求解曲面极小值
  15. 1147 Heaps (30分)
  16. 实名认证 芝麻认证 人脸识别 集成
  17. 什么是悬空 Docker 镜像?
  18. PDF报表 项目实战总结(集成百度地图+遇到的问题)
  19. CSAPP-Lab03 Attack Lab 详细解析
  20. 制作背景为透明的logo

热门文章

  1. MAC软件打开提示:已损坏,打不开 您应该将它移到废纸娄的解决方法
  2. 防伪系统技术条件--国标
  3. 后端框架有哪些?8个流行的后端框架推荐
  4. mPEG-DMPE DMPE-PEG 甲氧基PEG十四酰磷脂酰乙醇胺
  5. 几种常见的Shell:sh、bash、tcsh、csh、ash的区别
  6. php小数点2位不四舍五入,php怎么保留小数点后两位且不四舍五入
  7. java float小数点后几位小数_java实现double数据保留小数点后几位
  8. 《仙剑奇侠传柔情版》Java的简单实现(二)
  9. 基础元件学习——LC和LR电路
  10. matlab linprog函数的使用