86分求助
查看原帖
86分求助
176843
LiveZoom楼主2021/11/6 22:40

WA On #6

答案是21,我的输出是20,找不出错

代码:

/*
I hope JLQ can bless me to AC the problem.
*/
#include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 5;

int n, k, cnt, jlq, ans;
int p[N], c[N], b[N], idx[N], f[N];

class BIT {
  public:
    void upd (int x, int v) {
      for (; x <= n; x += x & -x)
        c[x] = max(c[x], v);
    }
    void clr (int x) {
      for (; x <= n; x += x & -x)
        c[x] = 0;
    }
    int qry (int x) {
      int ret = 0;
      for (; x; x -= x & -x)
        ret = max(ret, c[x]);
      return ret;
    }
  private:
    int c[N];
} t ;

void clear (int l, int r) {
  for (int i = l; i <= r; ++i) {
    t.clr(c[idx[i]]);
    f[i] = 0;
  }
}

int solve (int l, int r) {
  int ret = 0;
  for (int i = l; i <= r; ++i) {
    int temp = t.qry(c[idx[i]] - 1);
    f[i] = temp + 1, t.upd(c[idx[i]], f[i]);
    ret = max(ret, f[i]);
  }
  clear(l, r);
  return ret;
}

int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= k; ++i)
    scanf("%d", &p[i]);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &c[i]);
    b[i] = c[i];
  }
  sort(p + 1, p + 1 + k);
  sort(b + 1, b + 1 + n);
  jlq = unique(b + 1, b + 1 + n) - (b + 1);
  for (int i = 1; i <= n; ++i)
    c[i] = lower_bound(b + 1, b + 1 + jlq, c[i]) - b;
  p[0] = 0, p[k + 1] = n + 1;
  c[0] = 0, c[n + 1] = n + 1;
  for (int i = 1; i < k; ++i)
    if (c[p[i]] >= c[p[i + 1]]) {
      puts("impossible");
      return 0;
    }
  ans = k;
  for (int i = 0; i <= k; ++i) {
    cnt = 0;
    for (int j = p[i] + 1; j < p[i + 1]; ++j)
      if (c[j] > c[p[i]] && c[j] < c[p[i + 1]])
        idx[++cnt] = c[j];
    ans += solve(1, cnt);
  }
  printf("%d\n", ans);
  return 0;
}
2021/11/6 22:40
加载中...