等式
题号:NC15193
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

有一个长度为N的浮点数数组a,索引由0开始。

定义合法的等式有以下两种:

1.a[i]+a[j]=v 
2.a[i]-a[j]=v 

其中i,j是合法的索引值,v是整数。

定义一个等式的集合为合法的,当且仅当至少存在一种给数组a每个元素赋值的方式,使得集合内所有等式都成立。(等式的成立是数学意义上的成立,也就是假设运算没有浮点数误差的情况下也会成立)

现在有一个等式的集合E,起初为空集合。有M个询问,每次询问会给你一个合法的等式,请问你是否能把这个等式加进去E,使得E仍是合法的,若是合法的,就把此等式真的加进去E里。(此集合为多重集合(multiset),意即可存在重复的等式,所以加入集合里原本就有的等式也算合法的。)

并且全部询问结束后,请帮数组a所有元素赋值,使其满足E中所有等式,且元素中0的数量尽可能多,若0数量最多的赋值方式有很多种,输出任意一种皆可。

输入描述:

输入共有1+N行。
第1行有两个正整数,依序为N,M,分别代表阵列的大小,以及询问的个数。
第2~N+1行各包含一个等式,第1+i行的等式即为第i个询问要加进去E的等式。

输出描述:

输出共有1+N行。
第一行包含一个由'0'与'1'组成的长度为M的字串,若第i个元素为'1',代表第i个询问的等式能成功加进去E,否则第i个元素为'0'。
对于i在范围0~N-1,第2+i行包含一个浮点数,代表你赋予a[i]的值。
对于阵列a的赋值必须满足在所有合法情况中0的数量最多,若有多种0的数量最多的方式,输出任一种皆可。
示例1

输入

复制
2 4
a[0]+a[1]=2
a[1]-a[0]=1
a[0]-a[1]=-1
a[1]+a[0]=-1000

输出

复制
1110
0.5
1.5
示例2

输入

复制
4 2
a[0]+a[1]=2
a[1]+a[3]=2

输出

复制
11
0.0
2.0
0.0
0.0

备注:

2<=N<=5*105
1<=M<=106
等式的长像都如a[i]+a[j]=v或a[i]-a[j]=v,i,j,v为整数
0<=i,j<=v<=1000