洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递

题解

某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ),

打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题解

大概懂了一点思路,有亿点毒瘤。。。

数据范围是\(m<=23\) 的 明显是个状压么!!!

数组代表意义

  1. 令\(f[i]\)表示,当已经确定的信号站集合为\(i\)时,此时已确定花费的最小值是多少。

    此时考虑两个转移:

    • 将左向右方向中继变换为先由初始节点中继到\(0\)号节点,再由\(0\)号节点中继到目标节点

    • 将从右向左的中继变换为初始节点以\(−1\)的花费中继到\(0\)号节点,再由\(0\)号节点中继到目标节点

  2. \(cnt_{i,j}=x\)表示有\(x\)个需要从\(i\)转移到\(j\)

  3. \(val\)的含义在下文中给出,这里需要注意一下\(val\)的空间\(M*(2^{M-1})\)刚刚好,不要开太大,否则会\(MLE\)

  4. \(las\)表示上一个的坐标,用来更新\(cnt\)值

  1. const int M=23;
  2. int n,m,K,las,cnt[M+5][M+5],val[M+5][1<<(M-1)],f[1<<M];

初始化

拿\(cnt[i][j]\)存一下从\(i\)到\(j\)的总数,也就是下面这个式子:

$cnt_{i,j}= \sum_{k=1}^{n-1} [S_k=i][S_{k+1}=j] $

  1. for(int i=1,x;i<=n;i++)
  2. {
  3. scanf("%d",&x);
  4. x--;
  5. if(i>1)
  6. cnt[las][x]++;
  7. las=x;
  8. }

算法主体

然后对于题面推算一下每个位置对于最终答案的加值,如下:

\(\begin{aligned}ans&=\sum_{i=1}^m\sum_{j=i+1}^mcnt_{id_i,id_j}(j-i)+\sum_{i=1}^m\sum_{j=1}^{i-1}cnt_{id_i,id_j}K*(i+j)\\&=\sum_{i=1}^m-i\sum_{j=i+1}^mcnt_{id_i,id_j}+\sum_{i=1}^mi\sum_{j=1}^{i-1}cnt_{id_j,id_i}+K*\sum_{i=1}^mi\sum_{j=1}^{i-1}cnt_{id_i,id_j}+K*\sum_{i=1}^mi\sum_{j=i+1}^mcnt_{id_j,id_i}\\&=\sum_{i=1}^mi\left(\sum_{j=i+1}^m\left(K\cdot cnt_{id_j,id_i}-cnt_{id_i,id_j}\right)+\sum_{j=1}^{i-1}\left(K\cdot cnt_{id_i,id_j}+cnt_{id_j,id_i}\right)\right)\end{aligned}\)

然后,用\(val[i][j]\)简化一下上面的式子

\(vaj_{i,j}=\sum_{k\notin,k!=i}(K*cnt_{id_k,id_i}-cnt_{id_i,id_k})+\sum_{k\in j}(K*cnt_{id_i,id_k}+cnt_{id_k,id_i})\)

在处理\(val\)数组时可以发现对于\(1\)~\(i-1\)状态的是没有必要变动的,因此只需要将i之后的更改可以了

\((j\) &$ ( (1<<i)-1)$

表示前\(1\)~\(i-1\)状态不变

\(((j\)^\((j\)&\(((1<<i)-1)))>>1)\)

表示对于\(i+1\)~\(n\)状态更新,向右移一位

更改时要从\(j\)状态除去一个\(lowbit\)转移过来原因见上,

剩下的就是关于上面公式的使用了

  1. for(int i=0;i<m;i++)
  2. {
  3. for(int j=0;j<m;j++)//对于0状态进行初始化
  4. if(j!=i)
  5. val[i][0]+=K*cnt[j][i]-cnt[i][j];
  6. for(int j=1;j<(1<<m);j++)//更新后面状态
  7. if(!(j&(1<<i)))
  8. {
  9. int x=j^lowbit(j),y=__builtin_ffs(j)-1;//求最后一位1
  10. val[i][(j&((1<<i)-1))+((j^(j&((1<<i)-1)))>>1)]=val[i][(x&((1<<i)-1))+((x^(x&((1<<i)-1)))>>1)]+K*cnt[i][y]+cnt[y][i]+cnt[i][y]-K*cnt[y][i];
  11. }
  12. }

最后就是对于\(dp\)方程的转移了,和上面推的式子一样,再此不做过多赘述。

  1. for(int i=1;i<(1<<m);i++)
  2. {
  3. f[i]=INT_MAX;//初始化赋最大值
  4. int sum=__builtin_popcount(i);//求i状态中1的数量
  5. for(int j=0;j<m;j++)
  6. if(i&(1<<j))
  7. {
  8. int x=i^(1<<j);
  9. f[i]=min(f[i],f[x]+sum*val[j][(x&(1<<j)-1)+((x^x&(1<<j)-1)>>1)]);
  10. }
  11. }

\(code\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M=23;
  4. int n,m,K,las,cnt[M+5][M+5],val[M+5][1<<(M-1)],f[1<<M];
  5. int lowbit(int x)
  6. {
  7. return x&(-x);
  8. }
  9. int main()
  10. {
  11. scanf("%d%d%d",&n,&m,&K);
  12. for(int i=1,x;i<=n;i++)
  13. {
  14. scanf("%d",&x);
  15. x--;
  16. if(i>1)
  17. cnt[las][x]++;
  18. las=x;
  19. }
  20. for(int i=0;i<m;i++)
  21. {
  22. for(int j=0;j<m;j++)
  23. if(j!=i)
  24. val[i][0]+=K*cnt[j][i]-cnt[i][j];
  25. for(int j=1;j<(1<<m);j++)
  26. if(!(j&(1<<i)))
  27. {
  28. int x=j^lowbit(j),y=__builtin_ffs(j)-1;
  29. val[i][(j&((1<<i)-1))+((j^(j&((1<<i)-1)))>>1)]=val[i][(x&((1<<i)-1))+((x^(x&((1<<i)-1)))>>1)]+K*cnt[i][y]+cnt[y][i]+cnt[i][y]-K*cnt[y][i];
  30. }
  31. }
  32. for(int i=1;i<(1<<m);i++)
  33. {
  34. f[i]=INT_MAX;
  35. int sum=__builtin_popcount(i);
  36. for(int j=0;j<m;j++)
  37. if(i&(1<<j))
  38. {
  39. int x=i^(1<<j);
  40. f[i]=min(f[i],f[x]+sum*val[j][(x&(1<<j)-1)+((x^x&(1<<j)-1)>>1)]);
  41. }
  42. }
  43. printf("%d",f[(1<<m)-1]);
  44. return 0;
  45. }

完结撒花\(QAQ\)

题解 P6622 [省选联考 2020 A/B 卷] 信号传递的更多相关文章

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

    luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...

  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. [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂

    题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...

随机推荐

  1. web.xml 基本配置(SSM maven项目)

    <web-app> <display-name>Archetype Created Web Application</display-name> <!--we ...

  2. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.B)- FlexSPI NOR连接方式大全(RT500)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT500的FlexSPI NOR启动的连接方式. 这个i.MXRT FlexSPI NOR启动连接方式系列文章,痞子衡 ...

  3. Mybatis-plus在原有的select查询语句中动态追加查询条件

    一.适用场景 1.使用了xml形式的mapper.2.不想在select查询中大量使用<if>标签来判断条件是否存在而加入条件. 二.步骤 1.自定义wrapper继承QueryWrapp ...

  4. [bug] Authentication failed for token submission (认证失败)异常

    原因 gitee上下的项目,启动后能访问首页,但登录报错.原因是根据用户名上数据库查密码没有得到结果,中间任何环节有问题都可能导致,我的是因为mapper.xml中的<mapper namesp ...

  5. Fio 输出内容的解释

    Fio 输出内容的解释 feilianbb 2016-01-11 16:18:54  27828  收藏 19 文章标签: Linux 存储 Fio SSD 性能   翻译原文来源 https://t ...

  6. 使用ps、top、ps_mem命令找出Linux中的最大内存消耗过程

    使用ps.top.ps_mem命令找出Linux中的最大内存消耗过程 2020-02-08 16:06:59作者:自力稿源:云网牛站 您可能已经看到Linux系统多次消耗过多的内存,如果是这种情况,那 ...

  7. Zabbix 架构

    Zabbix 架构 1.Zabbix Server Zabblx server是agent程序报告系统可用性.系统完整性和统计数据的核心组件,是所有配置信息.统计信息和操作数据的核心存储器. 2.Za ...

  8. Centos7如何安装开源办公软件Libreoffice

    在Centos7安装了WPS,但是用了没两月就出问题,无法正常使用.(准确来说,安装的WPS一直都有各种问题存在,但是没有影响到主要功能也就将就着用,后来是直接输入不了文字) 既然是开源系统,自然而然 ...

  9. Linux_yum命令详解

    一.yum命令语法 yum [options] [command] [package ...] 二.yum命令常用的选项: yum options -y //自动回答为"yes" ...

  10. CSS(2)盒子模型、定位浮动

    盒子模型 盒子模型:一个盒子中主要的属性就5个.width与height.padding.border.margin.盒子模型标准有两种为标准盒模型和IE盒模型.学习上以标准盒子模型为主 width和 ...