AtCoder Grand Contest 017 F - Zigzag
题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f
题目大意:
找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若\(a<b\),则设\(a_i\)表示\(a\)的二进制下第\(i\)位(从左往右)的数,有\(a_i\leqslant b_i,i\in[1,n]\)
现需要满足每个二进制数需要小于其之后的二进制数,并且给出一些性质,满足第\(A_j\)个二进制数的第\(B_j\)位(从左往右)必须要为\(C_i\),求方案数
显然是个DP题,考虑如何DP,我们首先可以想到状压每条路径,设\(f_{i,j}\)表示当前走完第\(i\)条路径,第\(i\)条路径的表示为\(j\),转移时直接枚举下一条路径,时间复杂度\(O(2^{2·N}·M)\),枚举子集优化可以为\(O(3^N·M)\),但无论如何都过不了
考虑优化,上一个DP做法的瓶颈在于需要枚举下一条路径的状态,我们考虑不枚举,直接从当前状态下手。设\(f_{i,j,k}\)表示当前正在走第\(i\)条路径,已经走了\(j\)步,目前能走的最靠左的路径状态为\(k\)
我们枚举第\(j+1\)步向哪边移动,如果要向左走,当前位置状态必须为\(0\);如果向右走,当前位置状态为\(1\)时直接走,如果当前位置状态不为零,就把后面位置的一个\(1\)挪到这里,用位运算可以做到\(O(1)\)转移,复杂度\(O(2^N·N·M)\)

(细线为原本路径,粗线为新路径,相当于将后面的一个\(1\)提前了)
/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
#define lowbit(x) ((x)&-(x))
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){
int x=0,f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline int read(){
int x=0,f=1; char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
const int p=1e9+7;
int f[2][(1<<20)+10],C[30][30];
int main(){
int n=read()-1,m=read(),k=read();
for (int i=1;i<=k;i++){
int x=read(),y=read(),z=read();
C[x][y-1]=z+1;
}
f[0][0]=1; int now=0;
for (int i=1;i<=m;i++){
for (int j=0;j<n;j++){
now^=1;
memset(f[now],0,sizeof(f[now]));
for (int s=0;s<1<<n;s++){
if (f[now^1][s]){
if (C[i][j]!=2&&((s>>j)&1)==0) f[now][s]=(f[now][s]+f[now^1][s])%p;
if (C[i][j]!=1){
int Ns=0;
if ((s>>j)&1) Ns=s;
else{
int tmp=((-1)^((1<<(j+1))-1))&s,Ds=!tmp?0:lowbit(tmp);
Ns=s^(1<<j)^Ds;
}
f[now][Ns]=(f[now][Ns]+f[now^1][s])%p;
}
}
}
}
}
int Ans=0;
for (int s=0;s<1<<n;s++) Ans=(Ans+f[now][s])%p;
printf("%d\n",Ans);
return 0;
}
AtCoder Grand Contest 017 F - Zigzag的更多相关文章
- AtCoder Grand Contest 017 (VP)
contest link Official Editorial 比赛体验--之前做题的时候感觉 AtCoder 挺快的,现在打了VP之后发现还是会挂的--而且不是加载缓慢或者载不出来,直接给你一个无法 ...
- AtCoder Grand Contest 017
noi前橙名计划失败.全程搞C而gg…… A - Biscuits 题意:背包,求价值为奇/偶的方案数. #include<cstdio> #include<queue> #i ...
- AtCoder Grand Contest 002 F:Leftmost Ball
题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...
- AtCoder Grand Contest 003 F - Fraction of Fractal
题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...
- AtCoder Grand Contest 011 F - Train Service Planning
题目传送门:https://agc011.contest.atcoder.jp/tasks/agc011_f 题目大意: 现有一条铁路,铁路分为\(1\sim n\)个区间和\(0\sim n\)个站 ...
- AtCoder Grand Contest 010 F - Tree Game
题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...
- AtCoder Grand Contest 016 F - Games on DAG
题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_f 题目大意: 给定一个\(N\)点\(M\)边的DAG,\(x_i\)有边连向\(y_i\) ...
- Atcoder Grand Contest 038 F - Two Permutations(集合划分模型+最小割)
洛谷题面传送门 & Atcoder 题面传送门 好久前做的题了--今天偶然想起来要补个题解 首先考虑排列 \(A_i\) 要么等于 \(i\),要么等于 \(P_i\) 这个条件有什么用.我们 ...
- Atcoder Grand Contest 015 F - Kenus the Ancient Greek(找性质+乱搞)
洛谷题面传送门 & Atcoder 题面传送门 一道难度 Au 的 AGC F,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...
随机推荐
- Mysql中show processlist结果中的status状态总结
一 般情况下,DBA能从监控mysql的状态列表中查看出数据库的运行端倪,需要注意的是STATUS所表示的不同内容.且需要注意的是TIME字段表示的 意思.它表示的只是最后那个STAT状态持续的时间. ...
- xcode编译 debug版或release 版
编译debug版本或release 版本 在Run和Stop按钮的右边有一个工程名 点击工程名,选择Manage Schemes 选择Edit... 左侧选择Run ProjectName.app 右 ...
- Vue 之 npm 及 安装的包
1 npm相关 1.1 npm 是 基于Node.js 的,所以要先安装Node.js 在浏览器地址栏输入https://nodejs.org/en/, 进入Node.js官网后,点击下载左边的稳定 ...
- UR#34. 多项式乘法
#34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+ ...
- [rabbitmq-discuss] Exactly Once Delivery
[rabbitmq-discuss] Exactly Once Delivery http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2010-A ...
- BZOJ2163: 复杂的大门
BZOJ2163: 复杂的大门 Description 你去找某bm玩,到了门口才发现要打开他家的大门不是一件容易的事……他家的大门外有n个站台,用1到n的正整数编号.你需要对每个站台访问一定次数以后 ...
- jquery1.9是最后支持IE678
bootstrap 需要 jquery 1.9.1或更高 jquery1.9是最后支持IE678
- ekhtml使用总结
ekhtml是一个高效SAX方式的HTML解析库. 文件说明 官网下载ekhtml-0.3.2.tar.gz文件解压后,内部包括源码.测试文件.文档.编译脚本等. 如需编译成静态库或动态库后进行集成, ...
- backface-visibility
浏览器支持 只有 Internet Explorer 10+ 和 Firefox 支持 backface-visibility 属性. Opera 15+.Safari 和 Chrome 支持替代的 ...
- python-day-9- 进程-异步IO\
本节内容 进程 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 多进程multiprocessing multiprocessing is a package that sup ...