链接

小Hi家的阳台上摆着一排N个空花盆,编号1~N。从第一天开始,小Hi每天会选择其中一个还空着花盆,栽种一株月季花,直到N个花盆都栽种满月季。

我们知道小Hi每天选择的花盆的编号依次是A1, A2, ... AN。随着花盆中被栽种上月季,连续的空花盆数量越来越少。

现在小Ho想知道,第一次出现恰好K个连续空花盆(恰好是指这K个空花盆两边相邻的位置都不是空花盆)是第几天?

假设N=7,K=2,小Hi第1天~第7天选择的花盆编号依次是:4、2、7、5、1、3、6。

1234567
OOOOOOO 第0天,一段7个连续空花盆
OOOXOOO 第1天,一段3个连续空花盆,和另一段3连续个空花盆
OXOXOOO 第2天,1个、1个和3个连续空花盆
OXOXOOX 第3天,第一次出现2个连续空花盆
....

输入

第一行包含两个整数,N和K。

第二行包含N个两两不同的整数,A1, A2, ... AN

对于30%的数据, 1 <= K < N <= 1000

对于100%的数据,1 <= K < N <= 100000, 1 <= Ai <= N

输出

输出第一次出现恰好连续K个空花盆是第几天。如果自始至终没出现输出-1

--------------------------------------------------------------------------------------------------------------------------

维护一个有序列表,每insert一个数则找到比它稍大和稍小的数,查看这两个区间长度是否满足条件。

我写了个二叉排序树超时了。。

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
#define OO 0x0fffffff
using namespace std;
typedef long long LL; struct Node{
int data;
Node *left,*right,*father;
Node(){left=right=father=NULL;}
Node(int data,Node* father):data(data),father(father){
left=right=NULL;
}
Node* insert(int newd,int& bigger,int& smaller){
if(newd<data){
bigger = data;
if(left==NULL) return (left = new Node(newd,this));
else return left->insert(newd,bigger,smaller);
}
else{
smaller = data;
if(right==NULL) return right = new Node(newd,this);
else return right->insert(newd,bigger,smaller);
}
}
}; int main(){
int bigger,smaller;
int N,K,data; cin>>N>>K; K++;
Node* root = new Node(0,NULL);
root->insert(N+1,bigger,smaller); int ans = -2;
bool finded = false;
for(int i=0;i<N;i++){
scanf("%d",&data);
if(finded) continue; Node* p = root->insert(data,bigger,smaller);
//int bigger = p->findBigger();
//int smaller = p->findSmaller();
if(bigger-data==K||data-smaller==K){
ans = i; finded = true;
}
}
printf("%d\n",ans+1);
return 0;
}

看了别人代码才知道有upper_bound这个东西,直接调用就行了。。。

ac的代码

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
#define OO 0x0fffffff
using namespace std;
typedef long long LL; set<int> sets; int main(){
int N,K,data; cin>>N>>K; K++;
sets.insert(); sets.insert(N+); int ans = -;
bool finded = false;
for(int i=;i<N;i++){
scanf("%d",&data);
if(finded) continue;
auto iter = sets.upper_bound(data);
int bigger = (*iter);
int smaller = *(--iter);
if(bigger-data==K||data-smaller==K){
finded = true, ans = i;
}
sets.insert(data);
}
printf("%d\n",ans+);
return ;
}

hiho 1572 - set.upper_bound,排序树的更多相关文章

  1. sqlalchemy tree 树形分类 无限极分类的管理。预排序树,左右值树。sqlalchemy-mptt

    简介: 无限极分类是一种比较常见的数据格式,生成组织结构,生成商品分类信息,权限管理当中的细节权限设置,都离不开无限极分类的管理. 常见的有链表式,即有一个Pid指向上级的ID,以此来设置结构.写的时 ...

  2. hiho一下21周 线段树的区间修改 离散化

    离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...

  3. HDU Always Cook Mushroom (极角排序+树状数组)

    Problem Description Matt has a company, Always Cook Mushroom (ACM), which produces high-quality mush ...

  4. hiho一下20周 线段树的区间修改

    线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...

  5. 【九度OJ】题目1201-二叉排序树

    题目 建树过程是递归,"递归的思路不是很复杂",经过题目1078的训练,直接开始编码.提交及修改的过程告诉自己,这是一个错觉,对递归的理解还应该再进一步. 自己的实现 #inclu ...

  6. 树·二叉查找树ADT(二叉搜索树/排序树)

    1.定义 对于每个节点X,它的左子树中所有的项的值小于X的值,右子树所有项的值大于X的值. 如图:任意一个节点,都满足定义,其左子树的所有值小于它,右子树的所有值大于它. 2.平均深度 在大O模型中, ...

  7. 自平衡二叉(查找树/搜索树/排序树) binary search tree

    在计算机科学中,AVL树是最先发明的自平衡二叉查找树.AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An alg ...

  8. 一步一步写数据结构(BST-二叉排序树)

    二叉排序树的重要性不用多说,下面用c++实现二叉排序树的建立,插入,查找,修改,和删除.难点在于删除,其他几个相对比较简单. 以下是代码: #include<iostream> using ...

  9. hiho一下 第二周 trie树

    Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路 ...

随机推荐

  1. Kylin基础教程(二)

    近期先把Kylin教程整理完毕,后续根据大家需求(可能会发起投票),整理其他技术栈知识教程. OK,那么接上一篇文章,感性认知了Kylin之后,我们先来看一下如何部署Kylin吧. 序号也依然沿用上一 ...

  2. adplus 抓取dump

    工具所在路径   C:\Program Files\Windows Kits\10\Debuggers\x64 cmd窗口切换目录倒adplus所在路径下,输入抓取命令.adplus -hang -p ...

  3. struts2学习之基础笔记3

    第8章Struts 2类型转换 使用类型转换器 自定义类型转换器 步骤:1. Struts 2 构建流程 2.自定义类型转换器类(继承 DefaultTypeConverter /StrutsType ...

  4. windows及git常用命令

    windows常用命令: 创建文件夹:md 文件夹名 创建空的文件:type nul>文件名 创建有内容文件:echo "内容">文件名 查看文件内容:type +文件 ...

  5. js input 只能输入数字

    HTML网页上这么写 <input type="text" style="ime-mode:disabled;" onpaste="return ...

  6. iOS构建流畅的交互界面--CPU,GPU资源消耗的原因和解决方案

    CPU资源消耗的原因和解决方案对象创建轻量对象代替重量对象* 不需要响应触摸事件的控件:CALayer显示* 对象不涉及UI操作,则尽量放到后台线程创建* 包含有CALayer的控件只能在主线程创建和 ...

  7. Unity类继承关系 图

    UnityEngine(命名空间) 其他命名空间 其他类 Object(类) 其他类(继承自Object) Component(类)(继承自Object) 其他类(继承自Component) Tran ...

  8. 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析

    今天运行程序是出现了this application has requested the runtime  to terminate it in an unusual way. 的异常报告,以前也经常 ...

  9. Java并发--线程安全策略

    1 不可变对象 用不可变对象保证线程安全,是相当于不让线程并发,逃避了并发. 不可变对象就是指一个类的实例化对象不可变.比如String类的实例 主要方法有: 将类声明为final 将所有成员声明为 ...

  10. [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)

    题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度 tips:子序列可以不连续,但不能破坏在原序列中的顺序 观察数据范围,n<=50,很小,考虑dfs *dfs来跑区间 ...