把长度转成右端点,按右端点排升序,f[i]=max(f[j]&&r[j]<l[i]),因为r是有序的,所以可以直接二分出能转移的区间(1,w),然后用树状数组维护区间f的max,每次转移的时候直接从树状数组上查询前缀max即可,然后把更新出来的f[i]update进树状数组

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005;
int n,t[N],f[N],ans;
struct qwe
{
int l,r;
}a[N];
bool cmp(const qwe &a,const qwe &b)
{
return a.r<b.r;
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void update(int x,int v)
{
for(int i=x;i<=n;i+=(i&(-i)))
t[i]=max(t[i],v);
}
int ques(int x)
{
int r=0;
for(int i=x;i;i-=(i&(-i)))
r=max(r,t[i]);
return r;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i].l=read(),a[i].r=a[i].l+read()-1;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
int l=1,r=i-1,w=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid].r<a[i].l)
l=mid+1,w=mid;
else
r=mid-1;
}
f[i]=ques(w)+1;
update(i,f[i]);
ans=max(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. Couldn&#39;t open CUDA library cublas64_80.dll etc. tensorflow-gpu on windows
  2. java中的集合/容器的数据结构
  3. [ios基础]IOS应用程序的生命周期问题
  4. 编译预处理命令--define和ifdef的使用
  5. Hadoop上路-02_Hadoop FS Shell
  6. SQL Server 通配符 Wildcard character
  7. springboot +spring security4 +thymeleaf 后台管理系统
  8. 自己写的Dapper通用数据访问层
  9. CONTEST36 小Z的模拟赛(2)
  10. IntentService的使用
  11. JTable demo
  12. git基本使用(搭建Git服务器)
  13. ajax异步请求302分析
  14. python绘制等边三角形
  15. ListView展示不同布局需要注意的地方
  16. HTML(七)HTML 表单(form元素介绍,input元素的常用type类型,input元素的常用属性)
  17. BIO和NIO
  18. BeanFactory和ApplicationContext的比较
  19. Alpha冲刺——day6
  20. 【笔记】JS脚本为什么要放在body最后面以及async和defer的异同点

热门文章

  1. java字符串利用正则表达式分割
  2. xcap发包工具的简单使用2(发送报文)
  3. xtu summer individual 5 D - Subsequence
  4. 全文搜索(A-3)-推荐系统构建步骤
  5. Spring Boot Jpa 表名小写转大写
  6. 共享一个NOI用过的vimrc [rc][vimrc]
  7. 郁闷的出纳员(bzoj 1503)
  8. [NOIP2006] 提高组 洛谷P1063 能量项链
  9. tyvj1045 最大的算式
  10. 洛谷——P1454 圣诞夜的极光