72 分求 Hack 或错误指正
查看原帖
72 分求 Hack 或错误指正
752485
tbdsh楼主2023/9/19 21:42
#include<bits/stdc++.h>

using namespace std;
const int MAXN = 1e5 + 5, MAXM = 1e4 + 5;
int n, m, k, a[MAXN];
int cnt[MAXM], sta[MAXN];
bool vis[MAXN];
string Solve(){
  cin >> m >> n >> k;
  memset(cnt, 0, sizeof cnt);
  for (int i = 1; i <= n; i++){
    cin >> a[i];
    vis[i] = 1;
    cnt[a[i]]++;
  }
  int head = 1, least = k, skip = 0;
  for (int i = 1; i <= n; i++){
    while (!cnt[head]){
      head++, least++;
    }
    if (head <= a[i] && a[i] <= least){
      vis[i] = 0;
      cnt[a[i]]--;
    }else {
      sta[++skip] = i;
    }
  }
  int last = skip, start = min(last, max(1, skip - k + 1));
  for (int i = 1; i <= n; i++){
    //cout << vis[i] << " \n"[i == n];
  }
  //cout << head << ' ' << least << ' ' << last << ' ' << start << '\n';
  bool flag = 1;
  while (flag){
    bool f = 0;
    while (last > 2 && !vis[sta[last]]){
      last--;
    }
    for (int i = last; i >= start; i--){
      int x = sta[i];
      while (!cnt[head]){
        head++, least++;
      }
      if (head <= a[x] && a[x] <= least && vis[x]){
        vis[x] = 0;
        cnt[a[x]]--;
        f = 1;
        start--;
      }
    }
    flag &= f;
  }
  for (int i = 1; i <= n; i++){
    if (vis[i] && !(head <= a[i] && a[i] <= least)){
      return "NO";
    }
  }
  return "YES";
}
int main(){
  int t;
  cin >> t;
  while (t--){
    cout << Solve() << '\n';
  }
  return 0;
}
2023/9/19 21:42
加载中...