CodeforcesD Bubble Sort Graph

题意:对一个序列冒泡排序,交换(a[i], a[j])的时候对i, j建一条边,问最小的独立点集是什么

题解:直接建边n*n, 可以发现,独立集的每一个点都是没有边和其他点相连的,而只要a[i]>a[j]就代表i,  j有关系,那么a[i]<a[j]就代表i, j没有关系,也就是找到最多的点没有关系 == 最长上升子序列.....

#include <bits/stdc++.h>
#define ll long long
#define maxn 100100
#define INF 0x7f7f7f7f
using namespace std;
int a[maxn], dp[maxn], n, t, ans;
int main(){
    scanf("%d", &n);
    for(int i=0;i<n;i++) scanf("%d", &a[i]);
    memset(dp, INF, sizeof(dp));
    for(int i=0;i<n;i++){
        t = lower_bound(dp+1, dp+n+1, a[i])-dp;
        ans = max(ans, t);
        dp[t] = a[i];
    }
    printf("%d\n", ans);
    return 0;
}

 

posted on 2018-02-04 10:50  2855669158  阅读(214)  评论(1编辑  收藏  举报

导航