P2748 [USACO16OPEN]Landscaping P
题目链接
题意分析
由于Ai,Bi≤10 所以我们可以考虑把所有的泥土都分开讨论
也就相当于
2,3,1,4
转化之后就是如下
1,1,2,2,2,3,4,4,4,4
然后我们只考虑多出来或者少出来的泥土
如果当前是多的 那么我们就需要Y代价移走
到了下一个少的泥土时候 我们就存在两种选择
1.花费X代价购买一泥土
2.花费Z|i-j|的代价移入一泥土
我们考虑顺序扫描使得j>i
那么新增代价就是Min{(j−i)z−Y,X}
或者说 Min{jz−(iz+Y),X}
左边是因为我们从i这个位置移进泥土 所以也就减去了移走泥土的Y的代价
然后我们就计算好了当前的新增代价 为cost
那么再到了位置k的时候 还是少的 考虑一下j(仅仅是为了解释过程 不考虑合理性)
那么新增代价就是Min{(k−j)z−cost,X}
也就是Min{kz−(jz+cost),X}
左边是因为我们从j这个位置移进泥土 所以也就减去了j移动泥土的cost的代价
当然真正操作的时候 多出来的泥土和少出来的泥土我们是要分开处理的
注意一下 上面我们转成了一个特殊形式Min{jz−(iz+Y),X}以及Min{kz−(jz+cost),X}
所以我们对于当前处理完了一个答案之后 直接就可以得出TA对接下来的答案的贡献 (jz+cost)
然后我们开两个堆就可以直接维护了
CODE:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#define N 100005
#define inf 1e18
using namespace std;
priority_queue<long long> cdy,wzy;
long long n,X,Y,Z;
long long num1[N],num2[N];
long long ans;
void work1(long long now)
{
long long cost=inf;
if(!wzy.empty())
{
long long tx=wzy.top(),tmp=now*Z-tx;
if(tmp<Y) cost=tmp,wzy.pop(),cdy.push(now*Z+tmp);
}
if(cost==inf) cost=Y,cdy.push(now*Z+Y);
ans+=cost;
}
void work2(long long now)
{
long long cost=inf;
if(!cdy.empty())
{
long long tx=cdy.top(),tmp=now*Z-tx;
if(tmp<X) cost=tmp,cdy.pop(),wzy.push(now*Z+tmp);
}
if(cost==inf) cost=X,wzy.push(now*Z+X);
ans+=cost;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>X>>Y>>Z;
for(long long i=1;i<=n;++i)
cin>>num1[i]>>num2[i];
for(long long i=1;i<=n;++i)
{
for(long long j=1;j<=abs(num1[i]-num2[i]);++j)
{
if(num1[i]>num2[i]) work1(i);
else work2(i);
}
}
cout<<ans<<endl;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 使用 Dify + LLM 构建精确任务处理应用