状压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. 关于Java集合框架的总结

    Java集合框架(都实现了Cloneable和Serializable接口)支持以下两个类型的容器: 一种是为了存储一个元素集合,简称集合(collection). 另一种是为了存储键/值对,称为图( ...

  2. 阿里云(CentOS)搭建MediaWiki

    搭建环境 系统:CentOS 7.3 PHP:5.4.16 Mysql:maria MediaWiki:1.26.4(更高版本不再支持PHP5.4) 下面我们开始安装LAMP环境: 1.安装Apach ...

  3. vmware 配置不同网段双网卡。

    一.前言 需求:由于LVS演练需要,需要配置两张linux OS网卡,而且是不同网段. 准备: 物理机:单网卡 VMware:centos 6.8 二.配置 第一步:新建虚拟机VMware,cento ...

  4. Mysql时间戳转Java时间戳

    MySQL 时间戳和Java返回的时间戳是不一样的 例如: 当前时间是 2014-08-04 10:42:55.204000 使用mysql时间戳函数UNIX_TIMESTAMP 返回的结果为: 14 ...

  5. SpringBoot笔记(2)

    一.容器功能 1.1 组件添加 1. @Configuration Full模式:获取对象时,首先在容器内搜索是否存在,如存在直接拿出 默认为Full模式,单例 配置类组件之间有依赖关系,方法会被调用 ...

  6. leetcode——217. 存在重复元素

    leetcode--217. 存在重复元素 题目描述:给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false ...

  7. [考试总结]noip模拟46

    脑袋确实是不好使了需要回家暴颓治疗 数数数树鼠树 真好玩. 数数 大水题一个,妥妥的签到题目,然后... 我没签上 气展了!!! 其实我还是想麻烦了. 就是我们实际上就是排序之后每一次找头上和尾巴上的 ...

  8. Gitlab(2)- centos7.x 下安装社区版 Gitlab 以及它的配置管理

    前置准备:虚拟机安装以及配置相关 包含安装 centos7.8 虚拟机.设置静态 ip 等 https://www.cnblogs.com/poloyy/category/1703784.html 注 ...

  9. ubantu与CentOS虚拟机之间搭建GRE隧道

    Author       : Email         : vip_13031075266@163.com Date          : 2020.01.23 Copyright : 未经同意不得 ...

  10. Tomcat部署与优化

    目录: 一.Tomcat概述 二.Tomcat 服务部署 三.Tomcat 虚拟主机配置 四.Tomcat 优化 一.Tomcat概述 Tomcat是Java语言开发的,Tomcat服务器是-个免费的 ...