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】【随机化?/暴力小模拟】的更多相关文章

  1. 【模拟8.11】星空(差分转化,状压DP,最短路)

    一道很好的题,综合很多知识点. 首先复习差分:      将原来的每个点a[i]转化为b[i]=a[i]^a[i+1],(如果是求和形式就是b[i]=a[i+1]-a[i]) 我们发现这样的方便在于我 ...

  2. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  3. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  4. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  5. 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)

    传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...

  6. [CSP-S模拟测试]:点亮(状压DP+树上背包DP)

    题目传送门(内部题121) 输入格式 第一行,一个正整数$n$. 第二行,$n-1$个正整数$p_2,p_3,...,p_n$.保证$p_u$是在$1$到$u-1$中等概率随机选取的. 接下来$n$行 ...

  7. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  8. Light OJ 1011 - Marriage Ceremonies(状压DP)

    题目大意: 有N个男人,和N个女人要互相匹配,每个男人和每个女人有个匹配值. 并且匹配只能是1对1的. 问所有人都匹配完成,最大的匹配值是多少?   状压DP,暴力枚举就OK了, 这个题目略坑,因为他 ...

  9. 状压DP入门详解+题目推荐

    在动态规划的题型中,一般叫什么DP就是怎么DP,状压DP也不例外 所谓状态压缩,一般是通过用01串表示状态,充分利用二进制数的特性,简化计算难度.举个例子,在棋盘上摆放棋子的题目中,我们可以用1表示当 ...

  10. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

随机推荐

  1. 一篇不错的CUDA入门

    鉴于自己的毕设需要使用GPU CUDA这项技术,想找一本入门的教材,选择了Jason Sanders等所著的书<CUDA By Example an Introduction to Genera ...

  2. ES系列十三、Elasticsearch Suggester API(自动补全)

    1.概念 1.补全api主要分为四类 Term Suggester(纠错补全,输入错误的情况下补全正确的单词) Phrase Suggester(自动补全短语,输入一个单词补全整个短语) Comple ...

  3. 如何用enable_shared_from_this 来得到指向自身的shared_ptr 及对enable_shared_from_this 的理解

    在看<Linux多线程服务端编程:使用muduo C++网络库> 的时候,在说到如何防止在将对象的 this 指针作为返回值返回给了调用者时可能会造成的 core dump.需使用 ena ...

  4. oracle move 释放 表空间

    使用sqlplus 操作 alter table TEST_TB1 move storage(initial 64K); alter table TEST_TB1 move  ; select SEG ...

  5. sysbench安装、对Mysql压力测试、结果解读及mysql数据库跟踪优化

    sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. sysbench支持以下几种测试模式: 1.CPU运算性能 2.磁盘IO性能 3.调度程序性 ...

  6. 篮球弹起问题(for循环)

  7. 前端工程化之webpack中配置babel-loader(四)

    安装 安装:npm i -D babel-core babel-loader babel-plugin-transform-runtime 安装:npm i -D babel-preset-es201 ...

  8. C++ code:string stream(string流)

    如果有一个文件aaa.txt,有若干行,不知道每行中含有几个整数,要编程输出每行的整数之和,该如何实现? 由于cin>>不能辨别空格与回车的差异,因此只能用getline的方式逐行读入数据 ...

  9. 使用Struts,实现简单的登录

    一.新建项目Struts 1.右键 new————Web Project 2.点击项目——右键——myeclipse——add Struts Capabilities.....——选择struts2. ...

  10. javafx的scene大小不能在控制器中设置

    做个记录,备忘 遇到一个问题,点击提交,红色标识的VBox大小不能改变.问题如图,代码如下 点击后 fxml结构简化代码: 红色框体对应vboxMax <VBox fx:id="vbo ...