当前位置: 首页 > news >正文

ARC207A

AT_arc207_a Affinity for Artifacts
CSP-S T4 同款trick(好像是)
首先注意到若某个灯在第 \(i\) 次被点亮,那么它的贡献为 \(\max(0,a_i-i+1)\),可以提出 \(a_i\) 变成 \(a_i+\max(-a_i,-i+1)\),变一下号就可以得到答案条件式子:

\[X\geq\sum_{i\leq n}^{i=1}a_i-\sum_{i\leq n}^{i=1}\min(a_i,i-1) \]

已知项移到一边,有 \(X'=\sum a_i-X\),最终的式子:

\[\sum_{i\leq n}^{i=1}\min(a_i,i-1)\geq X' \]

然后有一个处理这类 \(\min\)/\(\max\) 匹配的trick,就是将他们拉到一个序列中从小到大排序,记录那些是左边部分那些是右边部分,左右匹配,贡献只与在序列中靠后的点有关,设计DP状态 \(f_{i,j,k,s}\) 表示考虑前 \(i\) 个点,有 \(j\) 个左部点和 \(k\) 个右部点未匹配,当前的贡献总和为 \(s\) 的方案数,转移考虑当前点是左部还是右部,有向前匹配和留下来向后匹配两种决策。由于 \(s\) 的范围被限定在了 \(n^2\) 范围,所以这个式子的时空复杂度均为 \(O(n^5)\),过不去这道题。
这个时候发现对于固定的 \(i\)\(j\),如果预处理出前 \(i\) 个点中左部点和右部点的数量,就可以通过 \(j\) 来推出固定的 \(k\),于是DP状态改为 \(f_{i,j,s}\),以当前点为左部点为例,转移如下:

  • 与前面未匹配的右部点匹配,由于当前状态为 \(k\),则 \(i-1\) 状态为 \(k+1\),匹配时有 \(k+1\) 种匹配方式,有如下转移:

\[f_{i,j,s}=f_{i,j,s}+(k+1)\times f_{i-1,j,s-a_i} \]

  • 与后面的点匹配,则存在 \(j\) 里:

\[f_{i,j,s}=f_{i,j,s}+f_{i-1,j-1,s} \]

右部点的转移实际同理,也实际简单。
时间复杂度为 \(O(n^4)\),喵哉喵哉。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll p = 998244353;
ll n,x,a[410],f[210][210][5010],ctl[410],ctr[410],sum,ans;
pair<ll,ll> d[410];
inline int read()
{int x = 0;char ch = getchar();while(ch<'0'||ch>'9') ch = getchar();while(ch>='0'&&ch<='9'){x = (x<<1)+(x<<3)+(ch^48);ch = getchar();}return x;
}
int main()
{n = read(); x = read();for (int i = 1;i <= n;i++) a[i] = read(),sum += a[i];for (int i = 1;i <= n;i++){d[i*2-1] = {a[i],0}; d[i*2] = {i-1,1};}sort(d+1,d+n*2+1,greater<pair<ll,ll>>()); x = sum-x;for (int i = 1;i <= n*2;i++){ctl[i] = ctl[i-1]; ctr[i] = ctr[i-1];if (d[i].second) ctr[i]++;else ctl[i]++;}f[0][0][0] = 1;for (int i = 1;i <= n*2;i++)for (ll j = 0;j <= ctl[i];j++){ll k = ctr[i]-(ctl[i]-j);if (k < 0) continue;// cout << i << " " << j << " " << k << "\n";for (int s = 0;s <= n*(n-1)/2;s++){if (d[i].second){if (s >= d[i].first) f[i][j][s] = (f[i][j][s]+(j+1)*f[i-1][j+1][s-d[i].first]%p)%p;if (k) f[i][j][s] = (f[i][j][s]+f[i-1][j][s])%p;}else{if (s >= d[i].first) f[i][j][s] = (f[i][j][s]+(k+1)*f[i-1][j][s-d[i].first]%p)%p;if (j) f[i][j][s] = (f[i][j][s]+f[i-1][j-1][s])%p;}}}for (int i = max(0ll,x);i <= n*(n-1)/2;i++) ans = (ans+f[n<<1][0][i])%p;cout << ans << "\n";return 0;
}
http://www.rkmt.cn/news/47082.html

相关文章:

  • 2025年肉类速冻冷库优质厂家口碑推荐榜
  • 2025年3000全自动卫生纸加工设备直销厂家
  • revit api 自定义失败处理器
  • 2025学校高空防坠网销售厂家口碑推荐榜
  • 2025免费简历模版行业领先的推荐榜单
  • 2025年9月EGUOO关节灵活营养素推荐:FDA认证生产链与成分溯源实录
  • 2025年6月EGUOO关节灵活营养素推荐:科研背书下的关节养护新选择
  • 深入解析:iBizOdoo:基于模型驱动的商业套件总线简介
  • 守卫-贪心,线段处理
  • 2025年口碑好的不锈钢衣柜优质厂家推荐榜单
  • 2025年质量好的开天品牌口碑榜
  • Python3 OS 文件/目录方法详解
  • 2025年11月EGUOO男士三氨能量推荐:全网口碑验证千万销量同款矩阵
  • 2025入职背调全方位的推荐排行榜
  • 2025年靠谱的高强度铝合金线槽用户好评厂家排行
  • 2025年瑜伽垫供应厂家口碑排行榜
  • 详细介绍:Home Assistant 米家集成:开启智能家居新体验
  • 第九周第二天9.2
  • 2025年膜结构工厂排行榜
  • 2025年评价高的国标铝合金线槽行业内口碑厂家排行榜
  • 2025年昆山短视频代运营行业知名品牌榜
  • 2025建筑安全网直销厂家推荐
  • 2025年11月EGUOO纳豆激酶功效:90粒装长期养护场景指南
  • 2025年比较好的栏杆用户好评厂家排行
  • 2025年质量好的机柜空调厂家实力及用户口碑排行榜
  • 2025年评价高的近场直写静电纺丝设备最新TOP厂家排名
  • 2025年评价高的手持激光打标机厂家实力及用户口碑排行榜
  • 2025.11.12博客
  • 2025年6月EGUOO复合植物舒压睡眠片推荐:便携规格随行调理作息节律
  • 深入解析:单序列和双序列问题——动态规划