二路單調自增子序列模型 acdream 1216

2021-09-06 19:34:28 字數 1250 閱讀 7947

題目:acdream 1216 beautiful people

題意:每乙個人有兩個值,能力值和潛力值,然後要求乙個人的這兩個值都嚴格大於第二個人的時候,這兩個人才幹呆在一塊兒,給出很多人的值,求最多有多少個人?

分析:非常easy想到是個單調非增模型,假設用o(n*n)的寫法的話,會超時!

那麼我們就要用二分優化來找。

我們能夠先按第乙個值 x 從小到大排序,然後按第二個值從大到小排序,這種話找出的最長個數是沒有錯的。(想想為什麼)

假如這樣乙個例子:

1 10

2 12

3 53 1

4 36 7

首先dp陣列僅僅有第一,二組例子:1 10 和2 12

然後第三個例子替換第一組:3 5 和 2 12  ,看看這組例子,發現不滿足,可是他總的長度不會變,可是這樣儲存的話能保證後面出來的數可以最長。所以要想辦法儲存路徑

然後第四組例子替換第三組:3 1 和 2 12 

然後第5組例子替換第二組: 3 1  和 4 3 是不是滿足條件了,並且最大值值變的更小了,

然後第六組例子加在後面:3 1 和 4 3 和 6 7 ,最大值

最後全部值的二分搜尋的值為:1 2 1 1 2 3 

那麼發現儲存路徑也簡單了。

然後從這個值裡面輸出乙個遞減的初始陣列標號就能夠了、

ac**:

#include #include #include #include #include using namespace std;

const int inf = 0x3f3f3f3f;

const int n = 110000;

struct node

;node a[n];

int cmp(node a,node b)

int dp[n],mark[n];

int bin_search(int l,int r,int x)

return l;

}int main()

sort(a+1,a+n+1,cmp);

memset(dp,0x3f3f3f3f,sizeof(dp));

int ans=0;

int len = 1;

for(int i=1;i<=n;i++)

printf("%d\n",ans);

for(int i=n;i>=1;i--)

}printf("\n");

}return 0;

}

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個整數,表示數...