TopCoder[SRM587 DIV 1]:ThreeColorability(900)
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 |
|||||||||||||
|
|||||||||||||
Limits |
|||||||||||||
|
|||||||||||||
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) | |||||||||||||
|
|||||||||||||
1) | |||||||||||||
|
|||||||||||||
2) | |||||||||||||
|
|||||||||||||
3) | |||||||||||||
|
|||||||||||||
4) | |||||||||||||
|
题意:给定一个网格图,为每个格子安排对角线(有些格子已经安排好),使得新图可以被用三种颜色染色(被一条边相连的两个点不能染同一种颜色)。两种对角线用'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)的更多相关文章
- 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 ...
- TopCoder SRM 559 Div 1 - Problem 900 CircusTents
传送门:https://284914869.github.io/AEoj/559.html 题目简述: n个实心圆,两两没有交集,在第一个圆上找一个点,使得它到另外一个圆上某个点的最短距离的最小值尽量 ...
- TopCoder[SRM513 DIV 1]:Reflections(1000)
Problem Statement Manao is playing a new game called Reflections. The goal of the game is trans ...
- Topcoder SRM584 DIV 2 500
#include <set> #include <iostream> #include <string> #include <vector> using ...
- Topcoder SRM583 DIV 2 250
#include <string> #include <iostream> using namespace std; class SwappingDigits { public ...
- 【补解体报告】topcoder 634 DIV 2
A:应该是道语文题,注意边界就好: B:开始考虑的太复杂,没能够完全提取题目的思维. 但还是A了!我愚蠢的做法:二分答案加暴力枚举, 枚举的时候是完全模拟的,比如每次取得时候都是从大到小的去取,最后统 ...
- 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][ ...
- Topcoder SRM548 Div 1
1. KingdomAndTrees 给出n个数a[1..n],求一个数组b[1..n]满足b严格递增,且b[1]>=1. 定义代价为W = max{abs(a[i]-b[i])},求代价最小值 ...
- TopCoder SRM 701 Div2 Problem 900 ThueMorseGame(博弈+预处理)
题意 Alice和Bob在玩一个游戏,Alice先手. 每次一个人可以从一堆式子中拿走任意数量(不超过m)的式子. 取走最后一颗式子的人胜利. 当一个取完某一步的时候剩下的石子数量的二进制表示中1的 ...
随机推荐
- vue项目从0开始记录
1.安装vue-cli 2.通过脚手架进行项目的创建 4.配置第三方UI库快速开发(如ivew,element ui) 5.配置axios 库 一.安装vue-cli npm install - ...
- 1、Python 基础类型 -- Number 数字类型
一.Number
- JS数组 Array
1.创建数组 var array=new Array(); 2.添加数组 array.push("111"); array.push("111"); array ...
- SQL 循环语句几种写法
1.正常循环语句 declare @orderNum varchar(255)create table #ttableName(id int identity(1,1),Orders varchar( ...
- ac自动机fail树上按询问建立上跳指针——cf963D
解法看着吓人,其实就是为了优化ac自动机上暴力跳fail指针.. 另外这题对于复杂度的分析很有学习价值 /* 给定一个母串s,再给定n个询问(k,m) 对于每个询问,求出长度最小的t,使t是s的子串, ...
- web服务器环境搭建(及请求代理)
集成开发环境:(前端开发还是使用下面单独的web服务器比较好,前后端分离会用到代理的功能) 1.安装xampp时,软件会自动安装 微软的 Microsoft Visual C++ 2008 Redi ...
- homebrew -- mac os 系统下的 apt-get、yum
linux下有很方便的包管理器如:apt-get.yum,mac下也有类似的工具:Homebrew 和 Fink.MacPort.Flink是直接编译好的二进制包,MacPorts是下载所有依赖库的源 ...
- Linux上调试python程序
python -m pdb target.py
- mysql中explain详解
explain语法 有两种用法: 1.EXPLAIN tbl_name 2.EXPLAIN [EXTENDED] SELECT select_options 为了更好的说明它,我们需要建两张表, ...
- 【HDOJ】 P2054 A == B ?
题目意思不太多解释,具体WA的情况可以举出一下特例 0 +0 0.00 0 +1 -2 +1.00 -1.00 +.2 -.2 .0 .1 等等 不过可以发现对上面的数据处理,可以分为以下几步 1.找 ...