已有的hack加样例全过,提交全WA,求hack玄关
查看原帖
已有的hack加样例全过,提交全WA,求hack玄关
824941
bsjsaikou10楼主2024/8/20 22:28
#include<iostream>
#include<vector>
#include<cstdio>
#include<queue>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN = 1e6 + 4;
int n;
int p[MAXN],maxx[MAXN],minn[MAXN];
vector<int> ls,rs;
void solve(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> p[i];
    }
    if(n == 2){
        cout << 1 << endl;
        return;
    }
    if(n == 3){
        cout << 2 << endl;
        return;
    }
    ls.clear();
    rs.clear();
    for(int i = 0; i <= n; i++){
        maxx[i] = -1e9;
        minn[i] = 1e9;
    }
    int flag = 1;
    for(int i = 1; i <= n; i++){
        if(p[i] != i){
            flag = 0;
        }
        maxx[i] = max(maxx[i - 1],p[i]);
        minn[i] = min(minn[i - 1],p[i]);
    }
    if(flag){
        cout << n - 1 << endl;
        return;
    }
    int res = 0;
    if(p[1] == 1 || p[1] == n){
        res++;
    }
    if(p[n] == 1 || p[n] == n){
        res++;
    }
    if(p[1] == 1 && p[2] == n){
        res++;
    }
    if(p[1] == n && p[2] == 1){
        res++;
    }
    if(p[n - 1] == 1 && p[n] == n){
        res++;
    }
    if(p[n - 1] == n && p[n] == 1){
        res++;
    }
    for(int i = 2; i < n - 1; i++){
        if(maxx[i] - minn[i] + 1 == i && minn[i] == 1){
            res++;
        }
    }
    int p1 = n / 2;
    int p2 = p1 + 1;
    for(int i = 1; i <= p1; i++){
        ls.push_back(p[i]);
    }
    for(int i = p2; i <= n; i++){
        rs.push_back(p[i]);
    }
    int flag1 = 1,flag2 = 1;
    sort(ls.begin(),ls.end());
    sort(rs.begin(),rs.end());
    for(int i = 0; i < ls.size() - 1; i++){
        if(ls[i] + 2 != ls[i + 1]){
            flag1 = 0;
            break;
        }
    }
    for(int i = 0; i < rs.size() - 1; i++){
        if(rs[i] + 2 != rs[i + 1]){
            flag2 = 0;
            break;
        }
    }
    if(flag1 && flag2){
        res++;
    }
    ls.clear();
    rs.clear();
    if(n & 1){
        p1 = n / 2 + 1;
        for(int i = 1; i <= p1; i++){
            ls.push_back(p[i]);
        }
        for(int i = p1 + 1; i <= n; i++){
            rs.push_back(p[i]);
        }
        flag1 = 1,flag2 = 1;
        sort(ls.begin(),ls.end());
        sort(rs.begin(),rs.end());
        for(int i = 0; i < ls.size() - 1; i++){
            if(ls[i] + 2 != ls[i + 1]){
                flag1 = 0;
                break;
            }
        }
        for(int i = 0; i < rs.size() - 1; i++){
            if(rs[i] + 2 != rs[i + 1]){
                flag2 = 0;
                break;
            }
        }
        if(flag1 && flag2){
            res++;
        }
    }
    cout << res << endl;
    return;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while(T--){
        solve();
    }
}

2024/8/20 22:28
加载中...