洛谷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[ ...
随机推荐
- python——动态类型简介
动态类型简介 类型属于对象,而不是变量 每一个对象都有两个标准的头部信息:类型标志符和引用计数器. 对象的垃圾收集,就是通过引用计数器实现的.可以在脚本中任意使用对象而不需要考虑释放内存空间. 循环饮 ...
- python之模块导入和重载
模块导入和重载 模块导入通过import语句实现,但是在同一次会话中只运行一次. 若想要再次运行文件,调用imp标准库中的reload函数: >>> from imp import ...
- (+4)2.2UML建模图
①用例图 [用途]:帮助开发团队以一种可视化的方式理解系统的功能需求. 用例图所包含的元素如下: 1. 参与者(Actor) 表示与您的应用程序或系统进行交互的用户.组织或外部系统.用一个小人表示. ...
- 关于Block汇总
//使用总结: //1.当block里面会有b类相关的参数要回调回去的时候,属性用copy修饰,将其拷贝到堆里面,这样即便栈释放掉了,b类的指针也在堆中存在,能够成功的回调回去. //Block默认存 ...
- jQ&js给label
<strong>当前角色:</strong><label id="lblRoleName" style="margin-bottom: 0p ...
- mysql简单的增删改查
增加 MYSQL>insert into class (stu,name,age) values (1,'zhangsan',23);(回车) 另外,如果输入的是中文的话,在windows下可能 ...
- Java中的日期和时间
Java中的日期和时间 Java在java.util包中提供了Date类,这个类封装了当前的日期和时间. Date类支持两种构造函数.第一个构造函数初始化对象的当前日期和时间. Date() 下面的构 ...
- 使用maven时报错An error occurred while filtering resources
解决办法:右键项目-->maven-->update project .
- 报错 IllegalArgumentException occurred calling getter of cn.itcast.entity.Customer.cid
我碰到这个问题的时候,没有数据类型不匹配的情况,也没有表达无法向action传递数据的情况,一直报这样的错误,意思就是无法使用Customer中的get方法来赋值.完整报错如下所示: HTTP Sta ...
- js关闭浏览器窗口及检查浏览器关闭事件
js关闭浏览器窗口,不弹出提示框.支持ie6+,火狐,谷歌等浏览器,下面以一个示例为大家详细介绍下具体的实现方法,感兴趣的朋友可以参考下 js关闭浏览器窗口 js关闭浏览器窗口,不弹出提示框.支持 ...