Uva 1471 用Set优化查询
来源:互联网 发布:谁封装windows系统好 编辑:程序博客网 时间:2024/06/07 02:58
题意: 一个长度为N的数组,可以从里面删除长度任意(可以为0)的连续子序列,使得之后的最长的连续上升子序列长度最大。
最初的想法是遍历两次数组,进行预处理。得出F,G。
F[i] G[i] 分别为一i为结尾和以i为开头的最长连续上升子序列。之后枚举i,j 得到在Num[i] < Num[j] 的情况下得到max( F[i] + G[j] ),即为答案。
复杂度为O(n ^ 2)
然而这题的数据量 要求使用O(nlogn)的复杂度,所以考虑如何优化。
然而预处理的已经不可能再进行优化。所以考虑在枚举的时候进行优化。
这可看到在枚举i的时候可以看到,对于某个i 有一个i’ 。i, i’< j 且Num[i’] < Num[i] 而且 F[i’] > F[i]。这样对于i来说不论如何 最优解绝对不会由i来组合,所以i可以抛弃。
在枚举j的时候,i 的集合是动态的,所以用STL的set完成这个插入删除和查询。
代码如下
#include <iostream>#include <algorithm>#include <set>#include <cstdio>using namespace std;const int maxn = 200005;typedef pair<int,int> pii;int Num[maxn],f[maxn],g[maxn];int n;void initial(){ scanf("%d",&n); for(int i = 1;i <= n;++i) scanf("%d",&Num[i]); f[1] = g[n] = 1; for(int i = 2;i <= n;++i){ if(Num[i] > Num[i - 1]) f[i] = f[i - 1] + 1; else f[i] = 1; } for(int i = n - 1;i > 0;--i){ if(Num[i] < Num[i + 1]) g[i] = g[i + 1] + 1; else g[i] = 1; }}bool slove(){ set< pii > T; int ans = 1; T.insert(make_pair(Num[1],f[1])); for(int i = 2;i <= n;++i){ pii cur = make_pair(Num[i],f[i]); set<pii>::iterator it = T.lower_bound( cur ); bool keep = true; if(it != T.begin() ){ pii pre = *(--it); int len = g[i] + pre.second; ans = max( ans , len ); if(pre.second >= cur.second) keep = false; } if(keep){ T.erase(cur); T.insert(cur); it = T.find(cur); it++; while(it != T.end() && it -> first > cur.first && it -> second <= cur.second ){ T.erase( it++ ); } } } printf("%d\n",ans);}int main(){ int T; scanf("%d",&T); while( T-- ){ initial(); slove(); } return 0;}
0 0
- Uva 1471 用Set优化查询
- UVa 1471 防线 set/LIS
- UVA 10391Compound Words 用set实现
- 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能
- 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能
- UVA 10534 - Wavio Sequence(自写set<node>优化o(n^2)dp)
- UVA - 1595 Symmetry set
- UVA 10815 set
- UVa 10815 set
- UVA 1595 Symmetry (set)
- UVA-136 Set
- UVA 1471 Defense Lines(set维护二元组单调队列)
- UVA 1471 Defense Lines 单调队列优化
- Hibernate Set查询过虑
- 查询优化
- 查询优化
- 查询优化
- 查询优化
- BitmapFactory
- SSH:Struts2框架(Tag标签的使用)
- VIM入门配置
- 字节流
- hive 永久udf函数
- Uva 1471 用Set优化查询
- C语言中关于float、double、long double精度及数值范围理解
- 图像处理中的卷积---1.卷积
- C#
- (java)Symmetric Tree
- javaweb项目ajax的跨域访问问题
- OkHttp完全解析(五)HTTPS
- 布局优化:<include/>和ViewStub
- 基于Source和正则表达式的Scala网页内容抓取