http://codeforces.com/problemset/problem/847/B

题意:给你n个数(n<2e5)把它们分成若干组升序的子序列,一行输出一组。分的方法相当于不断找最长递增子序列,将它们删除,然后继续找,直到删光整个初始数列。

题解:第一直觉是开一个vector<int> n[maxn].每读取一个数x,if(x>v[i].back())v[i]。push_back(x);else v[++cnt].push_back(x).交了一发TLE了。然后分析一下,这样做保证了所有v[i].back()是个递减数列(否则那个不符和的可以push back到前面的vector后面。)本来的算法时间复杂度最坏O(n*n)。若用二分找到可以插入的vector,就能变成nlogn.然后就AC了。

   二分查找用了pos=lower_bound(a+1,a+1+n,x)-a;这一步会找到a数组(所有vector的最后元素组成的数组)中第一个大于等于x的位置,pos--让pos变成最后一个小于x的位置,也就是应该插入的地方。

   如果x比所有数都大(比如第一个元素),pos 就会先指到n+1,- - 后指到a数组的n位置,也就代表着第一个开始push_back的vector(所以输出时要反着输出)。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<vector> using namespace std;
const int maxn = 2e5 + ;
int a[maxn];
vector<int> v[maxn];
int main() {
int n; int cnt = ;
cin >> n;
for (int i = ; i <= n; i++) {
int x;
scanf("%d", &x);
int pos = lower_bound(a + , a + + n, x)-a;
pos--;
a[pos] = x;
v[pos].push_back(x);
}
for (int i = n; i>=; i--) {
for (int j = ; j < v[i].size(); j++)printf("%d ",v[i][j]);
cout << endl;
} }

  

CodeForces - 847B Preparing for Merge Sort 二分的更多相关文章

  1. Codeforces 847B - Preparing for Merge Sort

    847B - Preparing for Merge Sort 思路:前面的排序的最后一个一定大于后面的排序的最后一个.所以判断要不要开始新的排序只要拿当前值和上一个排序最后一个比较就可以了. 代码: ...

  2. codeforces 377B Preparing for the Contest 二分+优先队列

    题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇 ...

  3. Educational Codeforces Round 30 D. Merge Sort

    题意:给你n和k,n代表有多少个数,k代表几次操作,求一个1到n的序列,要k次mergesort操作才能还原 Examples Input 3 3 Output 2 1 3 Input 4 1 Out ...

  4. B. Preparing for Merge Sort

    \(考虑的时候,千万不能按照题目意思一组一组去模拟\) \(要发现每组的最后一个数一定大于下一组的最后一个数\) \(那我们可以把a中的数一个一个填充到vec中\) #include <bits ...

  5. 归并排序(Merge Sort)

    归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序 ...

  6. hdu5884 Sort(二分)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  7. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  8. SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join

    nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...

  9. 归并排序(merge sort)

    M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...

随机推荐

  1. 【Oracle】强制关闭会话

    select sid, serial# from V$session where sid in (select sid from v$LOCK where TYPE in ('TM','TX')); ...

  2. cocos2dx 3.0 scrollview 在android下面背景變綠色了

    在windows上面跑的是OK的,  在android下面跑的時候就變成這樣子了:

  3. 基于Python的接口自动化测试框架

    项目背景 公司内部的软件采用B/S架构,目的是进行实验室的数据存储.分析.管理. 大部分是数据的增删改查,但是由于还在开发阶段,所以UI的变化非常快,难以针对UI进行自动化测试,那样会消耗大量的精力与 ...

  4. chm只看到目录,看不到内容解决办法

    鼠标左键->属性->解除锁定->搞定!

  5. java List分批处理

    java List分批处理,例如对List中的数据进行批量插入. 方法一: /** * ClassName:Test List分批处理 * @author Joe * @version * @sinc ...

  6. [Linux] 修改用户名密码

    1. 普通用户或root用户修改自身登录密码:在终端使用passwd命令. linaro@linaro-ubuntu-desktop:~$ passwd Changing password for l ...

  7. oracle 排序字段自增长

    <insert id="insertGoodsDescription" parameterClass="goodsDescription" > &l ...

  8. 实现iOS中的链式编程

    谈到链式编程,那Masonry几乎就是最经典的代表.如: make.top.equalTo(self.view).offset() 像这样top.equalTo(self.view).offset(6 ...

  9. opencv3——ANN算法的使用

    最近刚转用opencv3,使用ANN算法时遇到了一些问题,记录下来. 训练神经网络的代码如下: //创建ANN Ptr<ANN_MLP> bp = ANN_MLP::create(); 设 ...

  10. JS函数匿名替换

    //匿名替换函数 function objFunc() { var obj = new Object(); obj.JsonData = [{ aa: "}], obj.FilterData ...