x坐标排序,y坐标当权值,同一个x坐标的,y从大到小排。

求f(i)表示以i结尾的LIS以后,从后向前枚举,不断更新一个max数组,max(i)代表最长上升子序列为i时,当前的 结尾的最大值是多少。

一个元素可能在LIS里面,则说明存在一个j>i,f(j)=f(i)+1,且a(j)>a(i),就查询一下max(f(i)+1)是否大于a(i)即可。如果可行的话,再用该值更新max数组。

一定在LIS里面的就是i可能在LIS里面,并且f(i)只出现了一次的。

队友的代码(↓)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) ((x)&-(x))
using namespace std;
struct node{
int x,y,id;
}a[100005];
bool cmp(node a,node b)
{
return a.x==b.x?a.y>b.y:a.x<b.x;
}
int Ans1[100005],Ans2[100005],f[100005],g[100005],vis[100005],n,ans1num,ans2num,s[100005],ans,ls[100005];
bool cmp2(int a,int b)
{
return f[a]<f[b];
}
bool ans1[100005];
void add(int p,int x)
{
p=lower_bound(ls+1,ls+n+1,p)-ls;
for(;p<=n;p+=lowbit(p))
{
s[p]=max(s[p],x);
}
}
int get(int p)
{
p=lower_bound(ls+1,ls+n+1,p)-ls-1;
int nowans=0;
for(;p;p-=lowbit(p))
{
nowans=max(nowans,s[p]);
}
return nowans;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id=i;
ls[i]=a[i].y;
}
sort(ls+1,ls+n+1);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;++i)
{
f[i]=get(a[i].y)+1;
add(a[i].y,f[i]);
ans=max(ans,f[i]);
}
for(int i=n;i;--i)
{
if(f[i]==ans||(vis[f[i]+1]&&a[i].y<g[f[i]+1]))
{
ans1[i]=1;
if(vis[f[i]]==0)
{
g[f[i]]=a[i].y;
vis[f[i]]=1;
}
else
{
g[f[i]]=max(g[f[i]],a[i].y);
}
}
}
for(int i=1;i<=n;++i)
if(ans1[i])
{
Ans1[++ans1num]=i;
}
sort(Ans1+1,Ans1+ans1num,cmp2);
for(int i=1;i<=ans1num;++i)
{
if(f[Ans1[i]]!=f[Ans1[i-1]]&&f[Ans1[i]]!=f[Ans1[i+1]])
{
Ans2[++ans2num]=a[Ans1[i]].id;
}
}
for(int i=1;i<=ans1num;++i)
Ans1[i]=a[Ans1[i]].id;
sort(Ans1+1,Ans1+ans1num+1);
sort(Ans2+1,Ans2+ans2num+1); printf("%d ",ans1num);
for(int i=1;i<ans1num;++i)
printf("%d ",Ans1[i]);
if(ans1num) printf("%d\n",Ans1[ans1num]);
printf("%d ",ans2num);
for(int i=1;i<ans2num;++i)
printf("%d ",Ans2[i]);
if(ans2num)printf("%d\n",Ans2[ans2num]);
return 0;
}

【LIS】【递推】Gym - 101246H - ``North-East''的更多相关文章

  1. 【递推】【概率】Gym - 100814A - Arcade Game

    题意:给你一个不超过九位的不含重复数码的十进制数,每次会随机将它的数码打乱,变成一个新的数,如果它小于等于上一次的数,那么你输了:如果它大于上一次的数,那么可以继续.直到它变成能够表达的最大数为止就赢 ...

  2. 【递推】【DFS】【枚举】Gym - 101246C - Explode 'Em All

    网格里放了一些石块,一个炸弹能炸开其所在的行和列.问炸光石块至少要几个炸弹. 枚举不炸开的行数,则可以得出还要炸开几列. 为了不让复杂度爆炸,需要两个优化. 先是递推预处理出f(i)表示i的二进制位中 ...

  3. Gym - 101196G :That's One Hanoi-ed Teacher (递推)

    题意:给定当前汉诺塔的状态,问还有多少步走完,不合法输出“No”. 思路:显然可以一层一层试探下去的.我们设三个柱子为“起始”,“中转”,“终点”,当前状态的最大的盘子不可能在中转站处:如果在起始站, ...

  4. CF Gym 100187D Holidays (数学,递推)

    题意:给n个元素,从n中选两个非空集合A和B.问有多少中选法? 递推: dp[n]表示元素个数为n的方案数,对于新来的一个元素,要么加入集合,要么不加入集合自成一个集合.加入集合有三种选择,A,B,E ...

  5. codeforces Gym 100338H High Speed Trains (递推,高精度)

    递推就好了,用二项式定理算出所有连边的方案数,减去不合法的方案, 每次选出一个孤立点,那么对应方案数就是上次的答案. 枚举选几个孤立点和选哪些,选到n-1个点的时候相当于都不选,只减1. 要用到高精度 ...

  6. 最长上升子序列(动态规划递推,LIS)

    1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...

  7. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  8. 四角递推(CF Working out,动态规划递推)

    题目:假如有A,B两个人,在一个m*n的矩阵,然后A在(1,1),B在(m,1),A要走到(m,n),B要走到(1,n),两人走的过程中可以捡起格子上的数字,而且两人速度不一样,可以同时到一个点(哪怕 ...

  9. Codeforces Gym101205D:Fibonacci Words(KMP+递推)

    Gym 101205D 题意:f[0] = "0", f[1] = "1",接下来f[i] = f[i-1] + f[i-2],相当于字符串拼接.然后给出一个n ...

  10. Code Force 429B Working out【递推dp】

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

随机推荐

  1. fileinput 小计(显示历史上传图片)

    今天又需要,要求在选中某条记录后显示历史上传图片 上传控件是fileinput.js 想法:界面有上传图片的控件,重新加载控件,并加入历史上传图片地址 实现代码: var filepathArray ...

  2. IE浏览器Bug总结

    每每在网上搜索IE浏览器Bug时,总是骂声一片,特别是前端工程师,每天都要面对,IE浏览器特别是IE6,存在很多Bug,对Web标准的支持也拖后腿,但不可否认,IE浏览器是曾经的霸主,它的贡献也是巨大 ...

  3. arduino 用电位器调节LED闪烁频率

    int dianwei; int led = 13; void setup() {  // put your setup code here, to run once:  Serial.begin(9 ...

  4. Java线程(一)

    1. java什么叫线程安全?什么叫不安全? 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法 ...

  5. Python脚本 - 常用单位转换

    测试系统为:Centos 6.7 Python版本为: 3.6.4 脚本功能:常用单位的转换,这里用内存来模拟 import pstuil def bytes2human(n): symbols = ...

  6. Vue-$emit的用法

    1.父组件可以使用 props 把数据传给子组件.2.子组件可以使用 $emit 触发父组件的自定义事件. vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( ev ...

  7. 25个Linux相关的网站【转】

    转自:http://www.cnblogs.com/Lindaman/p/4552805.html 下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件, ...

  8. 一个无线通信类投稿的期刊list

    转载一个,但是有些期刊的影响因子不是很对,要投的时候还是再到期刊主页上面看一看吧~ 期刊缩写 期刊全名 近年影响因子 P IEEE Proceedings Of The IEEE 3.686 IEEE ...

  9. Laravel 5.2 一、安装与目录结构

    一.Laravel 安装 这里选择通过 Composer 的 create-project 命令来安装 Laravel 应用. composer create-project laravel/lara ...

  10. 3.FireDAC组件快照

    TFDManager 连接定义和Connect连接管理  TFDConnection 数据库连接组件,支持三种连接方式:1.持久定义(有一个唯一名称和一个配置文件,可以由FDManager管理) 例: ...