BZOJ4000 [TJOI2015]棋盘
首先是状态压缩DP。。。
然后我们发现转移都是一样的。。。可以矩阵优化。。。
于是做完啦QAQQQ
题目读不懂?恩多读几遍就读懂了,诶诶诶!别打我呀!
- /**************************************************************
- Problem: 4000
- User: rausen
- Language: C++
- Result: Accepted
- Time:208 ms
- Memory:920 kb
- ****************************************************************/
- #include <cstdio>
- #include <cstring>
- #include <vector>
- using namespace std;
- typedef unsigned int uint;
- const int N = ;
- inline int read();
- int n, m, p, K, Mx;
- int a[N][N], f[N];
- vector <int> mp[];
- uint ans;
- struct mat {
- uint x[][];
- mat() {
- memset(x, , sizeof(x));
- }
- inline void one() {
- static int i;
- *this = mat();
- for (i = ; i < Mx; ++i) x[i][i] = ;
- }
- inline uint* operator [] (int t) {
- return x[t];
- }
- inline mat operator * (const mat &m) const {
- static mat res;
- static int i, j, k;
- res = mat();
- for (i = ; i < Mx; ++i)
- for (j = ; j < Mx; ++j)
- for (k = ; k < Mx; ++k)
- res[i][j] += x[i][k] * m.x[k][j];
- return res;
- }
- } A;
- inline mat pow(const mat& m, int y) {
- static mat x, res;
- x = m, res.one();
- int i, j;
- while (y) {
- if (y & ) res = res * x;
- x = x * x, y >>= ;
- }
- return res;
- }
- inline bool in(int x) {
- return <= x && x < m;
- }
- inline bool check(int s1, int s2) {
- static int i, j, t;
- for (i = ; i < m; ++i) if ((s1 >> i) & ) {
- for (j = ; j < mp[].size(); ++j)
- if (in(t = i + mp[][j]) && ((s1 >> t) & )) return ;
- for (j = ; j < mp[].size(); ++j)
- if (in(t = i + mp[][j]) && ((s2 >> t) & )) return ;
- }
- for (i = ; i < m; ++i) if ((s2 >> i) & ) {
- for (j = ; j < mp[].size(); ++j)
- if (in(t = i + mp[][j]) && ((s2 >> t) & )) return ;
- for (j = ; j < mp[].size(); ++j)
- if (in(t = i + mp[][j]) && ((s1 >> t) & )) return ;
- }
- return ;
- }
- int main() {
- int i, j;
- n = read(), m = read(), p = read(), K = read(), Mx = << m;
- for (i = ; i < ; ++i)
- for (j = ; j < p; ++j)
- if (read() && !(i == && j == K)) mp[i].push_back(j - K);
- for (i = ; i < Mx; ++i)
- for (j = ; j < Mx; ++j) A[i][j] = check(i, j);
- for (i = ; i < Mx; ++i) f[i] = bool(A[][i]);
- A = pow(A, n);
- for (i = ; i < Mx; ++i) ans += f[i] * A[i][];
- printf("%u\n", ans);
- return ;
- }
- inline int read() {
- static int x;
- static char ch;
- x = , ch = getchar();
- while (ch < '' || '' < ch)
- ch = getchar();
- while ('' <= ch && ch <= '') {
- x = x * + ch - '';
- ch = getchar();
- }
- return x;
- }
(p.s. 这道题是0开始标号的。。。注意了QAQQQ)
BZOJ4000 [TJOI2015]棋盘的更多相关文章
- BZOJ4000 TJOI2015棋盘(状压dp+矩阵快速幂)
显然每一行棋子的某种放法是否合法只与上一行有关,状压起来即可.然后n稍微有点大,矩阵快速幂即可. #include<iostream> #include<cstdio> #in ...
- [BZOJ4000][TJOI2015]棋盘(状压DP+矩阵快速幂)
题意极其有毒,注意给的行列都是从0开始的. 状压DP,f[i][S]表示第i行状态为S的方案数,枚举上一行的状态转移.$O(n2^{2m})$ 使用矩阵加速,先构造矩阵a[S1][S2]表示上一行为S ...
- BZOJ4000 [TJOI2015]棋盘 【状压dp + 矩阵优化】
题目链接 BZOJ4000 题解 注意题目中的编号均从\(0\)开始= = \(m\)特别小,考虑状压 设\(f[i][s]\)为第\(i\)行为\(s\)的方案数 每个棋子能攻击的只有本行,上一行, ...
- 【BZOJ4000】[TJOI2015]棋盘(矩阵快速幂,动态规划)
[BZOJ4000][TJOI2015]棋盘(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 发现所有的东西都是从\(0\)开始编号的,所以状压只需要压一行就行了. 然后就可以随意矩乘了. #in ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- [TJOI2015] 棋盘
Description 为了提高智商,ZJY去新世界旅游了.可是旅游过后的ZJY杯具的发现要打开通往原来世界的门,必须要解开门上面画的谜题.谜题是这样的:有个\(n\)行\(m\)列的棋盘,棋盘上可以 ...
- 【刷题】BZOJ 4000 [TJOI2015]棋盘
Description Input 输入数据的第一行为两个整数N,M表示棋盘大小.第二行为两个整数P,K, 表示攻击范围模板的大小,以及棋子在模板中的位置.接下来三行, 每行P个数,表示攻击范围的模版 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- TJOI2015 day2解题报告
TJOI2015终于写完啦~~~ T1:[TJOI2015]旅游 描述:(BZ没题面只能口述了..)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然 ...
随机推荐
- 【CC评网】2013.第38周 要阅读 要有好工具
要阅读,要有好工具 Reeder终于在ipad上推出了第二代版本,终于脱离了Google reader而独立存在: 自从Google reader关闭之后,我就在各种支持rss的阅读器中游荡,却总是找 ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- hdu 5950 Recursive sequence 矩阵快速幂
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- c 函数调用产生的汇编指令和数据在内存情况(2)
c 函数调用产生的汇编指令和数据在内存情况(1) 一直对函数调用的具体汇编指令和各种变量在内存的具体分配,一知半解.各种资料都很详细,但是不实践,不亲自查看下内存总不能笃定.那就自己做下. 两个目的: ...
- spring DI原理
什么是IOC? 也称依赖注入 当一个类,需要另一个类的时候,我们不需要再另一个类里进行创建 对象,spring容器会给我们自动的创建 IOC的实现? 通过一定的技术读取spring.xml文件信息,比 ...
- 初识redis——mac下搭建redis环境
一.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...
- MVC中Url请求与控制器的默认约定
1.请求的url如:http://localhost:52481/Home/Browse?genre=1控制器方法:public string Browse(string genre) //这里返回值 ...
- Monkey学习(1)环境搭建
环境搭建: Monkey程序由Android系统自带,需要配置J2SE平台的JDK,还需要配置Android平台的SDK. 1)下载和配置JDK 下载与安装JDK过程省略... 配置JDK环境变量,我 ...
- 路由器WAN端与LAN端的区别
路由器WAN端与LAN端的区别 WAN的全称为Wide Area Network,即广域网.而LAN的全称为Local Area Network,即局域网.WAN口主要用于连接外部网络,如ADSL.D ...
- Maven——eclipse中使用Maven创建Web项目
原文:http://www.cnblogs.com/xdp-gacl/p/4054814.html 一.创建Web项目 1.1 选择建立Maven Project 选择File -> New - ...