UVA - 1471 Defense Lines 贪心+二分
2015-04-15 09:35
369 查看
题目大意:给出长度为n的序列,要求你删除掉一段的连续子序列,使得剩下的序列的递增子序列最长
解题思路:记录以下每个位置的值所能延伸的最左端和最右端,用一个数组记录长度为i的数的最小值,然后从左往右扫描,用二分搜索在数组中找到小于当前值的数的位置,用当前数的right + len - 1就是结果了,再维护一下最大值
解题思路:记录以下每个位置的值所能延伸的最左端和最右端,用一个数组记录长度为i的数的最小值,然后从左往右扫描,用二分搜索在数组中找到小于当前值的数的位置,用当前数的right + len - 1就是结果了,再维护一下最大值
[code]#include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define maxn 200010 int num[maxn], l[maxn], r[maxn], Min[maxn]; int main() { int test, n; scanf("%d", &test); while(test--) { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &num[i]); l[1] = 1; for(int i = 2; i <= n; i++) l[i] = num[i] > num[i - 1] ? l[i - 1] + 1: 1; r = 1; for(int i = n - 1; i >= 1; i--) r[i] = num[i] < num[i + 1] ? r[i + 1] + 1: 1; int ans = 0; memset(Min,0x3f,sizeof(Min)); for(int i = 1; i <= n; i++) { int len = lower_bound(Min+1,Min+1+n,num[i]) - Min; ans = max(ans,r[i] + len - 1); Min[l[i]] = min(Min[l[i]],num[i]); } printf("%d\n",ans); } return 0; }
相关文章推荐
- UVA 1471 - Defense Lines(扫描+二分)
- UVa 1471 Defense Lines (二分+set优化)
- UVA 1471 Defense Lines (STL + 二分)
- UVa1471 Defense Lines (贪心+思维+初学lower_bound())
- UVA - 714 Copying Books(二分+贪心)
- UVA 1422 - Processor (二分+贪心+优先队列)
- UVALive 3177-贪心+二分
- UVa 714 Copying Books 二分 + 贪心 (最大值最小化问题)
- UVa1471 - Defense Lines
- UVa 1149 Bin Packing (二分 + 贪心)
- POJ-1505&&UVA-714 抄书(贪心+二分)
- 二分+贪心-uva-1335 - Beijing Guards
- UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)
- uva 714 - Copying Books(贪心 最大值最小化 二分)
- UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)
- POJ3497 UVA12124 Assemble(二分 + 贪心)
- UVaLive 3971 Assemble (水题二分+贪心)
- uva 1450 - Airport(贪心+二分)
- UVA - 1471 Defense Lines
- UVALive 3971 Assemble 电脑配件 二分+贪心