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,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...
随机推荐
- linux安装jdk tomcat nginx 以及常用命令
linux: 操作系统,应用服务器上 常用命令: cd 切换命令 cd / cd ~ cd ../../ cd xx ll 展示所有的文件 ll -h 友好的展示 mkdir 创建目录 mkdir 目 ...
- 杭电(hdu)1181 变形课
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submi ...
- Hadoop_stack_cmd
HDFS命令基本格式:Hadoop fs -cmd < args > HDFS命令基本格式:Hadoop fs -cmd < args > ls 命令 hadoop fs -l ...
- javascript数据基本类型和引用类型
JavaScript基本数据类型: js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值. ...
- HDU2255 奔小康赚大钱 【模板】 二分图完美匹配
基本概念 二分图有两个种点:X和Y.X与Y之间存在一些边,每个边有一个权值.现要求求一组X与Y间的通过边实现的一一匹配,使得得到的边权和最大. 总体过程 对每个X节点设置一个顶标Xl,初值为与X相邻的 ...
- XMU C语言程序设计实践(4)
以下实验二选一. 1.使用队列实现迷宫算法,找到最短路径. 2.实现顺序队列和链队列的所有基本操作,InitQueue(&Q):DestroyQueue(&Q):ClearQueue( ...
- Delphi语言最好的JSON代码库 mORMot学习笔记1(无数评论)
mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...
- HDU 1022 之 Train Problem I
Train Problem I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- POJ3258 River Hopscotch —— 二分
题目链接:http://poj.org/problem?id=3258 River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total ...
- os、sys和shutil模块
运行环境:python3 OS模块:os 模块提供了一个统一的操作系统的接口函数 下面的path指路径的意思 os.stat(file) #查询文件属性操作 os.sep #取代操作系统特定的路径分隔 ...