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的 ...
随机推荐
- php获取微信openid
使用微信接口,无论是自动登录还是微信支付我们首先需要获取的就是openid,获取openid的方式有两种,一种是在关注的时候进行获取,这种订阅号就可以获取的到,第二种是通过网页授权获取,这种获取需要的 ...
- Go: Println 与 Printf 的区别
Go 学习笔记:Println 与 Printf 的区别,以及 Printf 的详细用法 2017-12-19 15:39:05 zgh0711 阅读数 26255更多 分类专栏: Go 版权声明 ...
- 【索引】位图BitMap索引
位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为ta ...
- drag事件
<!DOCTYPE HTML><html> <head> <title>拖动事件</title> <style> ...
- php开发面试题---2、php常用面试题二(表单提交方式中的get和post有什么区别)
php开发面试题---2.php常用面试题二(表单提交方式中的get和post有什么区别) 一.总结 一句话总结: 数据位置:get参数在url里面,post在主体里面 数据大小:get几kb,pos ...
- C++中调用OC代码
前言 最近项目中为了方便维护,底层统一使用C++编写.由于是项目是做屏幕共享sdk,所以只能底层的压缩.编解码使用C++,屏幕捕获部分Mac和win就自己实现了.那么问题就来了,因为是面向接口编程,所 ...
- JAVA学习之跨平台性
Java语音的特点:跨平台性什么是跨平台性通过Java语音编写的应用程序再不同的系统平台上都可以运行. 原理是什么只要在需要运行Java应用程序的操作系统上.先安装一个Java虚拟机(JVM Java ...
- 3、第一个Appium测试
运行脚本前环境准备: 1.IDE,推荐使用IJ 2.安装jdk环境,推荐>1.8 3.准备一台真机或者模拟器 4.SDK 5.maven环境 项目目录: CalculatorTest.java文 ...
- cesium相关学习网址
cesium相关学习网址: cesium资料大全网址:https://www.cnblogs.com/cesium1/p/10062942.html http://192.168.101. ...
- 网络编程(二)——TCP协议、基于tcp协议的套接字socket
TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...

