Problem Statement

    

There is a H times W rectangle divided into unit cells. The rows of cells are numbered 0 to H-1 from top to bottom, and the columns are numbered 0 to W-1 from left to right. The corners of cells are called lattice points. By definition, there are (H+1)*(W+1) lattice points in our rectangle.

Each of the four edges of each cell is painted white. Additionally, in some cells exactly one of the two diagonals is painted white. In the remaining cells no diagonal is painted white yet. Later, you are going to paint exactly one of the diagonals white in each of these cells.

Once you are done painting the diagonals, your next goal will be to color each of the lattice points using one of three available colors: red, green, or blue. There is only one constraint: adjacent lattice points are not allowed to share the same color.

Two lattice points are called adjacent if they are connected by a white line segment. (In other words, consecutive corners of a cell are always adjacent, opposite corners of a cell are adjacent if and only if they are connected by a painted diagonal, and no other pairs of lattice points are adjacent.)

Obviously, you need to paint the missing diagonals in such a way that there will be a valid coloring of lattice points, if possible.

You are given a vector <string> cells with H elements, each consisting of W characters. If cells[i][j] is 'N', there is a diagonal line from the top left to the bottom right corner in the cell in row i, column j. If cells[i][j] is 'Z', there is a diagonal line from the top right to the bottom left corner in the cell in row i, column j. If cells[i][j] is '?', there is no diagonal yet in the cell in row i, column j.

If it is impossible to fill in the missing diagonals in such a way that there will be a valid coloring of all lattice points, return an empty vector <string>. Otherwise, return a vector <string> that represents the rectangle with all the missing diagonals filled in. I.e., the return value must be obtained from cells by replacing each '?' by either 'N' or 'Z'. The return value must represent a rectangle for which a valid coloring of its lattice points exists. If there are multiple possibilities, return the lexicographically smallest one.

Definition

    
Class: ThreeColorability
Method: lexSmallest
Parameters: vector <string>
Returns: vector <string>
Method signature: vector <string> lexSmallest(vector <string> cells)
(be sure your method is public)

Limits

    
Time limit (s): 2.000
Memory limit (MB): 64

Notes

- Given two different vector <string>s A and B with the same number of elements, find the smallest index i such that A[i] and B[i] differ. If A[i] < B[i] we say that A is lexicographically smaller than B and vice versa.

Constraints

- cells will contain between 1 and 50 elements, inclusive.
- Each element of cells will contain between 1 and 50 characters, inclusive.
- All elements of cells will contain the same number of characters.
- Each character of cells will be either 'N' or 'Z' or '?'.

Examples

0)  
    
{"Z"}
Returns: {"Z" }
The given rectangle and a possible coloring is as follows.

1)  
    
{"??", "?N"}
Returns: {"NN", "NN" }

2)  
    
{"ZZZ", "ZNZ"}
Returns: { }
 
3)  
    
{"N?N??NN","??ZN??Z","NN???Z?","ZZZ?Z??","Z???NN?","N?????N","ZZ?N?NN"}
Returns: { }
 
4)  
    
{"ZZZZ","ZZZZ","ZZZZ"}
Returns: {"ZZZZ", "ZZZZ", "ZZZZ" }
 

题意:给定一个网格图,为每个格子安排对角线(有些格子已经安排好),使得新图可以被用三种颜色染色(被一条边相连的两个点不能染同一种颜色)。两种对角线用'Z'与'N'表示。

题解:

画图找规律,可以发现,在相邻的四个格子中(即3*3的格点),'Z'的数量为偶数。

由此可以推得,在一个合法的图中,一行格子的对角线安排如果不与相邻的行完全相同,就与相邻的行完全相反。

即不管在哪一行,第i列与第j列格子对角线安排是否相同的关系都是一样的。

即我们可以用已知的每一行内的关系,通过并查集处理出第一行各格子的关系。

然后在满足原本安排方案的情况下,求出一种字典序最小的安排方案。

代码:

 int fa[],a[][],n,m;
int getf(int x)
{
if(fa[x]!=x)fa[x]=getf(fa[x]);
return fa[x];
}
int hb(int xx,int yy)
{
int x=getf(xx),y=getf(xx+m),z=getf(yy),w=getf(yy+m);
if((x==w)or(y==z))return ;
fa[x]=z; fa[y]=w; return ;
}
int qf(int xx,int yy)
{
int x=getf(xx),y=getf(xx+m),z=getf(yy),w=getf(yy+m);
if((x==z)or(y==w))return ;
fa[x]=w; fa[y]=z; return ;
}
int pd(char x)
{ if(x=='N')return ; if(x=='Z')return -; return ; }
class ThreeColorability
{
public:
vector <string> lexSmallest(vector <string> cells)
{
//$CARETPOSITION$
vector<string>ans;
n=cells.size(); m=cells[].size();
for(int i=;i<m;i++)fa[i]=i,fa[i+m]=i+m;
for(int i=;i<n;i++)
for(int j=;j<m-;j++)
if(cells[i][j]!='?')
{
for(int k=j+;k<m;k++)
if(cells[i][k]!='?')
{
int flag;
if(cells[i][j]==cells[i][k])flag=hb(j,k);else flag=qf(j,k);
if(flag==)return ans;
}
}
for(int j=;j<m;j++)
{
int t=pd(cells[][j]);
if(t!=)
{
int x=getf(j),y=getf(j+m);
for(int k=;k<m;k++)
{
if(getf(k)==x)a[][k]=t;else
if(getf(k)==y)a[][k]=-t;
}
}
}
for(int j=;j<m;j++)
if(a[][j]==)
{
int x=getf(j),y=getf(j+m);
for(int k=;k<m;k++)
{
if(getf(k)==x)a[][k]=;else
if(getf(k)==y)a[][k]=-;
}
}
for(int i=;i<n;i++)
{
int x=;
for(int j=;j<m;j++)if(pd(cells[i][j])!=)
{ if(pd(cells[i][j])==a[i-][j])x=;else x=-; break; }
if(x==){ if(a[i-][]==)x=;else x=-; }
for(int j=;j<m;j++)a[i][j]=a[i-][j]*x;
}
for(int i=;i<n;i++)
{
string s; s.clear();
for(int j=;j<m;j++)if(a[i][j]==)s=s+'N';else s=s+'Z';
ans.push_back(s);
}
return ans;
}
};

TopCoder[SRM587 DIV 1]:ThreeColorability(900)的更多相关文章

  1. TopCoder[SRM587 DIV 1]:TriangleXor(550)

    Problem Statement      You are given an int W. There is a rectangle in the XY-plane with corners at ...

  2. TopCoder SRM 559 Div 1 - Problem 900 CircusTents

    传送门:https://284914869.github.io/AEoj/559.html 题目简述: n个实心圆,两两没有交集,在第一个圆上找一个点,使得它到另外一个圆上某个点的最短距离的最小值尽量 ...

  3. TopCoder[SRM513 DIV 1]:Reflections(1000)

    Problem Statement      Manao is playing a new game called Reflections. The goal of the game is trans ...

  4. Topcoder SRM584 DIV 2 500

    #include <set> #include <iostream> #include <string> #include <vector> using ...

  5. Topcoder SRM583 DIV 2 250

    #include <string> #include <iostream> using namespace std; class SwappingDigits { public ...

  6. 【补解体报告】topcoder 634 DIV 2

    A:应该是道语文题,注意边界就好: B:开始考虑的太复杂,没能够完全提取题目的思维. 但还是A了!我愚蠢的做法:二分答案加暴力枚举, 枚举的时候是完全模拟的,比如每次取得时候都是从大到小的去取,最后统 ...

  7. Topcoder Srm627 DIV 2

    A,B:很水,注意边界,话说HACK都是这些原因. C: R[I][J]:表示反转I-J能改变冒泡排序的次数: DP方程:dp[i][k]=max(dp[j][k],dp[j][k-1]+dp[j][ ...

  8. Topcoder SRM548 Div 1

    1. KingdomAndTrees 给出n个数a[1..n],求一个数组b[1..n]满足b严格递增,且b[1]>=1. 定义代价为W = max{abs(a[i]-b[i])},求代价最小值 ...

  9. TopCoder SRM 701 Div2 Problem 900 ThueMorseGame(博弈+预处理)

    题意  Alice和Bob在玩一个游戏,Alice先手. 每次一个人可以从一堆式子中拿走任意数量(不超过m)的式子. 取走最后一颗式子的人胜利. 当一个取完某一步的时候剩下的石子数量的二进制表示中1的 ...

随机推荐

  1. 1、Python 基础类型 -- Number 数字类型

    一.Number

  2. Java 基础 - 基本类型 & 包装类型

    基本数据类型和包装类的区别 定义不同.包装类属于对象,基本数据类型不是 声明和使用方式不同.包装类使用new初始化,有些集合类的定义不能使用基本数据类型,例如 ArrayList<Integer ...

  3. Java刷题笔记

    能用StringBuffer的时候坚决不要用String,因为前者的时间和空间效率都更高. 牛顿法求平方根:随便找一个K,然后不断让 k=(k+x/k)/2;直到K的平方与x之间的差距小于限定值. 斐 ...

  4. python3 投票

    import urllib.request # cd C:\Python36-32\Scripts # pip install BeautifulSoup from bs4 import Beauti ...

  5. sql 基本查询

    要查询数据库表的数据,我们使用如下的SQL语句: SELECT * FROM <表名> 假设表名是students,要查询students表的所有行,我们用如下SQL语句: -- 查询st ...

  6. Service3

    RAID阵列概述• 廉价冗余磁盘阵列– 通过硬件/软件技术,将多个较小/低速的磁盘整合成一个大磁盘– 阵列的价值:提升I/O效率.硬件级别的数据冗余– 不同RAID级别的功能.特性各不相同 ##### ...

  7. BZOJ 4516: [Sdoi2016]生成魔咒(后缀数组)

    传送门 解题思路 题目其实就是动态维护本质不同的串的个数.考虑到只有加数字的操作,所以可以用后缀数组.题目是每次往后加数字,这样不好处理,因为每次加数字之后所有的后缀都会改变.所以要转化一下思路,就是 ...

  8. vc/atlmfc/include/afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT

    环境:win7,64位,vs2012 1> c:/program files/microsoft visual studio 8/vc/atlmfc/include/afx.h(24) : fa ...

  9. jQuery实用美化input 上传组建

     下载插件    (5)     简要教程 jquery-filestyle是一款可以简单实用的表单文件上传域美化jQuery插件.该插件可以将表单的文件上传域转换为类似Bootstrap按钮组的样式 ...

  10. D题 Robots 【期望】

    Robots Given a directed graph with no loops which starts at node 11 and ends at node nn.There is a r ...