尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

ARC207A

ARC207A
📅 发布时间:2026/6/19 5:07:01

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;
}

相关新闻

  • 2025年肉类速冻冷库优质厂家口碑推荐榜
  • 2025年3000全自动卫生纸加工设备直销厂家
  • revit api 自定义失败处理器

最新新闻

  • 【FDTD+UPML+全场/散射场】具有TF/SF接口和UPML吸收边界的2D FDTD研究(Matlab代码实现)
  • RayScan开箱即用的 Web 漏洞扫描器 | SQL注入 / XSS / 命令注入 / LFI / SSRF / XXE / RCE / API安全
  • Java安全随机数生成:从Random到SecureRandom的实战指南
  • STM8L15x开发板实测DS18B20温度采集工程(IAR环境,含完整驱动与调试脚本)
  • kafka源码-@KafkaListener消费端的poll调用逻辑
  • 3分钟学会:Windows上最轻量的安卓APK安装工具完全指南

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号