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< ...
随机推荐
- js的组合函数
1.组合函数即由若干个函数组合成一个新的函数,同时完成数据的传递 1>最简单版本 这种方法实现的组合函数,需要我们指定函数的执行顺序 /**第一种方法 */ function add(a, b) ...
- 使用CURL实现GET和POST方式请求
/** 使用curl方式实现get或post请求@param $url 请求的url地址@param $data 发送的post数据 如果为空则为get方式请求return 请求后获取到的数据 */f ...
- DMZ靶场渗透
0x00 目标站点www.test.ichunqiu 0x01 尝试登陆系统 -尝试弱密码登陆 结果:forbidden!!! -尝试万能账号密码登陆 1‘ or 1=1--+ 和 1‘ or 1=1 ...
- SQL 列转行 分组去重并合并多条记录
继上篇<SQL 列转行 合并多条记录>后,有网友反馈新的需求还是不太会用. 现举例说明 一,网友需要如下的效果: 其实,这个需求依然可以我上篇的方法进行解答,但为了实现分组,需要disti ...
- python2.7入门---GUI编程(Tkinter)
Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 . ...
- 20155308 2016-2017-2《Java程序设计》课程总结
20155308 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:回答"我专业吗.我的老师.师生关系.代码问题"四个问题. 预备作业2 ...
- 20155318 《Java程序设计》实验三 (敏捷开发与XP实践)实验报告
20155318 <Java程序设计>实验三 (敏捷开发与XP实践)实验报告 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化 ...
- [arc068E]Snuke Line-[树状数组]
Description 传送门 Solution 假如想直接YY对于每一个d会有多少种商品满足条件,em反正我搞不定. 然后大佬的题解告诉我说:搞不定?那就不搞它啊,反过来不就得了? 好吧.我们来考虑 ...
- 【转载】Ogre3d 2.1 源码编译安装教程
原文:Ogre3d 2.1 源码编译安装教程 今年是3D手游年,今年也是游戏引擎战争进入白热的一年. 移动游戏的红海时代,让各大端游也忍不住纷纷伸出大白腿,Unreal.CryEngine纷纷宣布自己 ...
- 用 GSL 求解超定方程组及矩阵的奇异值分解(SVD)
用 GSL 求解超定方程组及矩阵的奇异值分解(SVD) 最近在学习高动态图像(HDR)合成的算法,其中需要求解一个超定方程组,因此花了点时间研究了一下如何用 GSL 来解决这个问题. GSL 里是有最 ...