状压dp

我状压学得是真烂。。。。。

考试的时候想了状压,可是一直都是在枚举位置,没有神魔实质性突破。其实这道题的关键瓶颈也在于此,状压压的是号,而不是位置。如果 $i<=j$ 那么贡献为 $j-i$,反之则为 $k\times (i+j)$。于是只需知道 i 点前都是谁就可计算 i 的贡献,也就是说去压号。

现在暴力 dp 很明显了,关键又在于$1<<23 \times 23$ 会爆空间啊。想一想 i 对自己的贡献一定是 0 啊,那么预处理贡献时点集中不需要包括 i 本身,也就是说如果此位 $>=i$,他实际上就是 x+1,$1<<22$可以承受。

#include<bits/stdc++.h>
#define re register
#define f() cout<<"fuck"<<endl
using namespace std;
int n,m,k;
int ji[23][23],dp[1<<23],size[1<<23],biao[1<<23],zxb[23][1<<22];
inline void fr(void){freopen("c.in","r",stdin);}
inline void sc(void){scanf("%d%d%d",&n,&m,&k);}
namespace AYX
{ inline void work(void)
{ int x;scanf("%d",&x);--x;
for(re int i=2;i<=n;++i)
{ int y;scanf("%d",&y);--y;
++ji[x][y];x=y;
}
biao[0]=-1;
for(re int i=1;i<(1<<m);++i)biao[i]=biao[i>>1]+1,size[i]=size[i>>1]+(i&1);
for(re int i=0;i<m;++i)
{ for(re int j=0;j<m;++j)if(i^j)zxb[i][0]+=k*ji[j][i]-ji[i][j];
for(re int j=1;j<(1<<(m-1));++j)
{ int y=j&-j,z=biao[y];
z+=(z>=i);
zxb[i][j]=zxb[i][j^y]+ji[i][z]*(k+1)+ji[z][i]*(1-k);
}
}
int y;
for(re int i=1;i<(1<<m);++i)
{ for(dp[i]=0x3f3f3f3f,x=i;y=x&-x;x^=y)
{ int z=biao[y],w=i^y;
dp[i]=min(dp[i],dp[i^y]+zxb[z][w&y-1|w>>z+1<<z]*size[i]);
}
}
printf("%d\n",dp[(1<<m)-1]);
}
inline short main()
{sc();work();return 0;}
}
signed main()
{return AYX::main();}

heoi2020信号传递的更多相关文章

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

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

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

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

  3. linux 多线程之间信号传递

    函数 sigwait sigwait的含义就如同它的字面意思:等待某个信号的到来.如果调用该函数的线程没有等到它想等待的信号那么该线程就休眠.要达到等到一个信号,我们得做下面的事: 首先,定义一个信号 ...

  4. heoi2020树

    _ _01trie树合并 _ _ 在考场上一直想用数据结构维护,还花了好长时间算 $(a+1)^(b+1)$,现在看来当时好像在犯傻........ 异或有个神奇的工具是 01trie 树,此题就用此 ...

  5. [loj3302]信号传递

    由于n较大,可以将n个数中的关系对数量记录在$m*m$的矩阵中,记作$a[i][j]$ 考虑朴素的状压dp枚举排列,即$f[i]$表示以i中的数的一种排列为整个序列的前缀的最小代价,然后转移枚举下一个 ...

  6. P6622 信号传递 做题感想

    题目链接 前言 在这里分享两种的做法. 一种是我第一直觉的 模拟退火.(也就是骗分) 还有一种是看题解才搞懂的神仙折半搜索加上 dp . 模拟退火 众所周知,模拟退火 是我这种没脑子选手用来骗分的好算 ...

  7. Android面试题(一)

    1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...

  8. 最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...

  9. Altium Designer 的entry sheet ,offsheet和port作用(转载)

    1.图纸结构 图纸包括两种结构关系: 一种是层次式图纸,该连接关系是纵向的,也就是某一层次的图纸只能和相邻的上级或下级有关系: 另一种是扁平式图纸,该连接关系是横向的,任何两张图纸之间都可以建立信号连 ...

随机推荐

  1. 一、web请求

    BS架构(Browser/Server) 客户端使用统一的浏览器(Browser) 服务端(Server)基于统一的HTTP协议 流程:用户浏览器输入URL地址–>DNS域名解析出IP地址–&g ...

  2. Git pull and push

    转自:https://blog.csdn.net/qq_41306423/article/details/101701991 关于 git pull 和 git pull origin develop ...

  3. Go错误处理正确姿势

    1. panic 在什么情况下使用panic? 在程序启动的时候,如果有强依赖的服务出现故障时panic退出 在程序启动的时候,如果发现有配置明显不符合要求,可以panic退出(预防编程) 其他情况下 ...

  4. 利用sql语句复制一条或多条记录

    sql 复制记录insert into article (id,class,title,content) select id,'2',title,content from article where ...

  5. 剖析虚幻渲染体系(11)- RDG

    目录 11.1 本篇概述 11.2 RDG基础 11.2.1 RDG基础类型 11.2.2 RDG资源 11.2.3 RDG Pass 11.2.4 FRDGBuilder 11.3 RDG机制 11 ...

  6. plsql中数据生成工具data generator的使用

    使用数据库时,有时需要使用大量的数据,可以用PLSQL Developer提供的Data Generator工具, 这里记录一下工具的介绍及几个使用注意事项 1.工具介绍 功能入口位于 工具 菜单下, ...

  7. java IO操作,看完你应该就清晰了。

    前言: java中IO里的一些知识对于一个java新手来说,是比较难理解的.因为里面存在一些很绕的概念,比如: 1.到底是读入写出,还是读出写入: 2.我要将一个文件的内容拷贝到另一个文件是先用Inp ...

  8. SSH整合(二)

    SSH框架实现登录.新闻增删改查.树形菜单 项目结构 pom.xml 网不好不要一次引入太多,容易下不全 <project xmlns="http://maven.apache.org ...

  9. (九)羽夏看C语言——C++番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  10. Python - 执行cmd命令

    python操作cmd 我们通常可以使用os模块的命令进行执行cmd 方法一:os.system os.system(执行的命令) # 源码 def system(*args, **kwargs): ...