[AGC041D] Problem Scores

StO Kubic 神

发现主要限制在第三个限制,考虑变形一下限制要求,问题转化为要求序列的 \(k = \lfloor \dfrac{n}{2} \rfloor\),的前 \(k + 1\) 项的和,大于后 \(k\) 项的和。

动态设前 \(k + 1\) 个的和与后 \(k\) 个和的差为 \(\triangle\),初始为 \(n\)

每次都对一个前缀整体 \(-1\),然后算出对每个前缀操作的时候,对 \(\triangle\) 的影响。

问题就转化为了背包,总容量为 \(n\)\(n\) 个物品,每个物品有 \(w_i\) 的重量,要求放物品使得总重量不超过 \(n- 1\) 的方案数。

直接背包就好了。

// 德丽莎你好可爱德丽莎你好可爱德丽莎你好可爱德丽莎你好可爱德丽莎你好可爱
// 德丽莎的可爱在于德丽莎很可爱,德丽莎为什么很可爱呢,这是因为德丽莎很可爱!
// 没有力量的理想是戏言,没有理想的力量是空虚
#include <bits/stdc++.h>
#define LL long long
using namespace std;
char ibuf[1 << 15], *p1, *p2;
#define getchar() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, 1 << 15, stdin), p1==p2) ? EOF : *p1++)
inline int read() {
  char ch = getchar();  int x = 0, f = 1;
  while (ch < '0' || ch > '9')  {  if (ch == '-')  f = -1;  ch = getchar();  }
  while (ch >= '0' && ch <= '9')  x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
  return x * f;
}
void print(LL x) {
  if (x > 9)  print(x / 10);
  putchar(x % 10 + '0');
}
template<class T> bool chkmin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool chkmax(T &a, T b) { return a < b ? (a = b, true) : false; }
#define rep(i, l, r) for (int i = (l); i <= (r); i++)
#define repd(i, l, r) for (int i = (l); i >= (r); i--)
#define REP(i, l, r)  for (int i = (l); i < (r); i++)
const int N = 5005;
int n, mod, dp[N], w[N];
void solve() {
  cin >> n >> mod;
  rep (i, 1, (n + 1) / 2)  w[i] = i;
  rep (i, 1, (n / 2))  w[n - i + 1] = i;
  dp[n] = 1;
  rep (i, 1, n) {
    repd (j, n, w[i]) {
      dp[j - w[i]] = (dp[j] + dp[j - w[i]]) % mod;
    }
  }
  int ans = 0;
  rep (i, 1, n)  ans += dp[i] , ans %= mod;
  cout << ans;
}
signed main () {
#ifdef LOCAL_DEFINE
  freopen("1.in", "r", stdin);
  freopen("1.ans", "w", stdout);
#endif
  int T = 1;  while (T--)  solve();
#ifdef LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
  return 0;
}
posted @ 2022-10-04 10:42  Pitiless0514  阅读(30)  评论(0编辑  收藏  举报