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,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...
随机推荐
- String、StringBilder和StringBuffer之间的区别
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- SDOI2016R1(不是解题报告)
话说洗澡的时候想了一堆要说的,坐到电脑前反而不知所措了-- 序章 听学长说他们都是省选一周前才停的课.然而我们这届--自聪哥韩大他们在省选两周前悄悄跑路后(据说班主任非常支持),信息小组内部一呼百应, ...
- device not managed by NetworkManager
Bringing up interface eth0:Error:Connection activation failed:Device not managed by NetworkManager ...
- cmd下并行执行appium +maven+Testng test
1: first: open two command wins to start appium: appium -p 4725 -bp 4726 -U EP7333W0UR appium -p 472 ...
- Hadoop每日一讨论整理版
这是我在几个QQ群发起的Hadoop每日一讨论小活动,每天中午2点左右发出一个关于Hadoop的知识片段,在此做一个整理. [每日一讨论]之计算框架(2013-5-21) 就计算框架而言,Hadoop ...
- js中的逻辑与(&&)与逻辑或(||)
var foo = 1; var bar = 0; var tar = false; var baz = 2; 一.js中的逻辑与(&&) 1.当第一个数为true时,返回第二个数: ...
- AutoEventWireup
Page_PreInit & OnPreInit - whats the difference? https://forums.asp.net/t/1095903.aspx?Page_PreI ...
- MYSQL初级学习笔记九:MySQL索引的使用!(视频序号:初级_51)
知识点十一:索引的使用(51) 什么是索引: 索引的定义: 在关系型数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行的更快.索引的作用相当于图书的目录,可以 根据目录中的页码 ...
- Ext js框架模拟Windows桌面菜单管理模板
一款超炫的后台,Ext模拟Windows桌面,Ext经典浅蓝风格,功能非常强大,包括最大化.最小化.状态栏.桌面图标等,不过需要非常懂Ext脚本的才可驾驭它. 1.图片 2. [代码][HTML] ...
- 一步一步学Silverlight 2系列(26):基本图形
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...