Codeforces Round #199 (Div. 2) D. Xenia and Dominoes
把 'O' 看成 'X',然后枚举它的四个方向看看是否能放,然后枚举 $2^4$ 种可能表示每种方向是否放了,放了的话就标成 'X',就相当于容斥,对于新的图去dp。
dp就是铺地砖,行用二进制来表示是否放了砖块。
#include <bits/stdc++.h> const int MOD = 1e9 + ;
const int N = 1e4 + ;
const int dir[][] = {{, -}, {, }, {, }, {-, }};
int dp[N][ << ], n, sx, sy;
char s[][N];
int mp1[][N], mp[][N]; void M(int &a) {
if (a >= MOD) a -= MOD;
if (a < ) a += MOD;
} int get(int x) {
int cnt = ;
while (x) {
cnt++;
x &= (x - );
}
return cnt;
} int DP() {
for (int i = ; i < ; i++)
for (int j = ; j <= n; j++)
dp[j][i] = ;
dp[][] = ;
for (int i = ; i <= n; i++) {
int no = mp[][i] + mp[][i] * + mp[][i] * ;
for (int j = ; j < ; j++) {
if (j & no) continue;
dp[i][j | no] = dp[i - ][ - j];
if (j == || j == ) {
M(dp[i][j | no] += dp[i - ][]);
}
if (j == ) {
M(dp[i][j | no] += dp[i - ][]);
M(dp[i][j | no] += dp[i - ][]);
}
}
}
return dp[n][];
} int main() {
scanf("%d", &n);
for (int i = ; i < ; i++)
scanf("%s", s[i] + );
for (int i = ; i < ; i++)
for (int j = ; j <= n; j++)
if (s[i][j] == 'O')
sx = i, sy = j, mp1[i][j] = ;
else if (s[i][j] == 'X')
mp1[i][j] = ;
std::vector<int> vec;
for (int i = ; i < ; i++) {
bool flag = ;
int x = sx + dir[i][] * , y = sy + dir[i][] * ;
if (x >= && x < && y >= && y <= n) {
for (int j = ; j <= ; j++) {
if (mp1[sx + dir[i][] * j][sy + dir[i][] * j])
flag = ;
}
} else {
flag = ;
}
if (flag)
vec.push_back(i);
}
int S = << vec.size();
int ans = ;
for (int s0 = ; s0 < S; s0++) {
memcpy(mp, mp1, sizeof(mp));
for (int j = ; j < vec.size(); j++) {
int i = vec[j];
if (s0 >> j & ) {
for (int k = ; k <= ; k++) {
int x = sx + dir[i][] * k, y = sy + dir[i][] * k;
mp[x][y] = ;
}
}
}
int f = get(s0) & ? : -;
M(ans += f * DP());
}
printf("%d\n", ans);
return ;
}
Codeforces Round #199 (Div. 2) D. Xenia and Dominoes的更多相关文章
- Codeforces Round #199 (Div. 2) B. Xenia and Spies
B. Xenia and Spies time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #199 (Div. 2) E. Xenia and Tree
题目链接 2了,差点就A了...这题真心不难,开始想的就是暴力spfa就可以,直接来了一次询问,就来一次的那种,TLE了,想了想,存到栈里会更快,交又TLE了..无奈C又被cha了,我忙着看C去了.. ...
- Codeforces Round #199 (Div. 2) A Xenia and Divisors
注意题目的数字最大是7 而能整除的只有 1,2,3,4,6,故构成的组合只能是1,2,4 或1,2,6或1,3,6,故分别统计1,2,3,4,6的个数,然后再分配 #include <iostr ...
- 线段树 Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations
题目传送门 /* 线段树的单点更新:有一个交叉更新,若rank=1,or:rank=0,xor 详细解释:http://www.xuebuyuan.com/1154895.html */ #inclu ...
- Codeforces Round #199 (Div. 2)
A.Xenia and Divisors 题意:给定N个数,每个数的取值范围为1-7,N是3的倍数,判定是否能够恰好将N个数分成若干三元组,使得一个组中的元素a,b,c满足 a < b < ...
- Codeforces Round #199 (Div. 2) C. Cupboard and Balloons
C. Cupboard and Balloons time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations
D. Xenia and Bit Operations time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Codeforces Round #207 (Div. 1) B. Xenia and Hamming(gcd的运用)
题目链接: B. Xenia and Hamming 题意: 要求找到复制后的两个字符串中不同样的字符 思路: 子问题: 在两串长度是最大公倍数的情况下, 求出一个串在还有一个串中反复字符的个数 CO ...
- Codeforces Round #515 (Div. 3)
Codeforces Round #515 (Div. 3) #include<bits/stdc++.h> #include<iostream> #include<cs ...
随机推荐
- Nexus-vPC基础实验
一.实验拓扑: 由于条件有限,使用两个N5K做基本的vPC实验,Peer Keepalive Link使用的是两个Nexus 5K的Mgm0接口. 二.配置步骤:1.先构建vPC domain,并在d ...
- java 关于多层的异常捕获
从这两个源程序可以看出来,这里的逻辑其实很好理清楚. 可以看到,每次抛出了相同的错误,但因为catch后的捕捉类型不同,所以结果不同,其实可以看出多层的异常捕捉和正常的多层代码运行逻辑是基本一致的.
- 重新梳理IT知识之java-03循环
引用变量时要给变量赋值,如果循环进不去就会报错. 一.循环结构的四要素 1.初始化条件 2.循环条件 ---> 是Boolean类型 3.循环体 4.迭代条件 说明:通常情况下,循环结束都是因为 ...
- Java IO流详解(一)——简单介绍
文件在程序中是以流的形式来传输的.所以用Java来传输文件就得使用到Java IO流. 1.流的概念和作用 流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象<Thinkin ...
- Postgresql查询表和表结构
查询表名 SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' O ...
- 动态规划-爬楼梯问题java实现
最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...
- ubuntu 16.04 XDRP实现Windows远程访问
如何通过XDRP实现Windows远程访问 下面才是本文的重点,本文主要是讲xrdp在目前最新版Ubuntu 16.04下,如果实现Windows远程访问.网上也很多相关教程,但是都需要安装xfac4 ...
- 研究Zookeeper的原理(一)
阅读声明:以下内容是结合网上材料所写个人理解,如有不当,欢迎大家指正~~~谢谢 一.Zookeeper介绍 zookeeper,见名知意嘛,zoo动物园,keeper保持者.管理员,结合起来就是动物管 ...
- 07 DTFT
DTFT 连续时间傅里叶变换(CTFT) 连续时间傅里叶变换的定义为: \[ X(j\Omega)=\int_{-\infty}^{\infty}x_a(t)e^{-j\Omega t}dt \] 其 ...
- pymongo 用户密码连接
# db mongodbdb_mongo_attr = { 'host': '*', 'port': 27, 'database':'tease', 'username':'*v', 'passwor ...