傳送門
文章目錄
題意:
思路:
對于第一問直接輸出最長不嚴格下降子序列即可,第二問是Dilworth定理,變形比較多,之前也寫過類似的,這里貼個證明。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
;
int a
[N
],q
[N
];
int ans1
,ans2
;int main()
{
while(scanf("%d",&a
[++n
])!=EOF);n
--;int len
=0;for(int i
=1;i
<=n
;i
++) {int l
=0,r
=len
;while(l
<r
) {int mid
=l
+r
+1>>1;if(q
[mid
]<a
[i
]) l
=mid
;else r
=mid
-1;}len
=max(len
,r
+1);q
[r
+1]=a
[i
];}ans2
=len
;len
=0; memset(q
,0,sizeof(q
));for(int i
=n
;i
>=1;i
--) {int l
=0,r
=len
;while(l
<r
) {int mid
=l
+r
+1>>1;if(q
[mid
]<a
[i
]) l
=mid
;else r
=mid
-1;}len
=max(len
,r
+1);q
[r
+1]=a
[i
];}ans1
=len
;cout
<<ans1
<<endl
;cout
<<ans2
<<endl
;return 0;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。