CodeForces - 847B Preparing for Merge Sort 二分
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 二分的更多相关文章
- Codeforces 847B - Preparing for Merge Sort
847B - Preparing for Merge Sort 思路:前面的排序的最后一个一定大于后面的排序的最后一个.所以判断要不要开始新的排序只要拿当前值和上一个排序最后一个比较就可以了. 代码: ...
- codeforces 377B Preparing for the Contest 二分+优先队列
题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇 ...
- 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 ...
- B. Preparing for Merge Sort
\(考虑的时候,千万不能按照题目意思一组一组去模拟\) \(要发现每组的最后一个数一定大于下一组的最后一个数\) \(那我们可以把a中的数一个一个填充到vec中\) #include <bits ...
- 归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序 ...
- hdu5884 Sort(二分)
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- 归并排序(merge sort)
M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...
随机推荐
- ios开发之--NSString的操作
NSString的操作,下面记录下他的常用方法: NSString *str = @"1111111111aaaaaaaaa2222222222"; 1.查找 //查找 NSRan ...
- Nginx(十一)-- keepalived简介
1. 什么是keepalived 基于VRRP(虚拟路由器冗余协议)来实现对web服务的高可用方案. keepalived下载地址:http://download.csdn.net/detail/u0 ...
- SaltStack salt-run 命令
salt-run 常见用法如下: salt-run manage.up # 查看在线的minion salt-run manage.down # 查看不在线的minion salt-run manag ...
- 浅谈千万级PV/IP规模高性能高并发网站架构(转自老男孩)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/736710 如果把来 ...
- Excel 导入遍历
package com.founder.ec.cms.service.impl; import com.founder.ec.cms.service.ProductListImportService; ...
- 51单片机的idata,xdata,pdata,data的详解(转)
data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小. bit :是指0x20-0x2f的可位寻址区idata:固定指前面0x00-0xff的2 ...
- codeforces水题100道 第二十六题 Codeforces Beta Round #95 (Div. 2) A. cAPS lOCK (strings)
题目链接:http://www.codeforces.com/problemset/problem/131/A题意:字符串大小写转换.C++代码: #include <cstdio> #i ...
- MFC框架程序解析
MFC的 程序框架: WinMain函数:程序首先到达全局变量theApp,再到达theAPP的构造函数,最后到达WinMain函数处. 问:为何要定义一个全局对象theAPP,让其在WinMain函 ...
- Visual C++中去除警告
在编程中,编译器警告的意思是提问程序员:如果这样做将会出现意外的错误,你确定要这样做吗? 在很多情况下,我们写程序的时候会出现一些警告,而这些警告我们都知道这样做的确是需要的并且程序中多处出现这种做法 ...
- 【Python3】 django2.0 url 跳转设置
python: 3.6.4 django : 2.0 在创建应用时候.我是把 urls.py 分开了.所以在设置url跳转时候.要修改成如下模式 1 父 urls.py 里边要加上命名空间 2 ...