時間限制:1000 ms | 記憶體限制:65535 kb
難度:4
描述
給定一整型數列(0如:1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。
輸入
有多組測試資料(<=7)
每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡有n個整數,表示數列中的所有元素.每個整形數中間用空格間隔開(0
輸出
對於每組測試資料輸出整形數列的最長遞增子串行的長度,每個輸出佔一行。
樣例輸入
7樣例輸出1 9 10 5 11 2 13
22 -1
51解題:資料量大啊,o(n^2)方法不奏效啊!只有o(nlogn)演算法了
先附上tle**吧
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9view code#define ll long long
10using
namespace
std;
11int d[100010],dp[100010
];12
intmain()
19 ans = 1;20
for(i = 2; i <= n; i++)
24if(dp[i] > ans) ans =dp[i];25}
26 printf("
%d\n
",ans);27}
28return0;
29 }
好吧,上 ac **,o(nlogn)演算法,精妙之處在於折半查詢,速度很快的。噢最後那個top?top:1可以去掉的,秀逗了!損失4ms。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9view code#define ll long long
10using
namespace
std;
11int stk[100010
],top;
12void bsearch(int lt,int rt,int
val)
19 stk[lt] =val;20}
21int
main()
31 printf("
%d\n
",top?top:1
);32}33
return0;
34 }
NYOJ 214 單調遞增子串行 二
先開設乙個陣列dp 然後從第乙個數開始列舉,和dp 陣列中的最後乙個元素end 進行比較,如果大於end 直接把這個數接到end 的後面,並且把end 更新為列舉的這個數。如果不大於edn 在dp 陣列中找到第乙個大於這個數的位子 k,並用這個數 替換掉dp k 例如 x 5,dp 則列舉過x 之後...
NYOJ 214 單調遞增子串行 二
單調遞增子串行 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給定一整型數列 0如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入 有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡...
nyoj 214 單調遞增子串行 二
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給定一整型數列 0 如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入 有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡有n個整數,表示數...