九度 1557:和谐答案 (LIS 变形)

题目描述:

在初试即将开始的最后一段日子里,laxtc重点练习了英语阅读的第二部分,他发现了一个有意思的情况。
这部分的试题最终的答案总是如下形式的:
1.A;2.C;3.D;4.E;5.F。即共有六个空格,每个空格填入一个相应的字母代表这个空格他所选择的答案,且空格中的字母不存在重复。若每个空格选择的答案都是严格递增的,则laxtc认为这个答案是和谐的,如1.A;2.C;3.D;4.E;5.F;反之,若答案中存在不递增的情况,则他认为这组答案是不和谐的,如1.A;2.C;3.B;4.E;5.F;laxtc总是希望他所选择的答案是和谐的。由于laxtc的英语并不怎么好,所以他也经常会空着一些空格,如1.A2.;3.B;4.E;5.F;此时,只要排除掉空格后的剩余部分依然是递增的,那么laxtc也认为它是和谐的。
已知共有n个空格,laxtc已经为每一个空格选择好了Ci个候选对象。laxtc想知道他最多能填写几个空格,同时保持最终答案是和谐的。

 

输入:

输入包含多组测试数据。每组测试数据由一个整数n(1 <= n <= 100000)开头,表示共有n个位置。
接下来共有n行数字,第i行表示laxtc为第i个空格选择的候选答案(可能会有重复的答案)。由两部分组成。第一部分为一个整数t(1 <= t <= 5),表示该空格共有t个候选答案。第二部分为t个整数,代表laxtc为该空格选择的候选答案序号(由于题数过多,这里用数字代替字母,数字在int范围内)。

 

输出:

输出为一个整数,代表laxtc得到的最大和谐答案组的长度,长度即填写的空格数。

 

样例输入:
5
5 1 2 3 4 5
5 1 2 3 4 5
5 1 2 3 4 5
5 1 2 3 4 5
5 1 2 3 4 5
5
4 1 2 3 4
4 2 3 4 5
2 2 3
2 4 5
1 1
样例输出:
5
4

思路

1. 做了20分钟 把o(n*n)的DP优化到 o(n*logn) 才发现这不就是道 LIS 变形题么, 不过仍然是 WA 到死

 

代码 未通过九度测试, WA 到没脾气

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;

int matrix[10010][10];
int candi[10010];

int dp[10010];

int binary_search(int len, int x) {
    int low = 0, high = len-1;
    
    while(low <= high) {
        int mid = (low+high)>>1;
        if(dp[mid] == x) {
            return mid;
        }else if(dp[mid] > x) {
            high = mid - 1;
        }else{
            low = mid + 1;
        }
    }
    return low;
}
int main() {
    freopen("testcase.txt", "r", stdin);
    int n;
    while(scanf("%d", &n) != EOF) {
        for(int i = 0; i < n; i ++) {
            scanf("%d", candi+i);
            for(int j = 0; j < candi[i]; j ++) {
                scanf("%d", &matrix[i][j]);
            }
        }

        // init
        
        dp[0] = matrix[0][0];
        for(int i = 1; i < candi[0]; i ++) {
            dp[0] = min(dp[0], matrix[0][i]);
        }

        int len = 1;

        for(int i = 1; i < n; i ++) {
            bool added = false;
            int lastNum = dp[len-1];
            for(int j = 0; j < candi[i]; j ++) {

                if(!added) { // not added yet
                    if(matrix[i][j] > lastNum) {
                        dp[len++] = matrix[i][j];
                        lastNum = matrix[i][j];
                        added = 1;
                    }else{
                        int pos = binary_search(len, matrix[i][j]);
                        dp[pos] = matrix[i][j];
                    }
                }else {
                    if(matrix[i][j] >= lastNum) {
                        // do nothing
                    }else{
                        int pos = binary_search(len, matrix[i][j]);
                        dp[pos] = matrix[i][j];
                    }
                }
            }
        }
        printf("%d\n", len);
    }
    return 0;
}

 

你可能感兴趣的:(li)