标签:tab ++ htm 差分 集合 void 固定 编译 它的
题意:给出一个4*4的黑白棋盘,然后有一个骚操作:选择一个位置,是它和它的上下左右的四个格子的颜色取反。问最后达到全黑或全白状态的最小步数。
1).BFS计算出到达每种状态的最小步数。O(4*216)
2).刘汝佳先生书上的方法。
由于每一个位置最多只会被操作一次。(显然啦)
所以枚举第一行的那些位置被操作,然后后面每一行的操作就是要为了把上一行的异种颜色清干净。所以之后的操作是唯一固定,只需要判断到最后一行是否合法就好了。 O(2n*n2,可以处理更大的数据
并查集维护。
(为了加速,在函数前面写了inline,不仅没啥用,反而因为这个忘记写了函数类型(void,int、、、),cena编译不过。但我的dev是怎么编译过的,还那么正确的运行着???真的是凉了。)
但读入数据之大(9,000,000++),
scanf要7~8s,
普通读入优化要2~3s
只有写神级读入优化,只要0.8s,附上代码:
char gc(){ static char s[100005]; static int bit=100000,p,len; if(p>=len) len=fread(s,1,bit,stdin),s[len]=EOF,p=0; return s[p++]; } void read(ll &x){ static int f;static char ch; x=0; f=1; ch=gc(); while(ch<‘0‘||‘9‘<ch){if(ch==‘-‘)f=-1;ch=gc();} while(‘0‘<=ch&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=gc();} x=x*f; }
一个状压dp,维护出F[S],表示集合S的最大值
一个差分约束。
(原来相邻的两个点不一定要建边啊。是要看是否有隐含条件的。)
标签:tab ++ htm 差分 集合 void 固定 编译 它的
原文地址:http://www.cnblogs.com/zj75211/p/7811409.html