题目链接

比赛链接

\(Description\)

\(Solution\)

参考:https://www.cnblogs.com/SovietPower/p/9781573.html

暴力:\(f[i][j][k]\)表示前\(i\)个数,与起来为\(j\),异或和为\(k\)的方案数。复杂度\(O(n*4^{13})\)。

考虑位运算的性质,最后怎么得到某一位的1:&要求所有数这一位为1,^只需判这一位为1的数的奇偶性。

所以我们用13位三进制s表示13位01的状态(2表示全1,0/1表示奇偶性),再存一下选的数的个数。

这样DP就是\(O(n*3^{13})\)了。

但是直接\(f[i][s][0/1]\)不会写啊,求路过dalao教。。(拆状态好像也挺麻烦)

记异或和为\(x\),位与和为\(y\),因为是与,所以\(x\)再与\(y\)和\(y\)是有关系的,也就是当选了奇数个数时,\(x\&y=y\);否则\(x\&y=0\)。

那么暴力中的合法的\(j,k\)实际没有\(2^{13}*2^{13}\)那么多。

所有合法状态满足\(x\&y=y\)或是\(x\&y=0\),也就是\(y\)要么是\(x\)的子集,要么与\(x\)没有交集(别忘这种情况啊)。

因为有第二种情况所以只求异或和的所有子集不行。但再求一遍补集存状态也不对(不知道为什么)。

令\(xx=x\&(\sim y)\),我们发现\(xx\)还是确定的?而且因为\(x,y\)的关系,选奇数个时\(x\)就是\(xx|y\),否则\(x=xx\)。

我们枚举\(y\),再枚举\(\sim y\)的子集(要\(\&8191\))得到\(xx\)。(我也不知道怎么会想到用\(xx\)。。好神啊)

在DP的时候根据奇偶性把\(x\)转化出来就行了(得状态再\(\&(\sim y)\))。然后就可以同暴力直接转移。

状态数为\(O(3^{13})\)。

答案是\(f[n][status(0,0)][0]+\sum_s f[n][status(s,s)][1]\)。

复杂度也是\(O(n*3^{13})\)。

DP数组也要longlong(随机的话倒也爆不了int)。

id[][]按枚举顺序确定下标会快近一倍。

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define all 8191
#define cnt 1594323
typedef long long LL;
const int N=8192+3,M=1594323+3; int And[M],XX[M],id[N][N];
LL F[M][2],G[M][2]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int Init()
{
int n=0;
for(int y=0; y<=all; ++y)//y
{
int ss=(~y)&all;
for(int x=ss; ; x=(x-1)&ss)
{
id[y][x]=++n;
XX[n]=x, And[n]=y;
if(!x) break;
}
}
return n;
} int main()
{
// const int all=8191;
// const int cnt=1594323;
Init();
int n=read(); LL (*f)[2]=F,(*g)[2]=G;
f[id[all][0]][0]=1;
for(int i=1,ai; i<=n; ++i)
{
ai=read(), std::swap(f,g);
memcpy(f,g,sizeof F);//f[i][s]=f[i-1][s]
for(int j=1; j<=cnt; ++j)
for(int k=0; k<2; ++k)
{
if(!g[j][k]) continue;
int x=XX[j],y=And[j];
k && (x|=y);
x^=ai, y&=ai;
x&=(~y);
f[id[y][x]][k^1]+=g[j][k];
}
}
LL ans=f[id[0][0]][0];
for(int i=1; i<=cnt; ++i) if(!XX[i]) ans+=f[i][1];//x==y xx=0
printf("%lld\n",ans); return 0;
}

hihoCoder挑战赛19 A.Rikka with Sequence(状压DP)的更多相关文章

  1. Codeforces 895C - Square Subsets 状压DP

    题意: 给了n个数,要求有几个子集使子集中元素的和为一个数的平方. 题解: 因为每个数都可以分解为质数的乘积,所有的数都小于70,所以在小于70的数中一共只有19个质数.可以使用状压DP,每一位上0表 ...

  2. hihocoder #1608 : Jerry的奶酪(状压dp)

    题目链接:http://hihocoder.com/problemset/problem/1608 题解:就是一道简单的状压dp由于dfs过程中只需要几个点之间的转移所以只要预处理一下几个点就行. # ...

  3. HihoCoder - 1794:拼三角形 (状压DP)

    描述 给定 n 根木棍,第 i 根长度为 ai 现在你想用他们拼成尽量多的面积大于 0 的三角形,要求每根木棍只能被用一次,且不能折断 请你求出最多能拼出几个 输入 第一行一个正整数 n 第二行 n ...

  4. ZOJ3802 Easy 2048 Again (状压DP)

    ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  5. 状压dp大总结1 [洛谷]

    前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...

  6. 【BZOJ-1097】旅游景点atr SPFA + 状压DP

    1097: [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MBSubmit: 1531  Solved: 352[Submit][Sta ...

  7. CF453B Little Pony and Harmony Chest (状压DP)

    CF453B CF454D Codeforces Round #259 (Div. 2) D Codeforces Round #259 (Div. 1) B D. Little Pony and H ...

  8. HDU5731 Solid Dominoes Tilings 状压dp+状压容斥

    题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...

  9. Noip2016愤怒的小鸟(状压DP)

    题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...

随机推荐

  1. WPF复制异常问题(OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)))

    最近在维护WPF系统的时候发现的问题,刚刚开始自己的电脑都不能重现,后面写日志跟踪才发现问题的所在.问题主要是由于:1.   在程序访问剪切板的时候,有其他程序正在占用剪切板,导致自己的程序无法访问, ...

  2. Faster rcnn代码理解(4)

    上一篇我们说完了AnchorTargetLayer层,然后我将Faster rcnn中的其他层看了,这里把ROIPoolingLayer层说一下: 我先说一下它的实现原理:RPN生成的roi区域大小是 ...

  3. 移动端rem单位适配使用

    1.适配方法 //缩放比例!function(e,t){function i(){o=1,e.devicePixelRatioValue=o,s=1/o;var t=a.createElement(& ...

  4. C#使用RabbitMQ

    1. 说明 在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方, ...

  5. openwrt 分区

    下面以ar9344 16M flash为例子: uboot启动时传递给内核的参数为: bootargs=console=ttyS0,115200 root=31:02 rootfstype=jffs2 ...

  6. Android service与Thread

    很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

  7. 关于Java Web应用中的配置部署描述符web.xml

    一.web.xml概述 位于每个Web应用的WEB-INF路径下的web.xml文件被称为配置描述符,这个 web.xml文件对于Java Web应用十分重要,每个Java Web应用都必须包含一个w ...

  8. JS算法之二分查找

    二分查找法主要是解决「在一堆有序的数中找出指定的数」这类问题,不管这些数是一维数组还是 多维数组,只要有序,就可以用二分查找来优化. 二分查找是一种「分治」思想的算法,大概流程如下: 1.数组中排在中 ...

  9. Windows服务项目打包成安装包(Windows服务)-----------VS2017项目程序打包成.msi或者.exe

    VS2017项目程序打包成.msi或者.exe Windows服务项目使用VS2017项目程序打包成.msi或者.exe安装包 项目打包成安装包(Windows服务) 1.安装打包插件:Microso ...

  10. JFreeChart入门

    JFreeChart主要用来各种各样的图表,这些图表包括:饼图.柱状图(普通柱状图以及堆栈柱状图).线图.区域图.分布图.混合图.甘特图以及一些仪表盘等等 (源代码下载) 示例程序运用的jar包: j ...