luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
题外话:
我可能是傻逼,
但不管我是不是傻逼,
我永远单挑出题人。
题解时间
看数据范围可以确定状压dp。
$ dp[s] $ 表示s集合去代替前几个数的话现有部分的最小结果。
将数组转化成数字之间的带权图,预处理集合和点之间的单向边数量就能解决。
对于一对相邻的转化完之后数 $ a,b $ ,贡献为
ka+kb(a>b)
\]
由此状压dp得出解。
时间复杂度实际上比 $ O( m 2^{m} ) $ 低的多可以过,
但这样由于空间限制只有70pts:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long lint;
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=21,S=1<<21;
int n,m,c,ful;
int lb[S],cb[S];
int a[100011];
int mg[N][N],mp[S][N],mn[N][S];
int dp[S];
int main()
{
read(n),read(m),read(c),ful=1<<m;
for(int i=1;i<ful;i++) lb[i]=(i&1)?0:lb[i>>1]+1,cb[i]=cb[i>>1]+(i&1);
for(int i=1;i<=n;i++) read(a[i]),a[i]--;
for(int i=2;i<=n;i++) mg[a[i-1]][a[i]]++;
for(int i=0;i<m;i++)for(int s=1;s<ful;s++)
{
mp[s][i]=mp[s^(s&-s)][i]+mg[lb[s]][i];
mn[i][s]=mn[i][s^(s&-s)]+mg[i][lb[s]];
}
memset(dp,0x3f,sizeof(dp)),dp[0]=0;
for(int s=1,t=s,i,ss,su;s<ful;s++,t=s)
{
while(t)
{
i=lb[t],t^=(t&-t),ss=s^(1<<i),su=(ful-1)^s;
dp[s]=min(dp[s],dp[ss]+cb[s]*(mp[ss][i]+c*mn[i][ss]-mn[i][su]+c*mp[su][i]));
}
}
printf("%d\n",dp[ful-1]);
return 0;
}
}
int main(){return RKK::main();}
稍微(确信)改造一下,让上面预处理出来的连边值随着dp不断更新就能解决空间问题。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long lint;
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=23,S=1<<23;
int n,m,c,ful;
int lb[S],cb[S];
int a[100011];
int mn[N][N],mp[N][N],lst[N][N],nw[N];
int dp[S];
int main()
{
read(n),read(m),read(c),ful=1<<m;
for(int i=1;i<ful;i++) lb[i]=(i&1)?0:lb[i>>1]+1,cb[i]=cb[i>>1]+(i&1);
for(int i=1;i<=n;i++) read(a[i]),a[i]--;
for(int i=2;i<=n;i++)if(a[i]!=a[i-1])
mn[a[i-1]][a[i]]+=-1,mn[a[i]][a[i-1]]+=c,
mp[a[i]][a[i-1]]+=1,mp[a[i-1]][a[i]]+=c;
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++) lst[i][j]=mn[i][j]-mp[i][j],nw[i]+=mn[i][j];
for(int j=1;j<m;j++) lst[i][j]+=lst[i][j-1];
}
memset(dp,0x3f,sizeof(dp)),dp[0]=0;
for(int s=0,t,i;s<ful-1;s++)
{
if(s)for(i=0;i<m;i++) nw[i]+=mp[i][lb[s]]-mn[i][lb[s]];
if(lb[s])for(i=0;i<m;i++) nw[i]+=lst[i][lb[s]-1];
t=(ful-1)^s;while(t)
{
i=lb[t],t^=t&-t;
dp[s|(1<<i)]=min(dp[s|(1<<i)],dp[s]+nw[i]*cb[s|(1<<i)]);
}
}
printf("%d\n",dp[ful-1]);
return 0;
}
}
int main(){return RKK::main();}
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)的更多相关文章
- 题解 P6622 [省选联考 2020 A/B 卷] 信号传递
洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...
- luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)
luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...
- [省选联考 2020 A/B 卷] 冰火战士
一.题目 点此看题 二.解法 其实这道题也不是特别难吧 \(......\) 但树状数组上二分是我第一次见. 我们把冰人和火人都按温度排序,那么考虑一个分界线 \(x\) ,问题就是求冰数组 \(x\ ...
- [省选联考 2020 A 卷] 组合数问题
题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)
luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...
- luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)
luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...
- [省选联考 2021 A/B 卷] 卡牌游戏
垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...
- 洛谷P6623——[省选联考 2020 A 卷] 树
传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...
随机推荐
- Note -「圆方树」学习笔记
目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...
- aspnetcore 使用serilog日志
而在实际项目开发中,使用第三方日志框架来记录日志也是非常多的,首先一般基础的内置日志记录器在第三方日志框架中都有实现,然后很多第三方日志框架在功能上更强大和丰富,能满足我们更多的项目分析和诊断的需求. ...
- Vue2.0源码学习(4) - 合并配置
合并配置 通过之前的源码学习,我们已经了解到了new Vue主要有两种场景,第一种就是在外部主动调用new Vue创建一个实例,第二个就是代码内部创建子组件的时候自行创建一个new Vue实例.但是无 ...
- netty系列之:Bootstrap,ServerBootstrap和netty中的实现
目录 简介 Bootstrap和ServerBootstrap的联系 AbstractBootstrap Bootstrap和ServerBootstrap 总结 简介 虽然netty很强大,但是使用 ...
- java的不正确使用方法以及什么情况不能使用java
一.Python3.6新特性 什么情况下不能运用 Java 泛型 1. 前语 Java 1.5 引入了泛型来保证类型安全,避免在运行时发作类型转换反常,让类型参数化,提高了代码的可读性和重用率.可 ...
- libc++abi.dylib: terminating with uncaught exception of type NSException
这是微信sdk注册时候报的错误 解决方法 选择Build Setting,在"Other Linker Flags"中加入"-Objc -all_load"
- 使用 Spring Cloud Jaeger 进行分布式跟踪
在本文中,学习如何实现 Jaeger(基于 OpenTracing 和 Spring Boot 应用程序)以及如何使用 Jaeger UI 可视化跟踪. 介绍 在本文中,我们将探讨如何使用 Jaege ...
- 突破限制,CSS font-variation 可变字体的魅力
今天,在 CodePen 上看到一个很有意思的效果 -- GSAP 3 ETC Variable Font Wave,借助了 JS 动画库 GSAP 实现,一起来看看: 我寻思着能否使用 CSS 复刻 ...
- 学习Spring5必知必会(7)~Spring tx
一.spring的事务管理 1.引出事务的经典例子:银行转账发生异常 ✿ 解决:把转出钱和转入钱的业务放到同一个事务空间. ■ 分析转账过程流程: ① 首先,获取 DataSource 对象: ② 其 ...
- 程序与CPU,内核,寄存器,缓存,RAM,ROM、总线、Cache line缓存行的作用和他们之间的联系?
目录 缓存 什么是缓存 L1.L2.L3 为什么要设置那么多缓存.缓存在cup内还是cup外 MESI协议----主流的处理缓存和主存数据不一样问题 Cache line是什么已经 对编程中数组的影响 ...