CF 778D Parquet Re-laying——构造
题目:http://codeforces.com/problemset/problem/778/D
完全没思路……就看了题解。
很好地思路是考虑操作可逆,所以起始状态和最终状态都变到一个中转状态,即都是横着的条,或者都是竖着的条。
比如要做成都是横着的条,考虑从左上到右下依次做好即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,lm=1e5,M=lm+;
int n,m,tot; bool fg;
char a[N][N],b[N][N];
struct Node{
int x,y;
Node(int x=,int y=):x(x),y(y) {}
}s[M],prn[M];
bool chk(int x,int y)
{
if(a[x][y]=='L'&&a[x+][y]=='L')return true;
if(a[x][y]=='U'&&a[x][y+]=='U')return true;
return false;
}
void rot(int x,int y)
{
s[++tot]=Node(x,y);
if(a[x][y]=='U')
{
a[x][y]=a[x+][y]='L';
a[x][y+]=a[x+][y+]='R';
}
else
{
a[x][y]=a[x][y+]='U';
a[x+][y]=a[x+][y+]='D';
}
}
void cz1()//horizenal
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j+=)
{
if(a[i][j]=='L')continue;
int x=i,y=j;
while(!chk(x,y))
{
if(a[x+][y+]=='L')
{rot(x,y+);break;}
x++;y++;
}
while()
{
rot(x,y); if(x==i)break;
rot(x-,y);x--;y--;
if(tot>lm){fg=;return;}
}
}
}
void cz2()
{
for(int i=;i<=n;i+=)
for(int j=;j<=m;j++)
{
if(a[i][j]=='U')continue;
int x=i,y=j;
while(!chk(x,y))
{
if(a[x+][y+]=='U')
{rot(x+,y);break;}
x++;y++;
}
while()
{
rot(x,y); if(x==i)break;
rot(x,y-); x--;y--;
if(tot>lm){fg=;return;}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%s",a[i]+);
for(int i=;i<=n;i++)
scanf("%s",b[i]+);
if((m&)==)cz1(); else cz2();
if(fg){puts("-1");return ;}
int ans=tot; tot=;
for(int i=;i<=ans;i++)prn[i]=s[i];
memcpy(a,b,sizeof b);
if((m&)==)cz1(); else cz2();
if(fg||ans+tot>lm){puts("-1");return ;}
for(int i=tot;i;i--)prn[++ans]=s[i];
printf("%d\n",ans);
for(int i=;i<=ans;i++)
printf("%d %d\n",prn[i].x,prn[i].y);
return ;
}
CF 778D Parquet Re-laying——构造的更多相关文章
- CodeForces 778D Parquet Re-laying 构造
题意: 有两个\(n \times m\)的矩阵\(A,B\),都是由\(1 \times 2\)的砖块铺成,代表初始状态和结束状态 有一种操作可以把两个砖块拼成的\(2 \times 2\)的矩形旋 ...
- cf 605B B. Lazy Student 构造 好题
题意: 一个n个节点的图,有m条边,已知这个图的一个mst 现在如果我们知道这个图的m条边,和知道mst的n-1条边是哪些,问能不能构造出一个满足条件的图 思路:排序+构造 数组deg[i]表示节点i ...
- CF C. Vladik and fractions——构造题
题目 构造一组 $x, y, z$,使得对于给定的 $n$,满足 $\frac{1}{x} + \frac{1}{y} + \frac{1}{z} = \frac{2}{n}$. 分析: 样例二已 ...
- CodeFirst 初恋
CodeFirst 初恋 原著:Prorgamming Entity Framework Entitywork Code First 大家好! 我是AaronYang,这本书我也挺喜欢的,看了一半了, ...
- 【AaronYang风格】第一篇 CodeFirst 初恋
原著:Prorgamming Entity Framework Entitywork Code First 大家好! 我是AaronYang,这本书我也挺喜欢的,看了一半了,今晚也没 ...
- BZOJ1086: [SCOI2005]王室联邦(贪心,分块?)
Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 2610 Solved: 1584[Submit][Status] ...
- CF #296 (Div. 1) B. Clique Problem 贪心(构造)
B. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- cf 323A A. Black-and-White Cube 立体构造
A. Black-and-White Cube time limit per test 1 second memory limit per test 256 megabytes input stand ...
- cf 323A A. Black-and-White Cube 立体构造 不知道为什么当k为奇数时构造不出来 挺有趣的题目吧
A. Black-and-White Cube time limit per test 1 second memory limit per test 256 megabytes input stand ...
随机推荐
- Spark SQL实战
一.程序 package sparklearning import org.apache.log4j.Logger import org.apache.spark.SparkConf import o ...
- 查看mysql 的版本信息
在进入mysql的情况下 在终端的情况下:
- unittest单元测试(简单算法题)
创建测试用例case.py文件 #创建类 class test (): def __init__(self,a,c): self.a =int(a) self.c =int (c) #加 def ad ...
- IOS-swift5.1快速入门之旅
快速之旅 传统表明,新语言中的第一个程序应在屏幕上打印“Hello,world!”字样.在Swift中,这可以在一行中完成: print("Hello, world!") // P ...
- 史上最全最常用的正则表达式(转自微信公众号:javascript)
很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下,在这里分享一下.给自己留个底,也给朋友们做个参考. ...
- 二维码生成器,基于python,segno库
import segno temp = input("Please enter value:") qr = segno.make(temp) qr.save("qrcod ...
- Tarjan(lca)
http://codevs.cn/problem/2370 / 2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描 ...
- TiKV集群配置记录
环境:两台ubuntu 18.04 pc tidb / pd: 192.168.1.150 tikv: 192.1681.1.151 主要参考https://pingcap.com/docs-cn/d ...
- 一个神奇却很简单的css特效
在网上看到一个前端大牛的主页,觉得他有一个特效特别酷,一开始还以为是要用什么javascript代码来实现,但仔细看一下,发觉只是用几行css代码就搞定了,我觉得挺好的. 他这个效果就是鼠标放在左半部 ...
- 记录使用node启用微信公众平台服务器配置
在微信公众平台的基本信息里面的,修改服务器配置后会有下面的界面. EncodingAESKey是随机生成的,加密方式根据需要自己选择. 关于URL和Token: URL:填写之后会向这个URL发送一个 ...