CF573D-Bear and Cavalry【动态dp】
正题
题目链接:https://www.luogu.com.cn/problem/CF573D
题目大意
给出\(n\)个人\(n\)匹马,每个人/马有能力值\(w_i\)/\(h_i\)。
第\(i\)个人开始对应第\(i\)匹马,每个人不能选择对应的马,给每个人分配一个马后求最大的\(\sum w_i\times h_j\)。
每次交换两个人对应的马后求答案。
\(1\leq n\leq 30000,1\leq q\leq 10000\)
解题思路
设\(f_i\)表示匹配完前\(i\)匹马时的最大价值和。
考虑怎么转移,因为人和马一一对应,正常来说大的对大的乘积的和最大。但是如果恰好第\(i\)个人对应了第\(i\)匹马,那么显然\(i\)只能选择\(i+1\),而让\(i+1\)选择\(i\)。
然后还有一种情况是只有三个时,第一个人对应了第一匹马,上面的转移会使得最后一个人和最后一匹马无法匹配,故我们还需要考虑和第三个的匹配。
也就是\(f_i\)只会从\(f_{i-1},f_{i-2},f_{i-3}\)转移过来,所以上动态\(dp\)即可
时间复杂度\(O(3^3n\log n )\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=31000,inf=1e18,S=3;
struct matrix{
ll a[S][S];
}w[N<<4],c,tt;
struct node{
ll p,w;
}e[N],h[N];
ll n,m,id[N];
matrix operator*(const matrix &a,const matrix &b){
memset(c.a,0xcf,sizeof(c.a));
for(ll i=0;i<S;i++)
for(ll j=0;j<S;j++)
for(ll k=0;k<S;k++)
c.a[i][j]=max(c.a[i][j],a.a[i][k]+b.a[k][j]);
return c;
}
bool cmp(node x,node y){return x.w>y.w;}
void Change(ll x,ll L,ll R,ll pos,matrix &val){
if(L==R){w[x]=val;return;}
ll mid=(L+R)>>1;
if(pos<=mid)Change(x*2,L,mid,pos,val);
else Change(x*2+1,mid+1,R,pos,val);
w[x]=w[x*2]*w[x*2+1];
}
ll calc(ll l,ll r){
if(l<=0)return -inf;
ll n=r-l+1,c[4]={0,1,2,0},ans=-inf;
do{
ll sum=0;
for(ll j=0;j<n;j++){
if(e[l+c[j]].p==h[l+j].p){sum=-inf;break;}
sum=sum+e[l+c[j]].w*h[l+j].w;
}
ans=max(ans,sum);
}while(next_permutation(c,c+n));
return ans;
}
void Updata(ll x){
if(x>n)return;
memset(tt.a,0xcf,sizeof(tt.a));
tt.a[1][0]=0;tt.a[2][1]=0;
tt.a[0][2]=calc(x-2,x);
tt.a[1][2]=calc(x-1,x);
tt.a[2][2]=calc(x,x);
Change(1,1,n,x,tt);return;
}
signed main()
{
scanf("%lld%lld",&n,&m);
// memset(tt.a,0xcf,sizeof(tt.a));
// tt.a[0][0]=tt.a[1][1]=tt.a[2][2]=0;
// for(ll i=1;i<(N<<2);i++)w[i]=tt[i];
for(ll i=1;i<=n;i++)scanf("%lld",&e[i].w),e[i].p=i;
for(ll i=1;i<=n;i++)scanf("%lld",&h[i].w),h[i].p=i;
sort(e+1,e+1+n,cmp);
sort(h+1,h+1+n,cmp);
for(ll i=1;i<=n;i++)id[e[i].p]=i;
for(ll i=1;i<=n;i++)Updata(i);
while(m--){
ll l,r;
scanf("%lld%lld",&l,&r);
l=id[l];r=id[r];
swap(e[l].p,e[r].p);
for(ll i=0;i<3;i++)
Updata(l+i),Updata(r+i);
printf("%lld\n",w[1].a[2][2]);
}
return 0;
}
CF573D-Bear and Cavalry【动态dp】的更多相关文章
- 【CF573D】Bear and Cavalry 线段树
[CF573D]Bear and Cavalry 题意:有n个人和n匹马,第i个人对应第i匹马.第i个人能力值ai,第i匹马能力值bi,第i个人骑第j匹马的总能力值为ai*bj,整个军队的总能力值为$ ...
- 动态DP之全局平衡二叉树
目录 前置知识 全局平衡二叉树 大致介绍 建图过程 修改过程 询问过程 时间复杂度的证明 板题 前置知识 在学习如何使用全局平衡二叉树之前,你首先要知道如何使用树链剖分解决动态DP问题.这里仅做一个简 ...
- Luogu P4643 【模板】动态dp
题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...
- 动态dp学习笔记
我们经常会遇到一些问题,是一些dp的模型,但是加上了什么待修改强制在线之类的,十分毒瘤,如果能有一个模式化的东西解决这类问题就会非常好. 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y ...
- 洛谷P4719 动态dp
动态DP其实挺简单一个东西. 把DP值的定义改成去掉重儿子之后的DP值. 重链上的答案就用线段树/lct维护,维护子段/矩阵都可以.其实本质上差不多... 修改的时候在log个线段树上修改.轻儿子所在 ...
- 动态 DP 学习笔记
不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...
- 动态dp初探
动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最 ...
- [总结] 动态DP学习笔记
学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...
- UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】
题目分析: 不难发现可以用动态DP做. 题目相当于是要我求一条路径,所有与路径有交的链的代价加入进去,要求代价最大. 我们把链的代价分成两个部分:一部分将代价加入$LCA$之中,用$g$数组保存:另一 ...
随机推荐
- 12.SpringMVC之拦截器
1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以 ...
- Google 开发console查找元素或方法
F12 后 在console中输入: $("#R")[0] 查找ID 为R的元素, 如需打印出元素属性值,则输入: console.dir($("#R")[0] ...
- 虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。
为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.webkit引擎的处理流程,如下图所示: 所有浏览器的引擎工作流程都差不多,如上图大致分5步: ...
- Redis(二):基本数据类型
基础 # redis默认有16个数据库,数组下标从0开始,默认使用0号库 # 当我们启动服务器并连接客户端之后: set <key> <value> # 向数据库中添加数据用于 ...
- vue3.0入门(四):组件
组件 组件基础 <my-counter></my-counter> const app = Vue.createApp({ // 根组件 data() { return {} ...
- C++模板简介
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数.返回值取得任意类型. 模板是一种对类型进行参数化的工具: 通常有两种形式:函 ...
- LeetCode通关:通过排序一次秒杀五道题,舒服!
刷题路线参考:https://github.com/chefyuan/algorithm-base 大家好,我是拿输出博客督促自己刷题的老三,前面学习了十大排序:万字长文|十大基本排序,一次搞定!,接 ...
- Linux下Sed命令替换文件中的所有IP
命令: sed -ri 's/([0-9]{1,3}\.){3}[0-9]{1,3}/localhost/g' es_create_index.sh 如图:
- 20210826 Lighthouse,Miner,Lyk Love painting,Revive
考场 T1 这不裸的容斥 T2 这不裸的欧拉路,先从奇数度点开始走,走不了就传送 T3 什么玩意,暴力都不会 T4 点分树??? 仔细想了一波,发现 T1 T2 都好做,T3 二分答案后可以暴力贪心, ...
- 动环监控系统中B接口的实现
动环监控系统简述 1.术语介绍 1.1 省集中监控中心-Province Supervision Center(PSC) 面向多FSU管理的高级监控层次,即省集中监控中心,通过开放的数据协议,连接监控 ...