传送门

题目大意:有个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的更多相关文章

  1. 洛谷 P3585 [POI2015]PIE

    P3585 [POI2015]PIE 题目描述 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色.你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上 ...

  2. 洛谷P3582 [POI2015]KIN

    题目描述 共有\(m\)部电影,编号为\(1--m\),第\(i\)部电影的好看值为\(w[i]\).在\(n\)天之中(从\(1~n\)编号)每天会放映一部电影,第\(i\)天放映的是第\(f[i] ...

  3. BZOJ 4385 洛谷3594 POI2015 WIL-Wilcze doły

    [题解] 手残写错调了好久QAQ...... 洛谷的数据似乎比较水.. n个正整数!!这很重要 这道题是个类似two pointer的思想,外加一个单调队列维护当前区间内长度为d的子序列中元素之和的最 ...

  4. 洛谷 P3586 [POI2015]LOG

    P3586 [POI2015]LOG 题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它 ...

  5. 洛谷P3588 - [POI2015]Pustynia

    Portal Description 给定一个长度为\(n(n\leq10^5)\)的正整数序列\(\{a_n\}\),每个数都在\([1,10^9]\)范围内,告诉你其中\(s\)个数,并给出\(m ...

  6. 洛谷P3588 [POI2015]PUS

    题面 sol:说了是线段树优化建图的模板... 就是把一整个区间的点连到一个点上,然后用那个点来连需要连一整个区间的点就可以了,就把边的条数优化成n*log(n)了 #include <queu ...

  7. 洛谷P3586 [POI2015]LOG(贪心 权值线段树)

    题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...

  8. 洛谷P3588 [POI2015]PUS(线段树优化建图)

    题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...

  9. BZOJ 3747 洛谷 3582 [POI2015]Kinoman

    [题解] 扫描线+线段树. 我们记第i部电影上次出现的位置是$pre[i]$,我们从$1$到$n$扫描,每次区间$(pre[i],i]$加上第i部电影的贡献$w[f[i]]$,区间$[pre[pre[ ...

随机推荐

  1. winform webbrowser禁用网页target=blank

    /// <summary> /// 屏蔽target=_blank 的弹出窗口 /// </summary> /// <param name="sender&q ...

  2. Go语言学习之常量(The way to go)

    生命不止,继续go go go . 上一篇博客<Go语言学习之变量(The way to go)介绍了go中的变量,今天就介绍常量. const关键字 跟c++中一样,go中同样具有const关 ...

  3. 查看linuxCPU信息

    linux 下查看机器是cpu是几核的 几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu ...

  4. 20 个 OpenSSH 最佳安全实践

    来源:https://linux.cn/article-9394-1.html OpenSSH 是 SSH 协议的一个实现.一般通过 scp 或 sftp 用于远程登录.备份.远程文件传输等功能.SS ...

  5. Spring注解(环境)

    以数据库为例: 引入 c3p0数据源maven坐标 数据库驱动 @Configuration @PropertySource("classpath:/db.config.properties ...

  6. [LnOI2019]加特林轮盘赌(DP,概率期望)

    [LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...

  7. Jquery.LazyLoad.js实现图片延迟加载功能

    从网上下载来的版本多多少少都有些BUG,尤其是加载后在IE6和IE7下图片闪动是个大问题,在网上查了很久,也没有找到相关的解决方案.没解决方案,就得发挥咱DIY的精神,自己想法解决,分析了BUG,理了 ...

  8. HIVE 编写自定义函数UDF

    一 新建JAVA项目 并添加 hive-exec-2.1.0.jar 和hadoop-common-2.7.3.jar hive-exec-2.1.0.jar 在HIVE安装目录的lib目录下 had ...

  9. SSO 证书配置

    ssodev.crt为开发环境证书ssotest.crt为测试环境证书 将证书拷贝到目录:{JDK}\jre\lib\security 其中 {JDK} 是实际安装JDK的位置.然后cmd进入命令窗口 ...

  10. pyCharm上解决安装不上pandas库问题

    最近在PyCharm上安装pandas库的时候,总是安装不上,提示好像是pip除了错误.我使用的是python .4版本.最后判断应该是自己pip版本应该太旧了,最后再cmd更新了pip之后就行了.如 ...