P10194 [USACO24FEB] Milk Exchange G 做题记录

news/2025/11/9 17:14:26/文章来源:https://www.cnblogs.com/ztrztr/p/19204477

思路(暴力 1)

我们可以先想一个最简单的暴力:遍历每一秒,每一秒的时候遍历每个奶牛来模拟题意。

但是发现这样的暴力没有优化的前景,考虑换一种暴力。

思路(暴力 2)

可以先假设每个奶牛的容量都一样大,那么所有奶牛都不会溢出,由此可以猜测第 i 秒溢出的数量就是前面 i 个奶牛的最小值减去目前这个奶牛的容量,由此可以写出第二个暴力,但是这个暴力和第一个暴力的区别在于这个每次查询是静态的,不像第一种暴力是动态的,可以考虑如何优化。

正解

我们可以通过单调队列得出每个奶牛在的最大的区间使得这个奶牛是这个区间的最小值。

那么由此就可以直接优化了,只不过要注意的是如果两个奶牛的容量同样是一个区间的最小值,我们可以采用单调队列一边是找到第一个小于目前值的,另一边是找到第一个小于等于目前值的,这样就可以解决这种问题。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
/*
*/
int n, a[1000005], d[1000005], sum, m[1000005];
int lowbit(int x) {return x & (-x);
}
int t[1000005], t2[1000005];
void addmax(int x, int y) {a[x] = y;for (int i = x; i <= n * 2; i += lowbit(i)) {t[i] = a[i];for (int j = 1; j < lowbit(i); j *= 2) {t[i] = min(t[i], t[i - j]);}}
}
int qmin(int l, int r) {int maxn = 1e18;while (l <= r) {maxn = min(maxn, a[r]);r --;for (; r - lowbit(r) >= l; r -= lowbit(r)) {maxn = min(maxn, t[r]);}} return maxn;
}
int r[1000005], l[1000005], d2[1000005];
int s[1000005];
signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;memset(t, 0x7f, sizeof t);for (int i = 1; i <= n; i ++) cin >> a[i], sum += a[i], m[i] = a[i], addmax(i, a[i]);a[n + 1] = a[1];a[0] = a[n];// for (int i = 1; i <= n; i ++) d[i] = a[i];// d[0] = a[n];for (int i = n + 1; i <= 2 * n; i ++) a[i] = a[i - n], m[i] = m[i - n], addmax(i, a[i]);for (int i = 1; i <= n * 2; i ++) s[i] = s[i - 1] + a[i];stack <int> st;for (int i = n * 2; i >= 1; i --) {while (st.size() && a[st.top()] >= a[i]) st.pop();if (st.size()) r[i] = st.top();else r[i] = n * 2 + 1;st.push(i);}while (st.size()) st.pop();for (int i = 1; i <= n * 2; i ++) {while (st.size() && a[st.top()] > a[i]) st.pop();if (st.size()) l[i] = st.top();else l[i] = 0;st.push(i);}int pos = 0;a[pos] = 1e18;for (int i = 1; i <= n; i ++) if (a[i] < a[pos]) pos = i;for (int i = pos + 1; i <= pos + n; i ++) {if (r[i] != 2 * n + 1 && a[i] != a[pos]) {int ll = r[i] - i;int rr = r[i] - l[i];// cout << i << " " << ll << " " << rr << "\n";d2[ll] += a[i] - a[r[i]];d2[rr] -= a[i] - a[r[i]];} }// cout << endl;// for (int i = pos + 1; i <= pos + n; i ++) {// if (a[i] <= a[pos]) continue;// cout << i << " " << 1 << " " << (r[i] - l[i] - 1 + 1) << "\n";// if (r[i] != n * 2 + 1) {//     d2[1] += a[i] - max(a[l[i]], a[r[i]]);//     d2[(r[i] - l[i] - 1) + 1] -= a[i] - max(a[l[i]], a[r[i]]);// }// }for (int i = 1; i <= n; i ++) {d[i] = 0;d[i] = d[i - 1] + d2[i];}for (int i = 1; i <= n; i ++) {m[i] = 0;m[i] = m[i - 1] + d[i];}for (int i = 1; i <= n; i ++) {cout << sum - m[i] << "\n";}// cout << qmin(1, 3) << "\n";// for (int j = 1; j <= n; j ++) {//     for (int i = n + 1; i <= n * 2; i ++) {//         // cout << i << " " << a[i] << " " << j << "\n";//         int minn = 1e18;//         // for (int k = i - j; k < i; k ++) {//         //     minn = min(minn, m[k]);//         // }//         minn = qmin(i - j, i - 1);//         // cout << minn << "\n";//         if (minn > m[i]) {//             sum -= (minn - m[i]);//             // a[i] = m[i];//         }//         else {//             // a[i] = d[i - 1];//         }//     }//     // for (int i = n + 1; i <= n * 2; i ++) d[i] = a[i];//     // for (int i = 1; i <= n; i ++) a[i] = a[i + n], d[i] = d[i + n];//     cout << sum << "\n";// }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

egg-sequelize 原理, 访问 sequelize 的方式, 支持情况

egg-sequelize 原理, 访问 sequelize 的方式, 支持情况主要功能 egg-sequelize 是 Egg.js 的 Sequelize 插件,主要作用是:集成 Sequelize ORM 到 Egg.js 框架中提供模型自动加载机制支持多数据源配置简化数据库操作与…

Pandas - No difference between Pandas isna() function and isnull()

Pandas - No difference between Pandas isna() function and isnull()The isna() and isnull() functions in Pandas are essentially identical in functionality. Both are used to detect missing or NA (Not Avai…

2025CCPC哈尔滨站游记

总结:三个人在那边搞笑。。。 一开始我一直在搞F,其他两人: xsh: A我会了。 然后切了。 wyx:M很简单。 然后去打代码。 wyx:好像不简单,没事,L很简单。 然后又去打代码,然后调不出来了。 我此时已经发现了 F 题…

创建conda环境时将要安装的一些软件包分析

创建conda环境时将要安装的一些软件包分析核心包python-3.11.14: Python解释器主程序,3.11 版本比 3.13 版本更稳定,科学计算库支持更好pip-25.2: Python的包管理工具,用于从 PyPI 安装第三方包setuptools-80.9.0: …

图书馆管理系统需求规格说明书

图书馆管理系统需求规划设计书 1.系统概述 1.1 项目背景 本项目旨在开发一个现代化的图书馆管理系统,解决传统图书馆管理中存在的查询繁琐、人工操作效率低、读者服务体验差等问题。 1.2 项目目标 实现图书馆业务的全…

含错方程与非线性滤波模型的逼近攻击

对序列密码线性滤波模型的攻击:https://www.cnblogs.com/luminescence/p/19204373 一、问题描述 1. 非线性滤波模型结构 L 级本原 LFSR ↓ 状态序列 \(S^{(i)} = (s_0^{(i)}, s_1^{(i)}, ..., s_{L-1}^{(i)})\) ↓ 非…

重生之我在大学自学鸿蒙构建第一天-《基础篇》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

点云配准基础知识

引言 什么是点云配准呢,我们分别看下点云和配准点云:你可以想象成 “3D 世界的像素”—— 比如用激光雷达扫描一个桌子,会得到成千上万的 3D 坐标点(每个点有 X、Y、Z 位置信息),这些点凑在一起就形成了桌子的 “…

完整教程:Android监听第三方播放获取音乐信息及包名

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

git的各种HEAD以及使用示例

gitrevisions - git docs git-rev-parse - git docs中文 HEAD 命名工作区中的更改所基于的提交。 这个很常用了,HEAD为当前分支最新提交,经常用HEAD^、HEAD^^^、HEAD~n来定位之前的提交。 # 清除工作区和暂存区的所有…

OneDrive上传和下载速度慢?有什么解决办法吗? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

win10安装广东省正版化检查工具

win10安装广东省正版化检查工具这个工具如果用管理员账户进行默认安装,启动后加载是不会弹出用户账户控制的,但如果切换到标准用户,启动则会弹出用户账户控制,需要管理员授权才能启动。 经过尝试,发现除了要禁用系…

详细介绍:深入浅出MATLAB数据可视化:超越plot()

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式 - 详解

【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

既然道可道相当道,那么传道授业解惑的根基是什么?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P10592 BZOJ4361 isn

遇到这种题还是太吃操作了。 首先看如果没有必须为非降序列的限制怎么办,那么就是求出一种长度种类的方案,然后删除的时候剩下的随便删即可。 然后考虑容斥,每次减去上一次操作不合法的位置即可,还是比较套路的。

阿道夫

阿道夫报告名称:[二刻BU--G0-P2工艺] 业务需求与数据目标报告 版本:V1.0 日期:[2025-11-07] 编制人:[易志伟/数字智能部] 审核人:[张迪/数字智能部]引言 1.1 背景与业务场景 • 工艺类型:AR(Active Area Revers…

软件开发公司常犯的5个设计误区,看看你中招了吗?

软件开发公司常犯的5个设计误区,看看你中招了吗?在软件开发行业,“功能实现” 往往被视为核心目标,而 “设计” 常被当作 “锦上添花” 的环节 —— 要么凭经验拍脑袋设计,要么照搬竞品框架,要么忽视用户真实需求…

使用jmeter做压力测试 - 实践

使用jmeter做压力测试 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

CSP2025游记总结

J组 好难!2.5个小时一道题都没做出来。 --前言 赛时 8:30~9:30 开 T1,原本想着还要分讨,但一看数据范围,秒了。 T2 也是分讨。应该是最没把握的,不仅很难对拍,而且大样例又水。 T3 一眼 dp,稍微优化一下,就过大…