SGU 199 Beautiful People 二维最长递增子序列
题目链接:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20885
题意:
求二维最长严格递增子序列。
题解:
O(n^2)的算法很好想,不过这里会t掉,只能O(nlogn)
于是用二分来维护:
先把所有的数按x递增排序,x相同的按y递减排序(这里之所以要按y递减排序是因为为了写代码方便,递减的话你后面基本就只要考虑y的大小,如果不递减,你还要考虑x的大小的,具体的可以自己思考一下)
排完序之后我们接下来就只考虑y的大小,我们维护一个目前长度为len的最长子序列,并且它的value取目前所有长度为len的最长子序列中,以最小y结尾的那个y值。
然后我们会发现我们维护的这些长度的value是随长度变大递增的!!!(这个可以证明!),于是就可以用二分来找能接在当前的那个人后面的最长的长度。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; const int maxn = 1e5 + ; struct Node {
int x, y,id;
bool operator < (const Node& tmp) const {
return x < tmp.x||x==tmp.x&&y>tmp.y;
}
}arr[maxn]; int n,maxlen;
int pre[maxn],dp[maxn],yy[maxn]; void init() {
memset(pre, -, sizeof(pre));
maxlen = ;
} int main() {
while (scanf("%d", &n) == && n) {
init();
for (int i = ; i < n; i++) {
scanf("%d%d", &arr[i].x, &arr[i].y);
arr[i].id = i + ;
}
sort(arr, arr + n);
dp[] = ; yy[++maxlen] = ;
for (int i = ; i < n; i++) {
int low = , hig = maxlen+;
if (arr[i].y <= arr[yy[low]].y) {
yy[low] = i;
continue;
}
while (low + < hig) {
int mid = low + (hig - low) / ;
if (arr[yy[mid]].y < arr[i].y) low = mid;
else hig = mid;
}
pre[i] = yy[low];
int len = low + ;
if (len > maxlen) {
yy[++maxlen] = i;
}
else {
if (arr[i].y < arr[yy[len]].y) yy[len] = i;
}
}
vector<int> ans;
int p = yy[maxlen];
while (p != -) {
ans.push_back(p);
p = pre[p];
}
printf("%d\n", ans.size());
for (int i = ; i < ans.size() - ; i++) printf("%d ", arr[ans[i]].id);
printf("%d\n", arr[ans[ans.size() - ]].id);
}
return ;
}
还有一种复杂的解决方法,用二分查找符合区间,然后用线段树查区间最大值。
待续。。。
SGU 199 Beautiful People 二维最长递增子序列的更多相关文章
- [poj1088]滑雪(二维最长下降子序列)
解题关键:记忆化搜索 #include<cstdio> #include<cstring> #include<algorithm> #include<cstd ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- LIS 最长递增子序列
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- 华为OJ2288-合唱队(最长递增子序列)
一.题目描述 描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, -, ...
- [SGU 199] Beautiful People
[SGU 199] Beautiful People The most prestigious sports club in one city has exactly N members. Each ...
- 二维动态规划&&二分查找的动态规划&&最长递增子序列&&最长连续递增子序列
题目描述与背景介绍 背景题目: [674. 最长连续递增序列]https://leetcode-cn.com/problems/longest-continuous-increasing-subseq ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- 最长递增子序列(Longest Increase Subsequence)
问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8 ...
- 51NOD 1376 最长递增子序列的数量 [CDQ分治]
1376 最长递增子序列的数量 首先可以用线段树优化$DP$做,转移时取$0...a[i]$的最大$f$值 但我要练习$CDQ$ $LIS$是二维偏序问题,偏序关系是$i<j,\ a_i< ...
随机推荐
- iOS 越狱后 SSH 不能连接
10.3 越狱之后,装上 OpenSSH, 但是发现连接不上,一直卡着不动,端口是通的,但是就是一直卡着.解决方法是在 Cydia 添加源 http://apt.cydiaba.cn,搜索 Dropb ...
- Spring框架中用到的设计模式(转)
主要参考这篇文章 http://blog.didispace.com/spring-design-partern/
- 两张图证明 WolframAlpha 的强大
引用于:https://capbone.com/wolfram-alpha/ 两张图证明 WolframAlpha 的强大 之前在" 我手机中有哪些应用 "里提到过 Wolfram ...
- python七类之集合
集合 一.关键字 : set 定义是 s = {} #当里面没有元素的时候表现为字典数据类型 s = {} #空的{}代表空的字典,而不是集合 print(type(s)) 集合是不可哈希的 ...
- python2.7入门---2.x与3.x版本区别
Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向 ...
- (转)ASP.NET中常见文件类型及用途
从入门导师那继承来的习惯,也是加上自己的所谓经验判断,一直对WEB开发不太感冒,可惜呀,从业近二十年,还得从头开始对付HTML.CSS.JS.ASPX,以前的经验,用不上啦!!!先从好好学习ASPX开 ...
- 20155204 2016-2017-2 《Java程序设计》第10周学习总结
20155204 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 1.计算机网络概述 路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控 ...
- 20155317王新玮 2006-2007-2 《Java程序设计》第3学习总结
20155317王新玮 2006-2007-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 chothes(String coler,char size)的含义是对col ...
- sql语句-6-更新数据
- 【LG3703】[SDOI2017]树点涂色
[LG3703][SDOI2017]树点涂色 题面 洛谷 题解 更博辣,更博辣!!! 猪年的第一篇博客 一次只能染根到\(x\),且染的颜色未出现过 这句话是我们解题的关键. 设\(x\)到根的颜色数 ...