Uva 1471 用Set优化查询
2015-11-25 16:54
309 查看
题意: 一个长度为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完成这个插入删除和查询。
代码如下
最初的想法是遍历两次数组,进行预处理。得出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 = 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; }
相关文章推荐
- 字节流
- hive 永久udf函数
- (java)Symmetric Tree
- 【人月神话】第三章:外科手术队伍
- 图像处理中的卷积---1.卷积
- javaweb项目ajax的跨域访问问题
- 【Android】.9图的一个BUG?
- 判断一个字符串是否为另外一个字符串旋转之后的字符串。
- VIM入门配置
- SSH:Struts2框架(Tag标签的使用)
- OkHttp完全解析(四)连接Connections
- wget的下载JDK问题
- Ant如何打包UIAutomator项目用到的第三方JAR包
- android自定义权限
- Android Studio创建Android Library发布至本地仓库
- BitmapFactory
- 支付宝支付成功后验证失败
- Android开发sdk的相关问题
- js中的DOM操作汇总
- ASP.NET Razor - html中使用if else