From 67b34507d879e821d48642efff7676b6ccf71527 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Fri, 10 Oct 2025 16:22:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(mn1009t2):=20=E4=BF=AE=E5=A4=8D=E9=98=9F?= =?UTF-8?q?=E5=88=97=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E6=9B=B4=E6=96=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正队列处理时未正确更新剩余数量的问题,确保计算准确 添加测试用例和性能优化实现 --- src/10/10/mn1009t2.cpp | 3 ++- src/10/10/mn1009t2pai.cpp | 24 +++++++++++++++++ src/10/10/mn1009t2t.cpp | 54 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/10/10/mn1009t2pai.cpp create mode 100644 src/10/10/mn1009t2t.cpp diff --git a/src/10/10/mn1009t2.cpp b/src/10/10/mn1009t2.cpp index b102083..9101f6d 100644 --- a/src/10/10/mn1009t2.cpp +++ b/src/10/10/mn1009t2.cpp @@ -7,7 +7,7 @@ using ll = int64_t; const ll maxn = 2e6+5; ll n,m,v,d[maxn],p[maxn],ans=0; -std::deque> dq; // 价钱,剩余 +std::deque> dq; // 价钱,剩余个数 int main(){ std::iostream::sync_with_stdio(false); @@ -24,6 +24,7 @@ int main(){ while(d[i]){ if(dq.front().second > d[i]){ ans+=(dq.front().first+i*m)*d[i]; + dq.front().second-=d[i]; d[i]=0; }else if(dq.front().second == d[i]){ ans+=(dq.front().first+i*m)*d[i]; diff --git a/src/10/10/mn1009t2pai.cpp b/src/10/10/mn1009t2pai.cpp new file mode 100644 index 0000000..a5cc281 --- /dev/null +++ b/src/10/10/mn1009t2pai.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include +using ll = int64_t; + +std::mt19937 mt (std::chrono::high_resolution_clock::now); +std::uniform_int_distribution un(1,2e6); + +int main(){ + std::iostream::sync_with_stdio(false); + std::cin.tie(nullptr); + ll n = un(mt); + std::cout< +typedef long long LL; +using namespace std; +const int N=2e6+100; + +LL d[N],p[N],q[N],w[N]; +int main() +{ +// freopen("ice.in","r",stdin); +// freopen("ice.out","w",stdout); + int n,m,v,i; + cin>>n>>m>>v; + LL ans=0,dt=0,s,dn=0; + for (i=1;i<=n;i++) { + cin>>d[i]; + } + for (i=1;i<=n;i++) { + cin>>p[i]; + } + + int l=1,r=0; + for (i = 1; i <= n; i++) { + // 1. 维护队列单调性:移除价格更高的元素 + while (l <= r && p[i] - dt <= p[q[r]]) r--; + + s = d[i]; // 当前需求量 + + // 2. 使用队列中更便宜的冰棍 + while (l <= r) + if (s < w[q[l]] - dn) { + // 当前需求小于队首能提供的数量 + ans += (p[q[l]] + dt) * s; // 使用s支 + dn += s; // 累计使用量增加 + s = 0; + break; + } else { + // 当前需求大于等于队首能提供的数量 + ans += (p[q[l]] + dt) * (w[q[l]] - dn); + s -= w[q[l]] - dn; + dn = w[q[l++]]; // 队首元素完全使用,出队 + } + + // 3. 剩余需求用当前天的价格满足 + ans += 1LL * s * p[i]; + + // 4. 将当前天加入队列 + q[++r] = i; + w[i] = v + dn; // 当前天最多能提供v支(考虑容量) + p[i] -= dt; // 调整价格(减去时间偏移) + dt += m; // 时间偏移增加(存储成本) + } + printf("%lld\n",ans); + return 0; +}