luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)

Luogu

题外话:

我可能是傻逼,

但不管我是不是傻逼,

我永远单挑出题人。

题解时间

看数据范围可以确定状压dp。

$ dp[s] $ 表示s集合去代替前几个数的话现有部分的最小结果。

将数组转化成数字之间的带权图,预处理集合和点之间的单向边数量就能解决。

对于一对相邻的转化完之后数 $ a,b $ ,贡献为

\[-a+b(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)的更多相关文章

  1. 题解 P6622 [省选联考 2020 A/B 卷] 信号传递

    洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...

  2. luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)

    luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...

  3. [省选联考 2020 A/B 卷] 冰火战士

    一.题目 点此看题 二.解法 其实这道题也不是特别难吧 \(......\) 但树状数组上二分是我第一次见. 我们把冰人和火人都按温度排序,那么考虑一个分界线 \(x\) ,问题就是求冰数组 \(x\ ...

  4. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  5. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  6. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  7. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  8. [省选联考 2021 A/B 卷] 卡牌游戏

    垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...

  9. 洛谷P6623——[省选联考 2020 A 卷] 树

    传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...

随机推荐

  1. 基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台

    1.板卡概述 板卡由我公司自主研发,基于6UCPCI架构,处理板包含双片TI DSP TMS320C6678芯片:一片Xilinx公司FPGA XC7K420T-1FFG1156 芯片:六个千兆网口( ...

  2. MXNet学习:试用卷积-训练CIFAR-10数据集

    第一次用卷积,看的别人的模型跑的CIFAR-10,不过吐槽一下...我觉着我的965m加速之后比我的cpu算起来没快多少..正确率64%的样子,没达到模型里说的75%,不知道问题出在哪里 import ...

  3. pytest--配置用例执行顺序(pytest_ordering插件介绍)

    前言 设置测试用例执行顺序: 默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文 件),再根据名称按ascii码值的顺序升序执行. 如果想自定义pytest测试用例的执行顺序,可以 ...

  4. NSSCTF-finalrce

    菜狗的我打开题目之后,人都给我吓傻了,直接过滤的超出了我的认知  菜狗直接就枯了,这个题目其实是不难的,就是比较阴间的一个题目,审计代码,可以看到最后一行的代码"exec($url)&quo ...

  5. ensp上防火墙的实现

    使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)一.NAT介绍NAT(Network Address Translation,网络地址转换):简单来说就是将内部私有地址转换成公网地 ...

  6. HTTP攻击与防范-跨站攻击-01简介

    实验目的 1.掌握WEB渗透测试跨站攻击原理 2.了解WEB站点的跨站攻击脆弱性 3.修复存在跨站攻击可能的漏洞 实验原理 XSS又叫CSS (Cross Site script) ,跨站脚本攻击.它 ...

  7. Spring Boot+RabbitMQ 通过fanout模式实现消息接收(支持消费者多实例部署)

    本文章适用的场景:同一条消息可以被多个消费者同时消费.注意:当消费者多实例部署时,会轮询消费消息.网上有大量的的案例展示:P生产一条消息,消费者服务C中建立Q1和Q2两个队列共同消费.但极少的材料展示 ...

  8. BI数据可视化工具怎么选?用这款就够了!

    任何一项产品的选择都需要谨慎而全面,BI数据可视化工具的选择就更不用说了.作为企业的IT部门,如果没有良好的BI工具支持,IT部门将会十分容易陷入困境.那么面对多元化的BI工具市场,IT部门该如何选择 ...

  9. linux中docker容器安装vi命令详解

    在使用docker容器时,同时你docker里的系统正好是debian或ubuntu的时候,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要 ...

  10. (转)oracle 数据库性能健康检查脚本

    转至:https://blog.csdn.net/cm_0205/article/details/100210526?utm_medium=distribute.pc_relevant_downloa ...