博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1109
阅读量:6211 次
发布时间:2019-06-21

本文共 1488 字,大约阅读时间需要 4 分钟。

我们设f[i]为保留第i个木块最多的符合未知数

显然f[i]=max(f[j])+1 满足i>j a[i]>a[j] i-j>=a[i]-a[j]

我们把最后一个式子变成a[i]-i<=a[j]-j

三元关系很不好弄对吧,但仔细观察可知,由最后两个式子一定可以推出i>j

那不就水了,排序树状数组即可

1 var f,a,b:array[0..100010] of longint; 2     c:array[0..1000010] of longint; 3     i,n,ans:longint; 4  5 function max(a,b:longint):longint; 6   begin 7     if a>b then exit(a) else exit(b); 8   end; 9 10 function lowbit(x:longint):longint;11   begin12     exit(x and (-x));13   end;14 15 procedure swap(var a,b:longint);16   var c:longint;17   begin18     c:=a;19     a:=b;20     b:=c;21   end;22 23 procedure add(x,w:longint);24   begin25     while x<=n do26     begin27       c[x]:=max(c[x],w);28       x:=x+lowbit(x);29     end;30   end;31 32 function ask(x:longint):longint;33   begin34     ask:=0;35     while x>0 do36     begin37       ask:=max(ask,c[x]);38       x:=x-lowbit(x);39     end;40   end;41 42 procedure sort(l,r:longint);43   var y,i,j,x:longint;44   begin45     i:=l;46     j:=r;47     x:=a[(l+r) shr 1];48     y:=b[(l+r) shr 1];49     repeat50       while (b[i]>y) or (b[i]=y) and (a[i]
b[j]) or (b[j]=y) and (x
j) then53 begin54 swap(a[i],a[j]);55 swap(b[i],b[j]);56 inc(i);57 dec(j);58 end;59 until i>j;60 if l
0 then continue;75 f[i]:=ask(a[i]-1)+1;76 ans:=max(f[i],ans);77 add(a[i],f[i]);78 end;79 writeln(ans);80 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4533378.html

你可能感兴趣的文章
使用FIDDER 抓包构建请求
查看>>
Linux误删文件挽救
查看>>
MongoDB整理笔记の体系架构
查看>>
HTML5 Web 客户端五种离线存储方式汇总
查看>>
石子博弈
查看>>
select Option(增加,删除,清空)
查看>>
centos7 mysql数据库的安装与使用
查看>>
四: 使用vue搭建网站前端页面
查看>>
四:DRF项目开发的准备
查看>>
Linux 进程管理
查看>>
【和孩子一起学编程】 python笔记--第五天
查看>>
java处理高并发高负载类网站的优化方法
查看>>
SpringMVC调用过程
查看>>
memcached(十一)magent实现高可用
查看>>
关于一个类中方法调用情况
查看>>
使用Allure+testNG自动生成漂亮强大的测试用例报告
查看>>
C/C++求余运算符
查看>>
github地址
查看>>
[改善Java代码]警惕自增的陷阱
查看>>
[改善Java代码]不要随便设置随机种子
查看>>