洛谷P3585 [POI2015]PIE
题目大意:有个n*m的格子图,要求'x'点要被染成黑色
有个a*b的印章,'x'是可以染色的印章上的点。
要求用印章去染色格子
(1)印章不可以旋转。
(2)不能把墨水印到纸外面。
(3)纸上的同一个格子不可以印多次。
题解:模拟
从题目中可以看出,一定要让印章的左上角对应目前n*m方
格中未染色的左上角。因为要求不能重复染色,可以每染完
一个格子就把它赋值为0.(待染色为1)。
开始纯模拟,没有任何优化的代码。
加了个读入优化还是T了两个点,3000ms+
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1022
using namespace std;
int n,m,a,b,fa,fb,cnt,q;
int map[N][N],yz[N][N];
char s[N];
inline int read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
}
void init(){
memset(map,,sizeof(map));
memset(yz,,sizeof(yz));
cnt=;fa=;fb=;
}
bool check(int x,int y){
int xx=x-fa,yy=y-fb;
for(int i=;i<=a;i++){
for(int j=;j<=b;j++){
if(yz[i][j]==)continue;
int rx=xx+i,ry=yy+j;
if(rx<||ry<||rx>n||ry>m||map[rx][ry]==)return false;
map[rx][ry]=;cnt--;
}
}
return true;
}
int main(){
scanf("%d",&q);
while(q--){
init();bool flag=false;
// scanf("%d%d%d%d",&n,&m,&a,&b);
// n=read();m=read();a=read();b=read();
read(n);read(m);read(a);read(b);
for(int i=;i<=n;i++){
scanf("%s",s+);
for(int j=;j<=m;j++)
if(s[j]=='x')map[i][j]=,cnt++;
}
for(int i=;i<=a;i++){
scanf("%s",s+);
for(int j=;j<=b;j++){
if(s[j]=='.')continue;
if(!fa&&!fb)fa=i,fb=j;
yz[i][j]=;
}
}
for(register int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(map[i][j]){
if(check(i,j)==){
printf("NIE\n");
flag=true;break;
}
if(cnt==){
printf("TAK\n");
flag=true;break;
}
}
}
if(flag)break;
}
}
return ;
}
80
看了题解... 想到以前做靶型数独这个题,把未填数的格子放到一个结构体里。
w[i].x,w[i].y分别表示第i个没有填数格子的横纵坐标。
这样的好处是不用遍历整张图,就找到了没填数的格子。
这个题也是这样....
上面的代码不仅遍历了一遍要染色的图,还遍历了整个印章。
最差的情况是10^12...遍历要染色的10^6,印章10^6。
所以把要染色的点和能染色的点抽离出来,放到结构体里。
很好的一个优化,188ms。
ps:某一行后面+***,可以这样理解..
yz[1].x+xx=x,yz[1].y+yy=y.
说明印章的左上角的可以染色的点,要对应
n*m的棋盘要加xx和yy,那么其他可以染色的点也要加这两个数
来对应他们要染色的点。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1009
using namespace std;
int n,m,a,b,cnt_black,yz_black,q;
char s[N];
int map[N][N];
struct Make_Black{
int x,y;
}gz[N*N],yz[N*N];
bool check(int x,int y){
int xx=x-yz[].x,yy=y-yz[].y; //***
for(int i=;i<=yz_black;i++){
int nx=yz[i].x+xx,ny=yz[i].y+yy;
if(nx<||nx>n||ny<||ny>m||map[nx][ny]==)return false;
map[nx][ny]=false;
}
return true;
}
int main(){
scanf("%d",&q);
while(q--){
bool flag=false;
cnt_black=yz_black=;
scanf("%d%d%d%d",&n,&m,&a,&b);
memset(map,,sizeof(map));
for(int i=;i<=n;i++){
scanf("%s",s+);
for(int j=;j<=m;j++)
if(s[j]=='x'){
gz[++cnt_black].x=i;gz[cnt_black].y=j;
map[i][j]=true;
}
}
for(int i=;i<=a;i++){
scanf("%s",s+);
for(int j=;j<=b;j++)
if(s[j]=='x')yz[++yz_black].x=i,yz[yz_black].y=j;
}
for(int i=;i<=cnt_black;i++){
if(map[gz[i].x][gz[i].y])
if(check(gz[i].x,gz[i].y)==){
flag=true;
printf("NIE\n");break;
}
}
if(!flag)printf("TAK\n");
}
return ;
}
洛谷P3585 [POI2015]PIE的更多相关文章
- 洛谷 P3585 [POI2015]PIE
P3585 [POI2015]PIE 题目描述 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色.你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上 ...
- 洛谷P3582 [POI2015]KIN
题目描述 共有\(m\)部电影,编号为\(1--m\),第\(i\)部电影的好看值为\(w[i]\).在\(n\)天之中(从\(1~n\)编号)每天会放映一部电影,第\(i\)天放映的是第\(f[i] ...
- BZOJ 4385 洛谷3594 POI2015 WIL-Wilcze doły
[题解] 手残写错调了好久QAQ...... 洛谷的数据似乎比较水.. n个正整数!!这很重要 这道题是个类似two pointer的思想,外加一个单调队列维护当前区间内长度为d的子序列中元素之和的最 ...
- 洛谷 P3586 [POI2015]LOG
P3586 [POI2015]LOG 题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它 ...
- 洛谷P3588 - [POI2015]Pustynia
Portal Description 给定一个长度为\(n(n\leq10^5)\)的正整数序列\(\{a_n\}\),每个数都在\([1,10^9]\)范围内,告诉你其中\(s\)个数,并给出\(m ...
- 洛谷P3588 [POI2015]PUS
题面 sol:说了是线段树优化建图的模板... 就是把一整个区间的点连到一个点上,然后用那个点来连需要连一整个区间的点就可以了,就把边的条数优化成n*log(n)了 #include <queu ...
- 洛谷P3586 [POI2015]LOG(贪心 权值线段树)
题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...
- 洛谷P3588 [POI2015]PUS(线段树优化建图)
题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...
- BZOJ 3747 洛谷 3582 [POI2015]Kinoman
[题解] 扫描线+线段树. 我们记第i部电影上次出现的位置是$pre[i]$,我们从$1$到$n$扫描,每次区间$(pre[i],i]$加上第i部电影的贡献$w[f[i]]$,区间$[pre[pre[ ...
随机推荐
- jQuery/CSS3 3D焦点图动画
在线演示 本地下载
- HTML5/CSS3实现图片倒影效果
在线演示 本地下载
- 20162305 实验二 Java面向对象程序设计 实验报告
20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...
- 前端开发日记之jQuery
优先引入CDN上的jQuery,如果失效再引入本地的jQuery! <script src="http://libs.baidu.com/jquery/1.11.1/jquery.js ...
- [ SSH 两种验证方式原理 ]
SSH登录方式主要分为两种: 1. 用户名密码验证方式 说明: (1) 当客户端发起ssh请求,服务器会把自己的公钥发送给用户: (2) 用户会根据服务器发来的公钥对密码进行加密: (3) 加密后的信 ...
- 使用Selenium通过浏览器对网站进行自动化测试和相关问题
使用Selenium通过浏览器对网站进行自动化测试 自动化测试概念: 一般是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件. 广义上来讲 ...
- nyoj-1316-二分
acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1316题目链接 Interval 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描 ...
- elementUI表格合并单元格
相信你肯定看了 ElementUI 官方文档了,没看的话先去看下表格各个属性的意义,方便下文阅读:传送门 但你会发现此例过于简单,死数据,但我们开发的时候往往都是后台传递过来的数据,导致我们 rows ...
- 【牛客练习赛12-B】迷宫(BFS)
链接:https://www.nowcoder.net/acm/contest/68/B 题目描述 这是一个关于二维迷宫的题目.我们要从迷宫的起点 'S' 走到终点 'E',每一步我们只能选择上下左右 ...
- ARM体系结构总结
特殊功能寄存器与外设绑定,通用寄存器是与CPU绑定. ARM是RISC架构 常用ARM汇编指令只有二三十条 ARM是低功耗CPU ARM的架构非常适合单片机.嵌入式.尤其是物联网领域:而服务器等高性能 ...