题目描述

给定一个n × m的矩形地图,每个各自上可能为空,可能有牌,牌上有一个数字。

对于两张同样数字的牌,如果我们可以在地图上用不超过三根水平或竖直,在地图界内,且不经过其他牌的线段将两张牌连起来,那么我们这一对牌是可以被消去的。

比如下图中,两张1可以被消去,但是2和3都不能被消去。 

现在给出一个n × m的连连看地图,其中有2k张牌,保证每张牌上的数字都在[1, k]范围内,且每个数字都只会出现两次,问目前有多少对牌是可以消去的。

输入输出格式

输入格式:

输入第一行三个正整数n, m, k,分别代表地图的长,宽以及牌的对数。

接下来k行每行四个正整数x1 , y1 , x2 , y2,表示数字为k的两张牌的位置。

输出格式:

输出仅一行一个整数,表示当前可以消去的牌的对数

输入输出样例

输入样例#1: 复制

3 3 3
1 3 2 2
1 1 3 3
1 2 2 1

输出样例#1: 复制

1

说明

30%的数据 n, m≤ 20,k<=min(3, ⌊ n*m/2 ⌋)

接下来30%的数据 n, m≤ 100,k<=min(100, ⌊ n*m/2 ⌋)

接下来30%的数据 n, m≤ 1000,k<=min(5000, ⌊ n*m/2 ⌋)

题解


考虑数据范围很小,我们可以做各种n方操作。

读入的同时把相应坐标标记

    flag[ i ] [ j ]=1;

套两个for循环,分别求横排上的前缀和 及竖排上的前缀和

    for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)ss[i][j]=ss[i-1][j]+tu[i][j],hs[i][j]=hs[i][j-1]+tu[i][j];

对于每组牌:

我们把一张牌分别向上下左右暴力走,走到边界或障碍就停,经过的点就标记。(画十字)

|____________|
|      O     |
|      |  O  |
|      |     |
|   O——O————O|
|      |     |
|      |     |
|  O   |     |
|______|_____|

然后把第二张牌也上下左右暴力走,同样经过则标记。如果有到被标记过的点,说明路线相交了,这对牌可消,flag=1

若未相交:

从1~n枚举横坐标j,如果这一段(< x1 , j >点到 < x2 , j >点)上的区间和为0
且< x1 , j >点和< x2 , j >点被标记过(画十字的时候经历过)的话(用前缀和O(1)查询)
则这一段没有障碍,可以连线,flag=1

从1~n枚举纵坐标i,如果< i , y1 >点到< i , y2 >上的区间和为0,则可连,flag=1

最后如果flag为1,则ans++

代码://考场代码

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 using namespace std;
 7 inline int read()//快读
 8 {
 9     char ch=getchar();
10     int x=0;bool s=1;
11     while(ch<'0'||ch>'9'){if(ch=='-')s=0;ch=getchar();}
12     while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
13     return s?x:-x;
14 }
15 int lx[5007],ly[5007],rx[5007],ry[5007];
16 int ss[1007][1007];
17 int hs[1007][1007];
18 bool tu[1007][1007];
19 bool sf[1007][1007];
20 int main()
21 {
22     int n=read(),m=read(),k=read();
23     for(int i=1;i<=k;++i)
24     {
25         lx[i]=read(),
26         ly[i]=read(),
27         rx[i]=read(),
28         ry[i]=read();
29         tu[lx[i]][ly[i]]=1;
30         tu[rx[i]][ry[i]]=1;//标记
31     }
32     for(int i=0;i<=n+1;++i)
33     tu[i][0]=tu[i][m+1]=1;
34     for(int i=0;i<=m+1;++i)
35     tu[0][i]=tu[n+1][i]=1;
36     for(int i=1;i<=n;++i)
37     for(int j=1;j<=m;++j)
38     ss[i][j]=ss[i-1][j]+tu[i][j],
39     hs[i][j]=hs[i][j-1]+tu[i][j];//前缀和
40     int ans=0;
41     for(int c=1;c<=k;++c)
42     {
43         int flag=0;
44         memset(sf,0,sizeof(sf));
45         //以下一大堆为画十字
46         tu[lx[c]][ly[c]]=0;
47         tu[rx[c]][ry[c]]=0;//便于之后操作
48         int x=lx[c],y=ly[c];
49         int l,r,u,d;
50         while(!tu[x][y]){sf[x--][y]=1;}
51         u=x+1;
52         x=lx[c]+1,y=ly[c];
53         while(!tu[x][y]){sf[x++][y]=1;}
54         d=x-1;
55         x=lx[c],y=ly[c]-1;
56         while(!tu[x][y]){sf[x][y--]=1;}
57         l=y+1;
58         x=lx[c],y=ly[c]+1;
59         while(!tu[x][y]){sf[x][y++]=1;}
60         r=y-1;
61         x=rx[c],y=ry[c];
62         while(!tu[x][y]){if(sf[x][y])flag++;sf[x--][y]=1;}
63         u=max(u,x+1);
64         x=rx[c]+1,y=ry[c];
65         while(!tu[x][y]){if(sf[x][y])flag++;sf[x++][y]=1;}
66         d=min(d,x-1);
67         x=rx[c],y=ry[c]-1;
68         while(!tu[x][y]){if(sf[x][y])flag++;sf[x][y--]=1;}
69         l=max(l,y+1);
70         x=rx[c],y=ry[c]+1;
71         while(!tu[x][y]){if(sf[x][y])flag++;sf[x][y++]=1;}
72         r=min(r,y-1);
73         //画十字结束
74         if(!flag)
75         {
76             int zx=lx[c],zy=ly[c],yx=rx[c],yy=ry[c];
77             if(zx>yx)swap(zx,yx);
78             if(zy>yy)swap(zy,yy);
79             for(int i=u;i<=d;++i)//枚举横坐标
80             if(hs[i][yy]-hs[i][zy-1]==0)flag++;
81             for(int j=l;j<=r;++j)//枚举纵坐标
82             if(ss[yx][j]-ss[zx-1][j]==0)flag++;
83         }
84         if(flag)ans++;
85         tu[lx[c]][ly[c]]=1;
86         tu[rx[c]][ry[c]]=1;//复原
87         //cout<<flag<<endl;
88     }
89     cout<<ans;//强大怪!!!
90     return 0;
91 }

//强大怪!!!(滑稽

转载于:https://www.cnblogs.com/qwerta/p/9379745.html

「HNSDFZ暑期集训 测试1」「LuoguT36488」 连连看相关推荐

  1. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  2. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  3. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  4. #6029. 「雅礼集训 2017 Day1」市场(势能,区间除)

    #6029. 「雅礼集训 2017 Day1」市场 用线段树维护数列,区间上维护最大最小值,区间和还有标记,修改时,区间加直接做,而区间除时,递归到线段树上某一区间,如果这一操作等价于区间加(也就是最 ...

  5. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...

  6. 普通话测试第四题评分标准_2017年普通话水平测试评分细则「详细版」

    2017年普通话水平测试评分细则「详细版」 普通话是现代汉语的标准语.由国家语言文字工作委员会和国家教育委员会.广播电影电视部颁布的,<普通话水平测试等级标准(试行)>.以下是小编整理的2 ...

  7. 先让爸爸做做测试,再送他父亲节礼物「Scratch单项选择题实现鼠标+键盘操作」

    ​一份问卷调查,期待听到您的声 在我们的语境里,说起父亲,能想到的形容词有哪些? 高大.沉默.严厉.深沉.忙碌-- 孩子读懂父亲,意味着成熟. 父亲节到了,学编程的孩子们准备给父亲送一件什么礼物呢? ...

  8. LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】

    6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...

  9. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

最新文章

  1. 浅谈Chatbot的架构模型和响应机制
  2. 一句话说清分布式锁,进程锁,线程锁
  3. java 输出_使用IntelliJ IDEA2020.2.2 x64新建java项目并且输出Hello World
  4. 贝叶斯分类器期望损失函数理解及衍生的全新理解
  5. android新年祝福代码,讯飞输入法发布Android新春版 Biu一下敲出美好祝愿!
  6. Linux下自动化测试环境的搭建
  7. 同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO
  8. 华为盒子显示未连接服务器,华为盒子 连接服务器地址
  9. PLC供电系统电源模块的选择
  10. 数据库SQL语句学习
  11. macOS下快速复制文件或文件夹路径
  12. Java-斗地主游戏(部分功能)
  13. 7 11 藏尾诗c语言,为你写诗:11种杂体诗,汉语太神奇
  14. Can't locate Tk.pm
  15. maven java版本过低_maven项目编译运行时提示jdk版本过低问题解决方法
  16. 常见图片格式jpg、jpeg、png、gif等之间的区别
  17. excel函数提取计算机登录名,EXCEL常用函数应用实例:如何提取姓名中的姓
  18. 个性化消费时代,品牌聚焦新趋势
  19. 江西师范大学 数据库MySQL 上机期末考试
  20. 使用Jenkins Pipeline插件和Docker打造容器化构建环境

热门文章

  1. html中斜体样式怎么写,css font-style字体斜体样式
  2. 为什么要用java股票交易接口?
  3. 浏览器是如何验证HTTPS证书合法性的?
  4. sqlite expert 教程
  5. 微机原理与接口技术[第三版]——第五章课后习题答案
  6. Yii2邮箱发送与配置
  7. 2014年计算机考研,2014年计算机考研大纲
  8. nexus 私服 提示磁盘空间不足
  9. Android Studio 安装与配置
  10. WebView无法调起支付宝,显示alipays://platformapi/startApp ERR_UNKNOWN_URL_SCHEME