#dp or 贪心+堆#CF704B Ant Man
分析(dp)
考虑到对于一个排列单独抽出 \(1\sim i\) 可能会分成若干段,而贡献一定是固定的,不会影响之后的选择。
首先 \(a,c\) 加上 \(x\),\(b,d\) 减去 \(x\),那么贡献就转换为
\(\begin{cases}i<j,d_i+a_j\\i>j,c_i+b_j\end{cases}\)
同样考虑从小到大插入每一个数,
设 \(dp[i][j]\) 表示前 \(i\) 个数分成 \(j\) 段的最小权值。
若 \(i=St\),那么可以新开一段或者补到开头位置。
\(dp[i][j]=\min\{dp[i-1][j-1]+d_i,dp[i-1][j]+c_i(j>0)\}\)
若 \(i=Ed\),同理 \(dp[i][j]=\min\{dp[i-1][j-1]+b_i,dp[i-1][j]+a_i(j>0)\}\)
如果 \(i\) 不为开头或结尾,那么可以新开一段,合并两段,或者接在一段的开头或者结尾(但是不能替代 \(St\) 和 \(Ed\))
新开一段就是 \(dp[i][j]=\min\{dp[i-1][j-1]+b_i+d_i\}\)
合并两段就是 \(dp[i][j]=\min\{dp[i-1][j+1]+a_i+c_i\}\)
接到开头就是 \(dp[i][j]=\min\{dp[i-1][j]+b_i+c_i\}(j>(i>St))\)
接到末尾就是 \(dp[i][j]=\min\{dp[i-1][j]+a_i+d_i\}(j>(i>Ed))\)
最后答案就是 \(dp[n][1]\)
代码
#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
const int N=5011; typedef long long lll;
int n,st,ed,x[N],a[4][N]; lll dp[2][N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void Min(lll &x,lll y){x=x<y?x:y;}
int main(){
n=iut(),st=iut(),ed=iut();
for (int i=1;i<=n;++i) x[i]=iut();
for (int i=1;i<=n;++i) a[0][i]=iut()+x[i];
for (int i=1;i<=n;++i) a[1][i]=iut()-x[i];
for (int i=1;i<=n;++i) a[2][i]=iut()+x[i];
for (int i=1;i<=n;++i) a[3][i]=iut()-x[i];
memset(dp[0],0x3f,sizeof(dp[0])),dp[0][0]=0;
for (int i=1;i<=n;++i){
memset(dp[i&1],0x3f,sizeof(dp[i&1]));
if (i==st){
for (int j=(i>ed);j<i;++j){
if (j) Min(dp[i&1][j],dp[(i&1)^1][j]+a[2][i]);
Min(dp[i&1][j+1],dp[(i&1)^1][j]+a[3][i]);
}
}else if (i==ed){
for (int j=(i>st);j<i;++j){
if (j) Min(dp[i&1][j],dp[(i&1)^1][j]+a[0][i]);
Min(dp[i&1][j+1],dp[(i&1)^1][j]+a[1][i]);
}
}else{
for (int j=(i>st)+(i>ed);j<i;++j){
if (j>1) Min(dp[i&1][j-1],dp[(i&1)^1][j]+a[0][i]+a[2][i]);
Min(dp[i&1][j+1],dp[(i&1)^1][j]+a[1][i]+a[3][i]);
if (j>(i>st)) Min(dp[i&1][j],dp[(i&1)^1][j]+a[2][i]+a[1][i]);
if (j>(i>ed)) Min(dp[i&1][j],dp[(i&1)^1][j]+a[0][i]+a[3][i]);
}
}
}
return !printf("%lld",dp[n&1][1]);
}
分析(贪心)
首先填入首尾,为了有最小值出现,同时将 1 填入。
还是一样从小到大填数,不过先考虑加上 \(a_i+c_i\),
其它数必然是接在中间,考虑直接用选完的数接上,
那么就是要找到 \(b_i-a_i\) 或者是 \(d_i-c_i\) 的最小值,用堆维护即可。
代码
#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
const int N=5011; typedef long long lll;
int n,st,ed,x[N],Cnt; lll ans,heap[N<<1],a[4][N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void Swap(lll &x,lll &y){x^=y^=x^=y;}
void Push(lll W){
heap[++Cnt]=W;
for (int x=Cnt;x>1;x>>=1)
if (heap[x]<heap[x>>1])
Swap(heap[x],heap[x>>1]);
else return;
}
void Pop(){
heap[1]=heap[Cnt--];
for (int x=1;(x<<1)<=Cnt;){
int y=x<<1|1;
if (y>Cnt||heap[y]>=heap[y-1]) --y;
if (heap[x]<=heap[y]) return;
Swap(heap[x],heap[y]),x=y;
}
}
int main(){
n=iut(),st=iut(),ed=iut();
for (int i=1;i<=n;++i) x[i]=iut();
for (int i=1;i<=n;++i) a[0][i]=iut()+x[i];
for (int i=1;i<=n;++i) a[1][i]=iut()-x[i];
for (int i=1;i<=n;++i) a[2][i]=iut()+x[i];
for (int i=1;i<=n;++i) a[3][i]=iut()-x[i];
if (st>1&&ed>1) ans=a[2][st]+a[1][1]+a[3][1]+a[0][ed];
else ans=(st>ed)?(a[2][st]+a[1][ed]):(a[3][st]+a[0][ed]);
for (int i=2;i<=n;++i)
if (i==st) Push(a[3][i]-a[2][i]);
else if (i==ed) Push(a[1][i]-a[0][i]);
else{
ans+=a[0][i]+a[2][i];
if (i<st) Push(a[1][i]-a[0][i]);//可以与st接在一起
if (i<ed) Push(a[3][i]-a[2][i]);//可以与ed接在一起
ans+=heap[1],Pop();
if (i>st) Push(a[1][i]-a[0][i]);
if (i>ed) Push(a[3][i]-a[2][i]);
}
return !printf("%lld",ans);
}
#dp or 贪心+堆#CF704B Ant Man的更多相关文章
- 洛谷 P4437 [HNOI/AHOI2018]排列(贪心+堆,思维题)
题面传送门 开始 WA ycx 的遗产(bushi 首先可以将题目转化为图论模型:\(\forall i\) 连边 \(a_i\to i\),然后求图的一个拓扑序 \(b_1,b_2,\dots b_ ...
- 【贪心+堆】XMU 1584 小明的烦恼
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1584 题目大意: 给n(n<=100 000)个任务的耗时和截至时间,问最少不能 ...
- BZOJ_2151_种树_贪心+堆+链表
BZOJ_2151_种树_贪心+堆 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编 ...
- BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
- BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆
BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是 ...
- 【bzoj4425】[Nwerc2015]Assigning Workstations分配工作站 贪心+堆
题目描述 佩内洛普是新建立的超级计算机的管理员中的一员. 她的工作是分配工作站给到这里来运行他们的计算研究任务的研究人员. 佩内洛普非常懒惰,不喜欢为到达的研究者们解锁机器. 她可以从在她的办公桌远程 ...
- 【bzoj1029】[JSOI2007]建筑抢修 贪心+堆
题目描述 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建 ...
- 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆
题目描述 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他.如果要满足顾客的需求,就必须要有足够的库存.问 ...
- BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板 贪心 + 堆 + 反向思考
Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50, ...
- P1095 守望者的逃离——DP?贪心?
https://www.luogu.org/problem/P1095 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大 ...
随机推荐
- 【图论#02】岛屿系列题(数量、周长、最大面积),flood fill算法的代码实现与优化
岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假设该网 ...
- 【MySQL】数据库设计(一)三大范式
三大范式 1NF 第一范式 强调列的原子性,即列不可分 例如: 2NF 第二范式 前提是1NF,另外包含两个部分: 表必须具有一个主键: 没有包含在主键中的列必须完全依赖于主键,而不是只依赖主键的一部 ...
- 符合ISO26262标准的建模规范检查模型静态分析静态测试工具
Model Examiner - 功能安全解决方案(以下简称MXAM)测试套件是您进行全面静态模型分析的首选工具.MXAM提供了一种简单的方法来检查建模规范.分析模型结构和评估模型指标,所有这些功能都 ...
- 使用Xilinx MIG验证硬件DDR设计
1 导读 MIG 是xilinx的memory控制器,功能强大,接口易用.当硬件设计在设计对应的DDR接口时,最好先用MIG去配置一遍DDR的管脚约束.电平约束,从而避免硬件设计好了,实际却无 ...
- 【Azure 事件中心】Event Hub 消费端出现 Timeout Exception,errorContext中 LINK_CREDIT为0的解释
问题描述 在使用Event Hub SDK消费数据过程中,出现大量的Timeout Exception,详细消息为: com.microsoft.azure.eventhubs.TimeoutExce ...
- 【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
问题描述 如何查看PHP应用部署到App Service后,Azure上面使用的应用服务器是什么呢?因为App Service支持两种操作系统,Windows 和 Linux.在Windows中,使用 ...
- C++ 函数指针,指针函数,左值右值
C++ 函数指针,指针函数,左值右值 1.函数指针 是一个指针类型的变量,存放的内容都是函数的指针,用来间接调用函数,格式如下: int add( int a, int b) { return a+b ...
- php的php-fpm
FastCgi与PHP-fpm到底是个什么样的关系 昨晚有一位某知名在线教育的大佬问了我一个问题,你知道php-fpm和cgi之间的关系吗?作为了一个5年的phper了,这个还不是很简单的问题,然后我 ...
- redis分片sharding实现原理
为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在 ...
- 计算引擎-Flink
参考:https://mp.weixin.qq.com/s/RUS9w-bGan6fDcF9CVqvFw checkpoint 1.Checkpoint Coordinator 向所有 source ...