UVALive 4976 Defense Lines ——(LIS变形)

  题意:给出序列,能够从这序列中删去连续的一段,问剩下的序列中的最长的严格上升子串的长度是多少。

  这题颇有点LIS的味道。因为具体做法就是维护一个单调的集合,然后xjbg一下即可。具体的见代码吧:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 using namespace std;
 5 const int N = 2e5 + 5;
 6
 7 int T,n,top,back;
 8 int a[N];
 9 int R[N];
10 int s[N];
11
12 int find(int val)
13 {
14     int l = 0, r = top;
15     int ans = -1;
16     while(l <= r)
17     {
18         int mid = l + r >> 1;
19         if(s[mid] < val) ans = mid, l = mid + 1;
20         else r = mid - 1;
21     }
22     return ans;
23 }
24
25 void solve()
26 {
27     back = 1, top = 1;
28     s[top] = a[1];
29     int ans = 1;
30     for(int i=2;i<=n;i++)
31     {
32         ans = max(ans, find(a[i]) + R[i]);
33         if(a[i] > a[i-1]) back++;
34         else back = 1;
35         if(back > top) s[++top] = a[i];
36         else s[back] = min(s[back], a[i]);
37     }
38     printf("%d\n",ans);
39 }
40
41 int main()
42 {
43     scanf("%d",&T);
44     while(T--)
45     {
46         scanf("%d",&n);
47         for(int i=1;i<=n;i++) scanf("%d",a+i);
48         R[n] = 1;
49         for(int i=n-1;i>=1;i--) R[i] = a[i] < a[i+1] ? R[i+1] + 1 : 1;
50         solve();
51     }
52     return 0;
53 }
时间: 2024-10-27 17:01:29

UVALive 4976 Defense Lines ——(LIS变形)的相关文章

La 4976 Defense lines

蓝书紫书上都有的一道题...这里就懒得说题解了. 但是我竟然WA了6次!为什么呢??? 一开始没看见连续子序列..... 后来插入的时候忘判断了是不是比前驱大.... 所以我们只需要维护一个权值递增(这个set已经帮你维护好了)并且长度递增(这个需要插入的时候判断)的set就好了.. #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<set>

HDU1160_FatMouse&#39;s Speed【LIS变形】

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9624    Accepted Submission(s): 4284 Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster

hdu 1087(LIS变形)

Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31458    Accepted Submission(s): 14128 Problem Description Nowadays, a kind of chess game called “Super Jumping!

【二分】Defense Lines

[UVa1471] Defense Lines 算法入门经典第8章8-8 (P242) 题目大意:将一个序列删去一个连续子序列,问最长的严格上升子序列 (N<=200000) 试题分析:算法1:直接暴力,对于一个删除序列,枚举头和尾,然后看最长上升子序列.时间复杂度:O(N^3) 算法2:L[i]表示以i为结尾的最长严格上升子序列长度,R[i]表示以i为开头的最长严格上升子序列长度. 预处理:O(N)  然后依旧是枚举头和尾,那么答案就是L[i]+R[j]了.时间复杂度:O(N^2) 算法3:第

UVA - 1471 Defense Lines 树状数组/二分

                              Defense Lines After the last war devastated your country, you - as the king of the land of Ardenia - decided it washigh time to improve the defense of your capital city. A part of your forti?cation is a line of magetower

UVA 1471 - Defense Lines(扫描+二分)

UVA 1471 - Defense Lines 题目链接 题意:给定一个序列,要求删去一个连续子序列后,得到的序列有一个最长的连续递增序列,输出最长连续递增序列长度 思路:先左右扫描一遍,把每个位置往左和往右的最大长度记录下来,然后在从左往右扫描一遍,开一个数组Min用来记录长度i的序列,最后一位的最小值,这个序列是满足单调性的,因为递增序列肯定是1,2,3,4...这样不断往上加的,如果遇到一个a[i]比较小的,就维护Min相应长度下的值,这样在这个单调递增的序列中,每次就可以二分找出最后一

NBUT 1116 Flandre&#39;s Passageway (LIS变形)

题意:给一个有n*m格子的矩形,设每格边长100,要从(1,1)走到(n,m)需要耗(n+m)*100,但是其中有一些格子是可以直接穿过的,也就是走对角线,是100*根号2长,给出k个可以穿过的格子,要求最短路径是多少? 思路:研究一下知道当选择了某个可穿过的格子(x,y),那么对于任意格子(>x,y)和(x,>y)都是不能再选的,因为这样会更长,也就是说同一行最多只能选一个格子穿过.一开始想到的是在一个拓扑序列中求最小路径的权之和,这个模型倒是没错,但是怎么建立一个这样的图就麻烦了.再想到用

挖地雷(LIS变形)

挖地雷(LIS变形)  AC_Code: 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <cstdlib> 6 #include <string> 7 #include <vector> 8 #include <queue> 9 #include <vector>

登山(LIS变形)

登山(LIS变形) 注意读题:不连续两个相同海拔,所以要么严格递增,要么严格递减 AC_Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <cmath> 6 #include <cstdlib> 7 #include <queue> 8 #include <vector&