[BZOJ3195][Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路
Time Limit: 10 Sec Memory Limit: 128 MB
Description
小宇从历史书上了解到一个古老的文明。这个文明在各个方面高度发达,交通方面也不例外。考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n。m条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往。一对城市之间可能存在多条道路。
据史料记载,这个文明的交通网络满足两个奇怪的特征。首先,这个文明崇拜数字K,所以对于任何一条道路,设它连接的两个城市分别为u和v,则必定满足1 <=|u - v| <= K。此外,任何一个城市都与恰好偶数条道路相连(0也被认为是偶数)。不过,由于时间过于久远,具体的交通网络我们已经无法得知了。小宇很好奇这n个城市之间究竟有多少种可能的连接方法,于是她向你求助。
方法数可能很大,你只需要输出方法数模1000000007后的结果。
Input
输入共一行,为3个整数n,m,K。
Output
输出1个整数,表示方案数模1000000007后的结果。
Sample Input
3 4 1
【输入样例2】
4 3 3
Sample Output
3
【输出样例2】
4
HINT
100%的数据满足1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8.
【题目说明】两种可能的连接方法不同当且仅当存在一对城市,它们间的道路数在两种方法中不同。在交通网络中,有可能存在两个城市无法互相到达。
题解:
考试的时候我真的没有想到……看到了数据范围比较小,但是我想的是深搜而不是状压……
我们发现k的数据范围很小,所以我们考虑状压,首先考虑状态数组定义。
首先,f数组肯定有2维表示枚举到的点数和边数。我们发现,题目中对每个点的奇偶性有限制,而奇偶是两种相反的概念,
因此我们尝试再用一位表示可以和这个点连边的点的出度奇偶性状态,1表示奇;但是我们发现,如果这个设置为所有它能转移到的点的奇偶性(一共16位),
不仅时间复杂度变大,转移时候的讨论也会很复杂,而我们考虑一下,其实只弄一边的状态就可以了,从现在的点往后转移相当于从后面的点往前转移
因此我们只保存i点以及前面k个点的状态即可,我们再设置一维l,表示我们已经考虑到了前面k+1个点中的第l个点(我们设高位离着i点最近,第0位是点i-k,第k位是i点,一共k+1位)
于是我们得到了一个四维的状态数组,f[35][35][(1<<9)[10],接下来我们考虑转移
考虑对第i-k+l个点与第i个点,如果我们不再加边,就直接转移到下一个f[i][j][state][l+1]
如果我们再还合法的情况下加边,会同时改变i点和i-k+l这两个的出度奇偶性,也就是转移到f[i][j+1][state^(1<<k)^(1<<l)][l]
然后我们考虑不同i之间的转移。如果当前状态要转移的话,我们现在第i-k个点永远不会再被考虑,因此转移的前提之一是第i-k位奇偶性是0,即state&1==0
并且,我们还可以发现一个很有用的性质:对于点i+1,它初始state就是第i个点的state>>1,这一点很显然,从我们第3维的定义中就能看出这一操作可以实现
这样的话,就有跨第一维的转移,即向f[i+1][j][u>>1][0]转移
再最后的时候,输出f[n+1][m][0][0]即可,代码见下:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const LL mod=;
int n,m,k,bin[],f[][][(<<)+][];
int main()
{
scanf("%d%d%d",&n,&m,&k);
bin[]=;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
f[][][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int u=;u<bin[k+];u++)
{
for(int l=;l<k;l++)
if(f[i][j][u][l])
{
(f[i][j][u][l+]+=f[i][j][u][l])%=mod;
if(j<m&&i-k+l>)
(f[i][j+][u^bin[k]^bin[l]][l]+=f[i][j][u][l])%=mod;
}
if((u&)==&&f[i][j][u][k])
f[i+][j][u>>][]=f[i][j][u][k];
}
printf("%d",f[n+][m][][]);
}
[BZOJ3195][Jxoi2012]奇怪的道路的更多相关文章
- BZOJ3195: [Jxoi2012]奇怪的道路【状压DP】
Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每 ...
- bzoj3195: [Jxoi2012]奇怪的道路(状压dp)
Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每 ...
- 2018.10.24 bzoj3195: [Jxoi2012]奇怪的道路(状压dp)
传送门 f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个点连了jjj条边,第i−K+1i-K+1i−K+1~iii个点连边数的奇偶性为kkk时的方案数. 转移规定只能从后向前 ...
- bzoj3195 [Jxoi2012]奇怪的道路——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3195 看到数据范围就应该想到状压呢... 题解(原来是这样):https://www.cnb ...
- 【BZOJ3195】[Jxoi2012]奇怪的道路 状压DP
[BZOJ3195][Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座 ...
- 【BZOJ-3195】奇怪的道路 状压DP (好题!)
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 305 Solved: 184[Submit][Statu ...
- [补档][Jxoi2012] 奇怪的道路
[Jxoi2012] 奇怪的道路 题目 传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3195 小宇从历史书上了解到一个古老的文明.这个文明 ...
- bzoj 3195 [Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编 ...
- 【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 802 Solved: 529[Submit][Statu ...
随机推荐
- day 4 继承
1.继承引入,减少代码量 1)版本1: class Animal: '''定义一个动物类''' def eat(self): print("----吃----") def drin ...
- 【POI2007】ZAP-Queries
题面 题解 $$ \sum_{i=1}^a\sum_{j=1}^b[gcd(i,\;j)=d] \\ =\sum_{i=1}^{\left\lfloor\frac ad\right\rfloor}\s ...
- 在azure windows虚拟机上安装iis
在 dashboard-添加角色和功能-一直往下点就好了,后”选择安装类型“页面 中选择[基于角色或基于功能的安装],安装完成后 在浏览器输入 http://localhost/ 就可以正常访问网站了 ...
- set get方法诡异的空指针异常
发现原来是我的bean没有实例化 我的一直都是这么实例化的: UserEntity userEntity = null;难怪每次用不了set方法 原来是没有实例化 实例化之后就能正常使用了 UserE ...
- katalon系列十五:给浏览器添加cookie自动登陆
import org.openqa.selenium.Cookieimport org.openqa.selenium.WebDriverimport com.kms.katalon.core.web ...
- Atom 插件 Sync Settings 备份与恢复
当使用 Atom IDEA.随着使用的越来越多,安装的插件也越来越多,一旦电脑重装后需要复原开发环境,这将是一件比较头疼的事.「Sync Settings」插件可以帮助我们解决这个问题. 操作流程 安 ...
- ArcFace Demo [Android]
Free SDK demo 工程如何使用? 1.下载代码:git clone https://github.com/asdfqwrasdf/ArcFaceDemo.git 或者直接下载压缩包 2.前往 ...
- 团队开发--NABCD
团队成员介绍: 李青:绝对的技术控,团队中扮演“猪”的角色,勤干肯干,是整个团队的主心骨,课上紧跟老师的步伐,下课谨遵老师的指令,课堂效率高,他的编程格言“没有编不出来的程序,只有解决不了的bug”. ...
- Ubuntu16.04下安装显卡驱动记录
安装环境及硬件信息 Ubuntu16.04 LTS 内核版本:4.4.0 显卡:Nvidia GeForce GTX 1060 安装过程 一.首先要下载好显卡驱动程序,官方网址:http://www. ...
- Eclipse的黑色主题背景(github)
MoonRise UI Theme An early version of a dark UI theme for Eclipse 4+. Requirements Eclipse 4.2+ In ...