wa一个点,求教
查看原帖
wa一个点,求教
916822
Meng17楼主2024/7/7 17:52
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define fi first
#define se second
#define endl '\n'
#define lc (u << 1)
#define rc (u << 1 | 1)
#define pb push_back
#define eb emplace_back
#define ep emplace
using LL = long long;
using ull = unsigned long long;
using pii = pair<int, int>;

/******************************************************************/
#define debug(x...)                  \
    do {                           \
        std::cout << #x << " -> "; \
        err(x);                    \
    } while (0)
 
void err() {
    std::cout << '\n';
}
 
template <class T, class... Ts>
void err(T arg, Ts ...args) {
    std::cout << arg << ' ';
    err(args...);
}

/*
exit(0);  
assert(expression);  // 断言
cout << flush;  // 刷新缓冲流
string line;
getline(cin, line);
stringstram sline(line);  // string流
cout << unitbuf;  //所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf;  //回到正常的缓冲方式
*/
/******************************************************************/

const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const long long One = 1LL;

int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

struct node{
	int x, y, z;
	bool operator < (const node& a) const{
		return x < a.x;
	}
};

string s;
int n, m, k;

void solve(){
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i ++)
        cin >> a[i];
    
    // 1 ~ n
    vector<int> f1(n, INT_MAX);
    vector<int> ff(n);
    for (int i = 0; i < n; i++){
        int mid = lower_bound(f1.begin(), f1.end(), a[i]) - f1.begin();
        f1[mid] = a[i];
        ff[i] = mid;  // 记录每个数应该在的位置
        // debug(ff[i]);
    }
    int l1 = lower_bound(f1.begin(), f1.end(), INT_MAX) - f1.begin();
    int len = l1;
    // debug(len);
    vector<int> v(len), vv(len);
    for (int i = n - 1; ~i; i --){
        if (!len)
            break;
        if (ff[i] == len - 1){
            v[len - 1] = a[i];
            vv[len - 1] = i;
            len --;
            
        }
        else{
            ff[i] = -1;
        }
    }
    // for (int i = 0; i < l1; i  ++)
    //     cout << v[i] << " \n"[i + 1 == l1];

    // 2 ~ n
    vector<int> f2(n, INT_MAX);
    for (int i = 1; i < n; i++){
        int mid = lower_bound(f2.begin(), f2.end(), a[i]) - f2.begin();
        f2[mid] = a[i];
    }
    int l2 = lower_bound(f2.begin(), f2.end(), INT_MAX) - f2.begin();


    // 1 ~ n - 1
    vector<int> f3(n, INT_MAX);
    for (int i = 0; i < n - 1; i++){
        int mid = lower_bound(f3.begin(), f3.end(), a[i]) - f3.begin();
        f3[mid] = a[i];
    }
    int l3 = lower_bound(f3.begin(), f3.end(), INT_MAX) - f3.begin();

    // debug(l1, l2, l3);
    if (l1 > l2 && l1 > l3){
        for (int i = l1 - 1, j = n - 1; ~i && ~j; j --){
            if (ff[j] == -1){
                if (v[i] + 1 < v[i + 1]){
                    cout << l1 + 1 << endl;
                    return;
                }
            }
            else{
                i --;
            }
        }
        for (int i = 0; i < l1 - 1; i ++){
            if (v[i] + 1 != v[i + 1] && vv[i] + 1 != vv[i + 1]){
                debug(v[i], vv[i]);
                cout << l1 + 1 << endl;
                return;
            }
        }

        for (int i = l1 - 1; i ; i --){
            if (v[i] - 1 != v[i - 1] && vv[i] - 1 != vv[i - 1]){
                cout << l1 + 1 << endl;
                return;
            }
        }

        cout << l1 << endl;
    }
    else{
        cout << l1 + 1 << endl;
    }

}

signed main(void){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout << fixed << setprecision(20);
	int t = 1;
	// cin >> t;
	while (t --){
		solve();
	}
	
	return 0;
}
/*
input:

output:

*/

2024/7/7 17:52
加载中...