CF573D Bear and Cavalry

news/2025/1/11 21:01:23/文章来源:https://www.cnblogs.com/summ1t/p/18521628

原题链接

比较简单的 \(\text{dp}\) 题。

看见题目的 \(\sum w_ih_i\) 式子,很容易想到排序不等式,所以我们先对 \(w,h\) 排序,然后分情况讨论。

  • \(w_i,h_i\) 对应的编号不相等,肯定是把它们配对。

  • \(w_i,h_i\) 对应的编号相等,考虑这样的连法:

  • 若是这种情况也不合法,或者它们之后又有一个点不合法,我们再加一个点,会得到两种情况:

而这样一定可以得到最优,之后不合法的规模继续扩大,我们也可以拆分成上述的小问题。

所以转移方程易得:\(f_i=\max\begin{cases} f_{i-1}+w_ih_i \\f_{i-2}+w_ih_{i-1}+w_{i-1}h_i\\f_{i-3}+w_ih_{i-1}+w_{i-1}h_{i-2}+w_{i-2}h_i\\f_{i-3}+w_ih_{i-2}+w_{i-1}h_{i}+w_{i-2}h_{i-1} \end{cases}\)

从大往小进行转移,转移前注意判断是否合法,时间复杂度 \(O(nq)\),卡卡常似乎能过。

但是这个方程明显支持矩阵优化,我们列出转移矩阵,用线段树维护即可。

我们用广义矩阵乘法:\(C_{i,j}=\max_{k=1}^{m}A_{i,k}+B_{k,j}\),然后列出式子:

\(\begin{bmatrix} f_{i-1} \\f_{i-2}\\f_{i-3} \end{bmatrix}\times \begin{bmatrix}w_ih_i& w_{i}h_{i-1}+w_{i-1}h_i&\max\{式子太长懒得写\} \\0& -\text{INF} &-\text{INF} \\-\text{INF}& 0 &-\text{INF} \end{bmatrix}=\begin{bmatrix} f_{i}\\f_{i-1}\\f_{i-2} \end{bmatrix}\)

注意线段树 \(\text{pushup}\) 时的顺序,我们的转移是从大往小做的。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define rd read()
#define ll long long
#define in inline
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define ROF(i,j,k) for(int i=j;i>=k;i--)
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;
}
const int N=1e5+10;
const ll INF=1e17;
int n,q,w[N],h[N],idw[N],idh[N],dw[N],dh[N],tmp[N];
bool cmp(int a,int b){return tmp[a]<tmp[b];}
struct matrix{ll a[3][3];matrix(){memset(a,0,sizeof(a));}matrix operator*(matrix const&T){matrix res;FOR(i,0,2) FOR(j,0,2) res.a[i][j]=-INF;FOR(i,0,2){FOR(k,0,2){ll r=a[i][k];FOR(j,0,2) res.a[i][j]=max(res.a[i][j],r+T.a[k][j]);}}return res;}
}g[N],tr[N<<2];
void pushup(int u){tr[u]=tr[u<<1|1]*tr[u<<1];}
void build(int u,int l,int r){if(l==r){tr[u]=g[l];return;}int mid=(l+r)>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);
}
void modify(int u,int l,int r,int x){if(l==r){tr[u]=g[l];return;}int mid=(l+r)>>1;if(x<=mid) modify(u<<1,l,mid,x);else modify(u<<1|1,mid+1,r,x);pushup(u);
}
void init(int x){if(idw[x]!=idh[x]) g[x].a[0][0]=1ll*w[x]*h[x];else g[x].a[0][0]=-INF;if(x>1) g[x].a[0][1]=(idw[x]!=idh[x-1]&&idw[x-1]!=idh[x])?1ll*w[x]*h[x-1]+1ll*w[x-1]*h[x]:-INF;else g[x].a[0][1]=-INF;if(x>2){bool flag=false;ll res=-INF;if(idw[x]!=idh[x-1]&&idw[x-1]!=idh[x-2]&&idw[x-2]!=idh[x])flag=true,res=max(res,1ll*w[x]*h[x-1]+1ll*w[x-1]*h[x-2]+1ll*w[x-2]*h[x]);if(idw[x]!=idh[x-2]&&idw[x-1]!=idh[x]&&idw[x-2]!=idh[x-1])flag=true,res=max(res,1ll*w[x]*h[x-2]+1ll*w[x-1]*h[x]+1ll*w[x-2]*h[x-1]);g[x].a[0][2]=res;}else g[x].a[0][2]=-INF;g[x].a[1][0]=g[x].a[2][1]=0,g[x].a[1][1]=g[x].a[1][2]=g[x].a[2][0]=g[x].a[2][2]=-INF;
}
int main(){n=rd,q=rd;FOR(i,1,n) w[i]=rd,idw[i]=i,tmp[i]=w[i];sort(idw+1,idw+1+n,cmp);FOR(i,1,n) w[i]=tmp[idw[i]];FOR(i,1,n) h[i]=rd,idh[i]=i,tmp[i]=h[i];sort(idh+1,idh+1+n,cmp);FOR(i,1,n) h[i]=tmp[idh[i]];FOR(i,1,n) dw[idw[i]]=i,dh[idh[i]]=i;FOR(i,1,n) init(i);build(1,1,n);while(q--){int x=rd,y=rd;swap(dh[x],dh[y]),swap(idh[dh[x]],idh[dh[y]]);FOR(i,dh[x],min(n,dh[x]+2)) init(i),modify(1,1,n,i);FOR(i,dh[y],min(n,dh[y]+2)) init(i),modify(1,1,n,i);printf("%lld\n",tr[1].a[0][0]);}return 0;
}

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

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

相关文章

多校 A 层冲刺 NOIP2024 模拟赛 17

难度 ★★★★☆多校A层冲刺NOIP2024模拟赛17 T1 网格 签到题 注意到 \(+\) 与 \(\times\) 由于优先级其实是分开的,所以可以考虑每到达一个 \(+\) 计算一次贡献(乘上一个组合数),然后将前置贡献重新赋值为方案数,DP 只需考虑连续 \(\times\) 段即可。 时间复杂度 \(O(nm)…

图吧垃圾佬理解的早期国产芯片历史(龙芯中科和同行的恩怨解析)

额……老铁们,我图吧老捡国产芯片垃圾的了。最近有人问咱关于国产芯片发展故事的事,所以咱简单答疑了一下顺带做了个记录的整理,简单看下情况。 水友: 就是我有个同学,已经魔怔了,现在已经在同学群里说天玑吊打国产芯片了 前几天说的是吊打9950x… 垃圾佬: 吊打国产芯片…

Apple Safari 18 - macOS 专属浏览器 (独立安装包下载)

Apple Safari 18 - macOS 专属浏览器 (独立安装包下载)Apple Safari 18 - macOS 专属浏览器 (独立安装包下载) 适用于 macOS Sonoma 和 macOS Ventura 的 Safari 浏览器 18 请访问原文链接:https://sysin.org/blog/apple-safari-18/ 查看最新版。原创作品,转载请保留出处。 作…

记录一次大炮打蚊子的modbustcp通讯连接异常问题

一.问题描述 某种场景下,安装有Ubuntu22系统的设备A开机后,1-2min内设备E遥控器不能遥控设备A移动,之后恢复正常。 二.设备组网设备A和设备C之间使用modbustcp协议进行通讯。 三.首战 3.1 查看日志 放开该端口的modbus查询帧日志打印,发现整体的帧格式,发现返回了modbus数…

读数据工程之道:设计和构建健壮的数据系统25查询

查询1. 查询 1.1. 通过理解查询、建模和转换​,你会掌握将原始数据转化为下游利益相关者可用数据的工具 1.2. 被很多人熟知的SQL,这是最流行和通用的查询语言 1.3. 查询是数据工程、数据科学和数据分析的基础 1.4. 在了解数据转换的基本模式和技术之前,你需要了解什么是查询…

制作一个龙芯旧世界的 dotnet sdk docker 镜像

本文将和大家分享如何制作一个在龙芯旧世界上可跑的 dotnet sdk docker 镜像,以及我的踩坑过程以下是我的 dockerfile 文件,内容特别简单 FROM cr.loongnix.cn/library/debian:buster WORKDIR /root RUN apt-get update -y && \apt-get install -y --no-install-reco…

18-网络安全测评技术与标准

18.1 概况 1)概念 :指参照一定的标准规范要求,通过一系列的技术和管理方法,获取评估对象的网络安全状况信息,对其给出相应的网络安全情况综合判定。 网络安全测评对象通常包括信息系统的组成要素或信息系统自身。2)发展1983年,美国国防部颁布《可信计算机系统评估准则 T…

修改PE导入表注入DLL——实例图文教程——让你看的明明白白

其实通过修改PE导入表注入DLL的教程很多,本文也只是其中的沧海一粟而已,但既然写出来,自我感觉应该还是有一点自我的东西的,至少自认为做到了思路清晰,每步都有据可依,让看客应该能做到“看的明明白白”!本贴以《英雄无敌》1游戏程序为例子,向其添加一个DLL,调用其中的…

《机器人SLAM导航核心技术与实战》第1季:第10章_其他SLAM系统

《机器人SLAM导航核心技术与实战》第1季:第10章_其他SLAM系统 视频讲解【第1季】10.第10章_其他SLAM系统-视频讲解【第1季】10.1.第10章_其他SLAM系统_RTABMAP算法【第1季】10.2.第10章_其他SLAM系统_VINS算法【第1季】10.3.第10章_其他SLAM系统_机器学习与SL第1季:第10章_其…

web安全作业(SQL注入1)

web安全作业(SQL注入) 理论作业 1.什么是盲注?盲注的类型? 2.报错注入常用的函数有哪些?请分别解释其用法? 3.时间盲注的payload构造方法?用到的函数及其用法? 4.DNS Log注入原理?前提条件及应用场景分别是什么? 1. 开发人员屏蔽了报错信息,导致攻击者无法通过报错信…

RHEL9.4搭建虚拟机实验环境

日期:2024.10.27 目的:搭建Linux虚拟机环境供学习测试,无图形界面。同等硬件配置下性能上要优于Windows上运行的虚拟化解决方案。 参照:鸟哥Linux私房菜服务器篇 RockyLinux 9版 https://linux.vbird.org/linux_server/rocky9/ Linux中国 如何在 Rocky Linux 9 / AlmaLinux…