【11.8校内测试】【倒计时2天】【状压DP】【随机化?/暴力小模拟】

Solution
数据范围疯狂暗示状压,可是一开始发现状态特别难受。
将每一层的奇偶性状压,预处理所有状态的奇偶性。每一层的输入代表的其实可以是下一层某个点可以被从这一层哪些点转移到。
所以枚举每个状态,再枚举下一层转移到哪个点,统计这个点被这个状态更新的话正边和反边分别的奇偶性,转移即可。
第二层和最后一层单独处理即可。
Code
#include<bits/stdc++.h>
#define mod 998244353
using namespace std; int x, dp[][( << )], pre[( << )], up[ << ], dn[ << ];
int m, k; int read () {
int x = , f = ; char c = getchar ();
while (!isdigit (c)) f |= (c == '-'), c = getchar ();
while (isdigit (c)) x = x * + c - '', c = getchar ();
return f ? -x : x;
} void init() {
for(int i = ; i < ( << k); i ++)
pre[i] = (i & ) ^ pre[i >> ];
} int main() {
freopen("adore.in", "r", stdin);
freopen("adore.out", "w", stdout);
scanf("%d%d", &m, &k);
int sta = ;
for(int i = ; i < k; i ++) {
x = read(), sta |= (x << i);
}
dp[][sta] = ; init();
int now = ;
for(int i = ; i < m - ; i ++) {
now ^= ;
memset(dp[now], , sizeof(dp[now]));
memset(up, , sizeof(up));
memset(dn, , sizeof(dn));
for(int u = ; u < k; u ++)
for(int v = ; v < k; v ++) {
x = read();
up[u] |= (x << v);////反边 u能被那些点更新过来
dn[v] |= (x << u);////正边
}
for(int s = ; s < ( << k); s ++)
if(dp[now ^ ][s]) {
int A = , B = ;
for(int j = ; j < k; j ++)
A |= ((pre[s & up[j]]) << j), B |= ((pre[s & dn[j]]) << j);
dp[now][A] = (dp[now][A] + dp[now ^ ][s]) % mod;
dp[now][B] = (dp[now][B] + dp[now ^ ][s]) % mod;
}
}
int st = ;
for(int i = ; i < k; i ++) x = read(), st |= (x << i);
int ans = ;
for(int s = ; s < ( << k); s ++)
if(!pre[st & s]) ans = (ans + dp[now][s]) % mod;
printf("%d", ans);
return ;
}


Solution
!!!原来是有$n+1$排!!是说为什么每次闪退QAQ
其实就是小模拟,直接三层for循环找到答案退出即可QAQ这个复杂度太有欺骗性了!!
其实随机搞更快???
Code
#include<bits/stdc++.h>
using namespace std; int n, t1, t2, num[];
string s;
bitset < > b[]; int main() {
freopen("confess.in", "r", stdin);
freopen("confess.out", "w", stdout);
srand(time());
scanf("%d", &n);
for(int i = ; i <= n; i ++) {
cin >> s;
int len = s.length();
for(int j = ; j < len; j ++) {
int a = s[j] - ;
for(int k = ; k >= ; k --)if(num[i]<(n<<)) b[i][++num[i]] = ((a >> k) & );
}
}
int cnt;
while() {
int i = rand() % (n + );
int j = rand() % (n + );
if(i == j) j ++;
if((b[i] & b[j]).count() >= (n / )) {
if(i > j) swap(i, j);
printf("%d %d", i+, j+); return ;
}
}
printf("NO Solution");
return ;
}
【11.8校内测试】【倒计时2天】【状压DP】【随机化?/暴力小模拟】的更多相关文章
- 【模拟8.11】星空(差分转化,状压DP,最短路)
一道很好的题,综合很多知识点. 首先复习差分: 将原来的每个点a[i]转化为b[i]=a[i]^a[i+1],(如果是求和形式就是b[i]=a[i+1]-a[i]) 我们发现这样的方便在于我 ...
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
- 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)
传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...
- [CSP-S模拟测试]:点亮(状压DP+树上背包DP)
题目传送门(内部题121) 输入格式 第一行,一个正整数$n$. 第二行,$n-1$个正整数$p_2,p_3,...,p_n$.保证$p_u$是在$1$到$u-1$中等概率随机选取的. 接下来$n$行 ...
- BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...
- Light OJ 1011 - Marriage Ceremonies(状压DP)
题目大意: 有N个男人,和N个女人要互相匹配,每个男人和每个女人有个匹配值. 并且匹配只能是1对1的. 问所有人都匹配完成,最大的匹配值是多少? 状压DP,暴力枚举就OK了, 这个题目略坑,因为他 ...
- 状压DP入门详解+题目推荐
在动态规划的题型中,一般叫什么DP就是怎么DP,状压DP也不例外 所谓状态压缩,一般是通过用01串表示状态,充分利用二进制数的特性,简化计算难度.举个例子,在棋盘上摆放棋子的题目中,我们可以用1表示当 ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
随机推荐
- 安装jdk的时候为什么会有两个jre文件
有些东西,你懂不懂其实并不太影响你干活,但有些人就是有疑惑就非得弄懂,不然浑身难受,我大概就是这种德性的.昨天安装javaSE的时候,看到jdk中有个jre文件夹,而根目录下又有个jre文件夹,非常困 ...
- (常用)re模块
re模块(正则)#re:一些带有特殊含义的符号或者符号的组合#为什么要用re:一堆字符串中找到你所需要的内容,过滤规则是什么样,通过re模块功能来告诉计算机你的过滤规则#应用:在爬虫中最为常用:使用爬 ...
- centos系统中perl进程病毒占用大量网络流量导致网络瘫痪的问题分析及解决方案
故障现象: 1.系统在早上9点的时候非常慢,单台服务器占用流量很大,使交换机流量被占满,而连累挂在同一交换机上的其他应用也无法提供服务,或者速度非常慢 2.通过查看进程发现大量的perl程序占 ...
- Ex 6_23 一个生产系统共包含n个顺序执行的阶段..._第七次作业
- Ex3_15 判断图是否是一个强连通分量 判断点是否在汇点强连通分量中_十一次作业
(a) 可以用图中的每一个顶点表示街道中的每个十字路口,由于街道都是单行的,所以图是有向图,若从一个十字路口都有一条合法的路线到另一个十字路口,则图是一个强连通图.即要验证的是图是否是一个强连通图. ...
- canvas图像裁剪、压缩、旋转
转载于:http://www.cnblogs.com/dailc/p/7843204.html 前言 前段时间遇到了一个移动端对图像进行裁剪.压缩.旋转的需求.考虑到已有各轮子的契合度都不高,于是自己 ...
- 一个简单 JDK 动态代理的实例
动态代理的步骤: 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法. 创建被代理的类和接口 通过 Proxy 的静态方法 newProxyInsat ...
- 对以内部 git 仓库为 composer 依赖的 package,加上版本号
现实问题 之前同事做了一个 composer package,做为公司大量 laravel 项目的通用模块. 但是,在实际使用中,每个项目对改 package 的依赖版本是有所不同的.否则 compo ...
- bzoj 2142
数论大集合 只要你做完了这道题,除了线性筛和降幂公式以外,所有数论noip知识点就都会了... 题意:求C(n,∑w)*C(∑w,w1)*C(∑w-w1,w2).....mod p(不保证p为质数) ...
- SPLAY,LCT学习笔记(一)
写了两周数据结构,感觉要死掉了,赶紧总结一下,要不都没学明白. SPLAY专题: 例:NOI2005 维修数列 典型的SPLAY问题,而且综合了SPLAY常见的所有操作,特别适合新手入门学习(比如我这 ...