heoi2020信号传递
状压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信号传递的更多相关文章
- 题解 P6622 [省选联考 2020 A/B 卷] 信号传递
洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...
- luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...
- linux 多线程之间信号传递
函数 sigwait sigwait的含义就如同它的字面意思:等待某个信号的到来.如果调用该函数的线程没有等到它想等待的信号那么该线程就休眠.要达到等到一个信号,我们得做下面的事: 首先,定义一个信号 ...
- heoi2020树
_ _01trie树合并 _ _ 在考场上一直想用数据结构维护,还花了好长时间算 $(a+1)^(b+1)$,现在看来当时好像在犯傻........ 异或有个神奇的工具是 01trie 树,此题就用此 ...
- [loj3302]信号传递
由于n较大,可以将n个数中的关系对数量记录在$m*m$的矩阵中,记作$a[i][j]$ 考虑朴素的状压dp枚举排列,即$f[i]$表示以i中的数的一种排列为整个序列的前缀的最小代价,然后转移枚举下一个 ...
- P6622 信号传递 做题感想
题目链接 前言 在这里分享两种的做法. 一种是我第一直觉的 模拟退火.(也就是骗分) 还有一种是看题解才搞懂的神仙折半搜索加上 dp . 模拟退火 众所周知,模拟退火 是我这种没脑子选手用来骗分的好算 ...
- Android面试题(一)
1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...
- 最快让你上手ReactiveCocoa之基础篇
前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...
- Altium Designer 的entry sheet ,offsheet和port作用(转载)
1.图纸结构 图纸包括两种结构关系: 一种是层次式图纸,该连接关系是纵向的,也就是某一层次的图纸只能和相邻的上级或下级有关系: 另一种是扁平式图纸,该连接关系是横向的,任何两张图纸之间都可以建立信号连 ...
随机推荐
- win10下安装mysql5.7-建议安装-自定义位置
所需文件: 文件名字:mysql-installer-community-5.7.13.0.msi 开始安装: 01:勾选: 02:选择下一步 03:选择Custom安装 04:选择下一步 05:选择 ...
- 【IDE】WebStorm常用快捷键
WebStorm常用快捷键 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件. 2. ctrl + j: 输出模板 3. ctrl + b: 跳到变量申明 ...
- mzy git学习,git协同开发忽略文档配置以及一些杂点(九)
回忆一个电脑多账户问题 之前也说了,如果使用ssh登陆的话,一个电脑就只能登陆一个账号了,不像通过凭据可以切换(但是其实也可以每次去生成新的公钥和私钥,只要你不嫌麻烦) 再次补充: ssh-keyge ...
- Learning ROS: Roslaunch tips for large projects
Design tip: Top-level launch files should be short, and consist of include's to other files correspo ...
- 剖析虚幻渲染体系(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 ...
- tcmalloc jemalloc glibc内存分配管理模块性能测试对比
tcmalloc是谷歌提供的内存分配管理模块 jemalloc是FreeBSD提供的内存分配管理模块 glibc是Linux提供的内存分配管理模块 并发16个线程,分配压测3次,每次压15分钟,可以看 ...
- HCNP Routing&Switching之OSPF LSA更新规则和路由汇总
前文我们了解了OSPF外部路由类型以及forwarding address字段的作用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15225673.html: ...
- GoLang设计模式04 - 单例模式
单例模式恐怕是最为人熟知的一种设计模式了.它同样也是创建型模式的一种.当某个struct只允许有一个实例的时候,我们会用到这种设计模式.这个struct的唯一的实例被称为单例对象.下面是需要创建单例对 ...
- Qt 6.0精简WebEngine SerialPort Multimedia等成为半残GUI框架一览
由于 Qt 集成了大量成熟模块,使之成为 C++ 领域中最好用的开源技术跨平台 GUI 开发框架.基于 Qt 能开发 Windows MacOS 传统桌面或无 GUI 应用程序.Unix/Linux ...
- GoLang设计模式06 - 对象池模式
这次介绍最后一个创建型模式--对象池模式.顾名思义,对象池模式就是预先初始化创建好多个对象,并将之保存在一个池子里.当需要的时候,客户端就可以从池子里申请一个对象使用,使用完以后再将之放回到池子里.池 ...