32pts 方案错误求hack
查看原帖
32pts 方案错误求hack
576157
vdfes楼主2025/7/28 23:04

根据 WA 的提示,全是方案错误

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double llb;
#define F(i, a, b) for (int i = (a); i <= (b); i++)
#define DF(i, a, b) for (int i = (a); i >= (b); i--)
#define FE(i, a, b, c) for (int i = (a); i <= (b); i += (c))
#define DFE(i, a, b, c) for (int i = (a); i >= (b); i -= (c))
#define ED(i, u) for (int i = hea[u]; i; i = nex[i])
#define pii pair<int, int>
#define fi first
#define se second
#define All(x) x.begin(), x.end()
#define ALL(x, l, r) x + (l), x + 1 + (r)
#define MST(x, y) memset(x, y, sizeof(x))
#define lowbit(x) (x & -x)
#define PI acos(-1)
template <class... T> void re(T &...a) { (cin >> ... >> a); }
template <class T, class... Ts> void pr(const T &a, const Ts &...b) {
  cout << a;
  (cout << ... << (cout << ' ', b));
  cout << '\n';
}
template <class T, class... Ts> void prs(const T &a, const Ts &...b) {
  cout << a;
  (cout << ... << (cout << ' ', b));
  cout << ' ';
}
template <class T, class... Ts> void prn(const T &a, const Ts &...b) {
  cout << a;
  (cout << ... << (cout << ' ', b));
}
void pr() { cout << '\n'; }
#define N 1005
#define P 1000000007
#define Say(x) pr(x ? "Yes" : "No")
int n, mx;
int a[N], b[N], c[N];
int dp[N][N];
int pre[N][N];
int ori[N];
struct node {
  int l, r, x;
};
vector<node> pre2[N][2];
int nex[N];
vector<int> res[N];
void solve() {
  re(n);
  F(i, 1, n) re(a[i]);
  if (n & 1) {
    pr(-1);
    return;
  }
  sort(ALL(a, 1, n));
  F(i, 1, n) b[i] = a[i];
  int m = unique(ALL(b, 1, n)) - b - 1;
  int r = 0;
  F(i, 1, m) c[i] = 0;
  F(i, 1, m) {
    while (r + 1 <= n && a[r + 1] == b[i])
      c[i]++, r++;
    ori[i] = b[i];
  }
  mx = 0;
  F(i, 1, m) mx = max(mx, c[i]);
  if (mx > (n >> 1)) {
    pr(-1);
    return;
  }
  F(i, 0, m) F(j, 0, n >> 1) pre[i][j] = 0;
  auto check = [&](int k) -> bool {
    F(i, 0, m) F(j, 0, k) dp[i][j] = 0;
    F(i, 0, m) F(q, 0, 1) pre2[i][q].clear();
    dp[0][0] = 1;
    F(i, 0, m - 1) {
      F(j, 0, k) {
        if (dp[i][j]) {
          int lmi = max({0, j + c[i + 1] - k, (j + c[i + 1] - k) / 2}), lmx = min(c[i + 1], j);
          int t1 = j + c[i + 1] - lmx * 2, t2 = j + c[i + 1] - lmi * 2;
          dp[i + 1][t1]++, dp[i + 1][t2 + 2]--;
          pre2[i + 1][t1 & 1].push_back({t1, t2, j});
        }
      }
      FE(j, 2, k, 2) dp[i + 1][j] += dp[i + 1][j - 2];
      FE(j, 3, k, 2) dp[i + 1][j] += dp[i + 1][j - 2];
      F(j, 0, k) dp[i + 1][j] = (dp[i + 1][j] > 0);
    }
    if (dp[m][0]) {
      F(i, 1, m) {
        F(j, 0, k) pre[i][j] = 0;
        F(q, 0, 1) {
          if (!pre2[i][q].size())
            continue;
          sort(All(pre2[i][q]), [&](node a, node b) {
            if (a.l != b.l)
              return a.l < b.l;
            return a.r < b.r;
          });
          int now = pre2[i][q][0].l, pos = 0;
          while (now <= k) {
            while (now < pre2[i][q][pos].l)
              now += 2;
            if (now > k)
              break;
            while (pos + 1 < pre2[i][q].size() && now == pre2[i][q][pos + 1].l)
              pos++;
            while (pos < pre2[i][q].size() && now > pre2[i][q][pos].r)
              pos++;
            if (pos >= pre2[i][q].size())
              break;
            pre[i][now] = pre2[i][q][pos].x;
            now += 2;
          }
        }
      }
      return 1;
    }
    return 0;
  };
  int L = mx, R = (n >> 1), mid, ans = -1;
  while (L <= R) {
    mid = L + R >> 1;
    if (check(mid))
      ans = mid, R = mid - 1;
    else
      L = mid + 1;
  }
  pr(ans);
  if (ans == -1)
    return;
  // F(i, 1, m) {
  //   F(j, 0, ans) prs(pre[i][j]);
  //   pr();
  // }
  int tmp = m;
  nex[tmp] = 0;
  int now = pre[tmp][0];
  while (tmp >= 1) {
    nex[tmp - 1] = now;
    now = pre[--tmp][now];
  }
  F(i, 1, ans) res[i].clear();
  F(i, 1, m) {
    int l = (c[i] + nex[i - 1] - nex[i]) / 2;
    int s1 = l, s2 = c[i] - l;
    F(j, 1, ans) {
      if (res[j].size() & 1) {
        if (s1)
          s1--, res[j].push_back(i);
      } else {
        if (s2)
          s2--, res[j].push_back(i);
      }
    }
  }
  F(i, 1, ans) {
    prs(res[i].size());
    for (auto j : res[i])
      prs(ori[j]);
    pr();
  }
}
int main() {
#ifndef ONLINE_JUDGE
  freopen("admin.in", "r", stdin);
  // freopen("admin.out", "w", stdout);
#endif
  ios::sync_with_stdio(false), cin.tie(nullptr);
  // cout << fixed << setprecision(20);
  int T;
  re(T);
  while (T--)
    solve();
  return 0;
}
2025/7/28 23:04
加载中...