【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没错了. 根 ...
随机推荐
- gdb revert, Go to previous line in gdb
Yes! With the new version 7.0 gdb, you can do exactly that! The command would be "reverse-step& ...
- mysql安装与卸载(非绿色版)
一.安装和卸载 Mysql安装路径: C:\Program Files\MySQL\MySQL Server 5.5\ Mysql数据文件存放的路径: C:\Documents and Setting ...
- 5种PHP创建数组的方式
在PHP以及其他程序语言程序设计中,经常会用到数组的创建,在前端开发中,js的数组创建可以由[]和new Array()直接创建和赋值.然而PHP创建数组的方法有哪些呢?在查阅资料并且网上收集整理总结 ...
- 关卡得分(if 嵌套for)与(for嵌套if)
- ios 侧边手势滑动返回 禁用/开启 功能
// 禁用 返回手势 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureR ...
- Lavarel - 模块间复用代码
代码复用在项目中早晚会遇到,这不在用 Laravel 给博客增加 Feed 订阅功能 就到了需要将生成网页 description 的函数提取出来,在文章显示与 Feed 生成的两个 Controll ...
- Jquery----对文档操作
jquery对css操作: 1.CSS .css() - .css("color") -> 获取color css值 - .css("color", &q ...
- CSS 滤镜
声明: web前端学习笔记,欢迎大神指点.联系QQ:1522025433. CSS样式表是一种为超文本标签语言提供增强补充服务的技术,可对每一个html的标签做精雕细刻的修饰.只用html制作的网页, ...
- PyCharm更改字体和界面样式
更改主题 File → Settings → Appearance & Behavior → Appearance → Theme 结果: 更改字体大小 File → Settings → E ...
- Ckeditor一种很方便的文本编辑器
ckeditor官网:http://ckeditor.com/ 这里介绍ckeditor的其中一个的用法,自己做小项目练手非常的适合,上手非常的快. 首先去官网下载这个东西,链接:http://pan ...