POJ3670 Eating Together 【动态规划】【LIS模板】

来源:互联网 发布:mac air怎么截屏 编辑:程序博客网 时间:2024/06/05 04:37

题目就是求一次最长不下降子序列和最长不上升子序列

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define debug(x) cerr<<#x<<"="<<x<<endl;const int maxn = 300010;int n, a[maxn], f[maxn], g[maxn],ans,len,ren;int seach (int l, int r, int x) {    int rec;    while(l <= r) {        int mid = l+r>>1;        if(f[mid] > x) {            rec = mid;            r = mid-1;        }        else            l = mid+1;    }    return rec;}int seach1 (int l, int r, int x) {    int rec;    while(l <= r) {        int mid = l+r>>1;        if(g[mid] < x) {            rec = mid;            r = mid-1;        }         else             l = mid+1;        }    return rec; }int main() {    cin >> n;    for(int i=1; i<=n; i++)         cin >> a[i];    for(int i=1; i<=n; i++) {        if(a[i] >= f[len])             f[++len] = a[i];        else {            int l = seach(1,len,a[i]);            f[l] = a[i];        }    }    g[0] = 0x7fffffff;    for(int i=1; i<=n; i++) {        if(a[i] <= g[ren]){            g[++ren] = a[i];        }        else {            int l = seach1(1,ren,a[i]);            g[l] = a[i];        }       }    printf("%d",n - max(ren,len));    return 0;}
原创粉丝点击