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

做题记录2

CF2144C Non-Descending Arrays

思路

考虑 dp 。

对于每个位置,都有换或者不换两种状态,所以设 \(f_{i, 0/1}\) 为考虑前 \(i\) 个位置,并且第 \(i\) 个位置交换或者不交换累计的收益。接下来枚举每种情况:

  1. 对于 \(f_{i, 0}\) ,显然可以通过 \(f_{i - 1, 0}\) 直接转移,接下来判断一下能否从 \(f_{i - 1, 1}\) 转移;当交换会带来收益,也就是 \(a_i > b_{i - 1} \text{并且} b_i > a_{i - 1}\) 时 ,也可以通过 \(f_{i - 1, 1}\) 转移。

  2. 对于 $f_{1, 1},转移的逻辑是一样的,但是由于 \(i\) 号位置要进行交换,所以判断 \(i - 1\) 时要反过来判断。

最后考虑边界,有 \(f_{1, 0} = f_{1, 1} = 1\)

代码

void solve(void) {int n; std::cin >> n;std::vector<int> a(n + 1);std::vector<int> b(n + 1);for(int i = 1; i <= n; i++) std::cin >> a[i];for(int i = 1; i <= n; i++) std::cin >> b[i];i64 f[110][2];memset(f, 0, sizeof(f));f[1][1] = f[1][0] = 1;for(int i = 2; i <= n; i++) {f[i][0] = f[i][1] = 0;for(int s = 0; s < 2; s++) {int prea = (s == 0 ? a[i - 1] : b[i - 1]);int preb = (s == 0 ? b[i - 1] : a[i - 1]);if(a[i] >= prea && b[i] >= preb) {f[i][0] = (f[i][0] + f[i - 1][s]) % P;}}for(int s = 0; s < 2; s++) {int prea = (s == 0 ? a[i - 1] : b[i - 1]);int preb = (s == 0 ? b[i - 1] : a[i - 1]);if(b[i] >= prea && a[i] >= preb) {f[i][1] = (f[i][1] + f[i - 1][s]) % P;}}}i64 ans = (f[n][0] + f[n][1]) % P;std::cout << ans << '\n';
}

CF2144D Price Tags

思路

首先注意到,\(x \in [2, \max({c_1, c_2, \dots, c_n})]\) ,物品价格的上限是 \(\lceil \frac{\max(c)}{x} \rceil\) 。但是依次枚举时间复杂度是 \(O(n^2)\) 的,怎么优化呢?

可以按照物品的最终售价 \(p\) 分桶,设 \(C = \max(c)\) ,建立数组 \(cnt[1..C]\) 记录每种价格有多少种物品,再维护前缀和 \(s[1..C]\) ,此时对于任何区间 \([L, R]\) ,原价在这个区间中的商品数量就为 \(s_R - s_{L - 1}\)

枚举 \(x\) ,那么商品的售价范围就在 \(p = 1, 2, \dots, \lceil \frac{C}{x} \rceil\) ,对于每个售价,原价在 \([(p - 1) \times x , p \times x]\) 的商品价格一定会分到 \(p\) 上,这些商品的数量就为 $s_{p \times x} - s_{(p - 1) \times x - 1} $ ,记作 \(cnt\_new\) ,它们带来的收益就为 \(cnt\_new \times p\) 。接着计算修改价格后能使用的旧标签的数量,就为 \(\min(cnt\_new, cnt_{p})\) 。之后就可以计算答案了。

时间复杂度为 \(O(\sum^{C}_{x = 2}\frac{C}{x})\) ,是调和级数级别的,也就是 \(O(n\log n)\)

代码

void solve(void) {int n, y;std::cin >> n >> y;std::vector<int> c(n + 1);for(int i = 1; i <= n; i++) {std::cin >> c[i];}int Cmax = *std::max_element(c.begin() + 1, c.end());std::vector<int> cnt(Cmax + 1, 0);for(int i = 1; i <= n; i++) cnt[c[i]]++;std::vector<int> s(Cmax + 1, 0);for(int i = 1; i <= Cmax; i++) {s[i] = s[i - 1] + cnt[i];}i64 ans = LLONG_MIN;for(int i = 2; i <= Cmax + 1; i++) {i64 sum = 0;i64 used = 0;int maxn = (Cmax + i - 1) / i;for(int p = 1; p <= maxn; p++) {int L = (p - 1) * i + 1;int R = std::min(p * i, Cmax);if(L > Cmax) break;int cnt_new = s[R] - s[L - 1];int cnt_old = (p <= Cmax ? cnt[p] : 0);sum += (i64)p * cnt_new;used += std::min(cnt_new, cnt_old);}i64 get = sum - (i64)(y * (n - used));ans = std::max(ans, get);}std::cout << ans << '\n';
}
http://www.wxhsa.cn/company.asp?id=5338

相关文章:

  • 剑指offer-30、连续⼦数组的最⼤和
  • ITK-SNAP 安装
  • Morpheus 审计报告分享3:StETH 的精度丢失转账机制
  • 小区物业的智慧:轻松图解JVM垃圾回收的奥秘
  • SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程
  • 详细介绍:idea2025创建第一个项目
  • CUDA多版本安装切换(转链接自用)
  • 社交交友源码:功能剖析、盈利探索与绿色运营策略
  • 权变与权力异化,是斗争的根源,超越自我,良性循环
  • 元推理AGI,是人类文明的结晶,超越爱因斯坦相对论,是文明进步的必然
  • PLC结构化文本设计模式——原型模式(Prototype Pattern)
  • 【一步步开发AI运动APP】十二、自定义扩展新运动项目1
  • 【Linux】人事档案——用户及组管理 - 详解
  • 试试这个AI邪修方法,让你刷推特时间节省80%
  • [数据结构——lesson10.2堆排序以及TopK障碍]
  • 终端里跑图形应用「GitHub 热点速览」
  • trl ppo
  • PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来
  • RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通
  • 智驾终局:VLA与WA的“强脑”之争
  • 微软2018年第四季度顶级漏洞赏金猎人榜单揭晓
  • 能源汽车智能线控底盘
  • Linux中的LED子专业的系统
  • DP 凸性优化:wqs 二分
  • 浦东再添一所一流高校,上海交通大学医学院浦东校区正式启用
  • nccl study
  • AI服务器公开招标大面积失败,中国联通“招”了个寂寞?
  • 【GitHub每日速递 250916】2053 个 n8n 工作流曝光!365 种集成 + 可视化管理,效率直接拉满
  • 每日一家公司职场内幕——龙旗科技(上海)
  • 0129_迭代器模式(Iterator)