Gym 101246H ``North-East''(LIS)
http://codeforces.com/gym/101246/problem/H
题意:
给出n个点的坐标,现在有一个乐队,他可以从任一点出发,但是只能往右上方走(包括右方和上方),要经过尽量多的点。输出它可能经过的点和一定会经过的点。
思路:
分析一下第一个案例,在坐标图上画出来,可以发现,他最多可以经过4个点,有两种方法可以走。
观察一下,就可以发现这道题目就是要我们求一个LIS。
首先,对输入数据排一下顺序,x小的排前,相等时则将y大的优先排前面。
用二分法求LIS,这样在d数组中就可以保存以第i个数结尾的LIS。
求完之后,我们从后往前分析,如果当前点处于第x个位置(也就是LIS的第x个数),如果第x+1个位置的可走点的最大y值大于了当前点的y值,那么当前点是可以选的。在此过程中,动态维护LIS每个位置可走点的最大y值。当然了,还要记录每个位置可走点的个数(这个为第二个答案做铺垫,因为当一个点是可选的并且它所在的LIS位置上只有一个可走点,那么这个点肯定是要经过的)。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn=1e5+; int n; struct Point
{
int x, y;
int id;
bool operator < (const Point& rhs) const
{
return x<rhs.x || (x==rhs.x && y>rhs.y);
}
}p[maxn]; int g[maxn];
int d[maxn];
int h[maxn]; int may[maxn];
int cnt[maxn]; vector<int> ans1, ans2; int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)
{
scanf("%d%d",&p[i].x, &p[i].y);
p[i].id = i;
} sort(p+,p+n+);
int len = ;
for(int i=;i<=n;i++) g[i]=INF;
for(int i=;i<=n;i++)
{
int k=lower_bound(g+,g+n+,p[i].y)-g;
if(k==len+) len++;
d[i]=k;
g[k]=p[i].y;
} for(int i=;i<=len;i++) h[i]=-INF;
memset(may,,sizeof(may));
memset(cnt,,sizeof(cnt)); for(int i=n;i>=;i--)
{
int x=d[i];
if(x==len) {h[x]=max(h[x], p[i].y); may[i]=; cnt[x]++;}
else
{
if(h[x+]>p[i].y) {h[x]=max(h[x],p[i].y); may[i]=; cnt[x]++;}
}
} ans1.clear(); ans2.clear(); for(int i=;i<=n;i++)
if(may[i]) ans1.push_back(p[i].id);
sort(ans1.begin(),ans1.end());
printf("%d ",ans1.size());
for(int i=;i<ans1.size();i++)
{
printf("%d%c",ans1[i],i==ans1.size()-?'\n':' ');
} for(int i=;i<=n;i++)
if(may[i] && cnt[d[i]]==) ans2.push_back(p[i].id);
sort(ans2.begin(),ans2.end());
printf("%d ",ans2.size());
for(int i=;i<ans2.size();i++)
{
printf("%d%c",ans2[i],i==ans2.size()-?'\n':' ');
}
}
return ;
}
Gym 101246H ``North-East''(LIS)的更多相关文章
- ZOJ 1093 Monkey and Banana (LIS)解题报告
ZOJ 1093 Monkey and Banana (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- 浅谈最长上升子序列(LIS)
一.瞎扯的内容 给一个长度为n的序列,求它的最长上升子序列(LIS) 简单的dp n=read(); ;i<=n;i++) a[i]=read(); ;i<=n;i++) ;j<i; ...
- 最长递增子序列(LIS)(转)
最长递增子序列(LIS) 本博文转自作者:Yx.Ac 文章来源:勇幸|Thinking (http://www.ahathinking.com) --- 最长递增子序列又叫做最长上升子序列 ...
- Poj 2533 Longest Ordered Subsequence(LIS)
一.Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...
- Poj 3903 Stock Exchange(LIS)
一.Description The world financial crisis is quite a subject. Some people are more relaxed while othe ...
- DP——最长上升子序列(LIS)
DP——最长上升子序列(LIS) 基本定义: 一个序列中最长的单调递增的子序列,字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序. LIS ...
- 最长上升子序列(LIS)nlogn模板
参考https://www.cnblogs.com/yuelian/p/8745807.html 注意最长上升子序列用lower_bound,最长不下降子序列用upper_bound 比如123458 ...
- 低价购买 (动态规划,变种最长下降子序列(LIS))
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 最长上升子序列(LIS)问题
最长上升子序列(LIS)问题 此处我们只讨论严格单调递增的子序列求法. 前面O(n2)的算法我们省略掉,直接进入O(nlgn)算法. 方法一:dp + 树状数组 定义dp[i]:末尾数字是i时最长上升 ...
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
随机推荐
- Promise、async、await在Egret的简单应用
Egret Engnie 5.1.10 Egret Wing 4.1.5 一.Promise.async.await相关知识 Promise介绍 阮一峰 async函数 阮一峰 具体和详细的说明用法可 ...
- js的delete和void关键字
delete关键字 delete关键字的作用: 删除对象的属性 语法:delete 对象.属性 可以删除没有使用var关键字声明的全局变量(直接定义在window上面的属性) delete关键字的 ...
- vue 缓存的keepalive页面刷新数据
用到这个的业务场景是这样的: a页面点击新建列表按钮进入到新建的页面b,填写b页面并点击b页面确认添加按钮,把这些数据带到a页面,填充到列表(数组),可以添加多条, 点击这条的时候进入到编辑页面,确认 ...
- 用到了yii2 hasMany() 方法,一对多关联
view页面代码:其中supply,item,price是一个AR类都是一个类,item和prices是一对多关系: [ 'label' => '参考', 'format' => 'htm ...
- poj1961 & hdu1358 Period【KMP】
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 20436 Accepted: 9961 Descripti ...
- Maven 的聚合(多模块)和 Parent 继承
2017年06月26日 21:16:57 Maven 的聚合(多模块)和 Parent 继承 - 偶尔记一下 - CSDN博客 https://blog.csdn.net/isea533/articl ...
- avaScript 的基础学习(一)
JavaScript概述 JavaScript由三部分组成: JavaScript的基础 JS的引入方式: JS的数据类型: 运算符: 流程控制: JavaScript的对象 BOM对象 DOM Ev ...
- India and China Origins---hdu5652(二分 + bfs)或者(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 很久以前,中国和印度之间并没有喜马拉雅山相隔,两国的文化交流很频繁.随着喜马拉雅山海拔逐 ...
- 15.Git面试题
1.git常见命令作用 git init 在哪一目录下,就会在该目录下生成.git目录. 注意:git init命令会把当前目录当作库. git status 查看本地库的状态 git add . 将 ...
- 详解maxlength属性在textarea里奇怪的表现
这篇文章主要介绍了maxlength属性在textarea里奇怪的表现的相关资料,需要的朋友可以参考下 HTML5给表单带来了很多改变,比如今天要说的maxlength,这个属性可以限制输入框输入的最 ...