题(NOIP模拟赛Round #10)
题目描述:
有一张的地图,其中
的地方是墙,
的地方是路。有两种操作:
给出
个地点,询问这
个地点中活动空间最大的编号。若询问的位置是墙,则活动空间为
;否则活动空间为询问地点通过四联通能到达的点的个数。如果有多个位置均为最大,输出给出顺序较前的那个。编号为
- 给出
个地点,按照读入的顺序翻转这
个地点的地形。即若原位置是墙,则该位置变为路;若原位置是路,则该位置变为墙。保证在将路变为墙时不会将一个区域分割,也不会将一个只有一格的区域填满。
保证每次操作只会询问或修改同一个位置至多一次。
————————————————我是分割线————————————————
首先我们先将一块连通的区域变为一个点,便于处理
接着我们来看修改操作:
如果一个点本来不联通,变成了连通,我们就有可能遇到两个区域连通的情况,所以我们要用并查集处理合并操作,并且合并的点不能在原图之上,要新开一个点。
但如果一个点变成墙,我们先将这个点所属的区块的压缩点的值-1,然后将这个点所属的区块设为0即可
#include<cstdio>
#include<cstring>
#define MN 1000005
using namespace std;
char ch;
int n,m,cnt,q;
bool map[MN];
int d[MN],sm[MN*],f[MN*];
void solve(int x,int y){
if(!map[(x-)*m+y]||d[(x-)*m+y])return;
++sm[d[(x-)*m+y]=cnt];
if(x>)solve(x-,y);
if(x<n)solve(x+,y);
if(y>)solve(x,y-);
if(y<m)solve(x,y+);
}
int getfa(int x){return f[x]?f[x]=getfa(f[x]):x;}
void merge(int x,int y,int xx,int yy){
if(!map[(xx-)*m+yy]||getfa(d[(x-)*m+y])==getfa(d[(xx-)*m+yy]))return;
sm[getfa(d[(xx-)*m+yy])]+=sm[getfa(d[(x-)*m+y])];
sm[getfa(d[(x-)*m+y])]=;
f[getfa(d[(x-)*m+y])]=getfa(d[(xx-)*m+yy]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%c",&ch);
for(int j=;j<=m;j++){
scanf("%c",&ch);
if(ch=='*')map[(i-)*m+j]=false;
else map[(i-)*m+j]=true;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(map[(i-)*m+j]&&!d[(i-)*m+j])++cnt,solve(i,j);
scanf("%d",&q);
int opt,tt,x,y;
for(int i=;i<=q;i++){
scanf("%d%d",&opt,&tt);
if(opt==){
int maxn=,maxnum=;
for(int j=;j<=tt;j++){
scanf("%d%d",&x,&y);
if(sm[getfa(d[(x-)*m+y])]>maxn)maxn=sm[getfa(d[(x-)*m+y])],maxnum=j;
}
printf("%d\n",maxnum);
}
else{
for(int j=;j<=tt;j++){
scanf("%d%d",&x,&y);
if(map[(x-)*m+y]){
sm[getfa(d[(x-)*m+y])]--;
d[(x-)*m+y]=;
map[(x-)*m+y]=false;
}
else {
++sm[d[(x-)*m+y]=++cnt];
map[(x-)*m+y]=true;
if(x>)merge(x,y,x-,y);
if(x<n)merge(x,y,x+,y);
if(y>)merge(x,y,x,y-);
if(y<m)merge(x,y,x,y+);
}
}
}
}
}
题(NOIP模拟赛Round #10)的更多相关文章
- 水(NOIP模拟赛Round #10)
题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...
- 大(NOIP模拟赛Round #10)
题目描述: 小Z有个n个点的高清大图,每个点有且只有一条单向边的出边.现在你可以翻转其中的一些边,使他从任何一个点都不能通过一些道路走回这个点.为了方便,你只需输出方案数对取模即可.当在两个方案中有任 ...
- NOIP模拟赛-2018.10.22
模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...
- NOIP模拟赛 17.10.10
初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...
- bananahill(NOIP模拟赛Round 8)
题目描述 香蕉川由座香蕉山组成,第i座山有它的高度.小Z准备从左到右爬这里的恰好座香蕉山,但他不希望山的高度起伏太大,太过颠簸,会让本就体育不好的他过于劳累.所以他定义了爬山的劳累度是所有爬的相邻的两 ...
- 战斗机的祈雨仪式(NOIP模拟赛Round 7)
[问题描述] 炎炎夏日,如果没有一场大雨怎么才能尽兴?秋之国的人民准备了一场祈雨仪式.战斗机由于拥有操纵雷电的能力,所以也加入了其中,为此,她进行了一番准备. 战斗机需要给自己的Spear of Lo ...
- 小红帽的画笔(NOIP模拟赛Round 7)
又到了神奇的模拟赛时间~ 真是丧~ 好吧我们来看看题目 小红帽是Pop star上最著名的人类画家,她可以将任何画出的东西变成真实的物品.赋予她这样神奇能力的正是她手上的画笔. 小红帽每次作画时,都需 ...
- calc(NOIP模拟赛Round 3)
原题: D e s c r i p t i o n 给三个正整数n,m和p,求(n^1+...n^m) mod p. Input 一行,三个整数n,m和p. Output 输出答案. S a m p ...
- noip模拟赛(10.4) 序列(sequence)
序列(sequence) [题目描述] 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. [输入数据] 第一行一个整数t表示数据组数. 每组数据 ...
随机推荐
- 011---Djang的cookie和session
-------------------------------------------------------------cookie与session------------------------- ...
- [CodeForces954D]Fight Against Traffic(最短路)
Description 题目链接 Solution 从起点和终点分别做一次最短路并记录结果 枚举每一条可能的边判断 Code #include <cstdio> #include < ...
- 队列--数据结构与算法JavaScript描述(5)
队列 Queue 概念 队列是一种列表,但队列只能在队尾插入元,在队首删除元素. 队列是一种先进先出的数据结构,用于存储按顺序排列的数据,被用在很多地方,比如提交操作系统执行的一系列进程.打印任务池等 ...
- 笔记-selenium+chrome headless
笔记-selenium+chrome headless 1. selenium+chrome headless phantomjs与selenium分手了,建议使用其它无头浏览器. chro ...
- 20145202马超 《Java程序设计》第三周学习总结
************************http://git.oschina.net/tuolemi/java这是git的那个网址********************* 函数的重载:在同一 ...
- mutable c++
The keyword mutable is used to allow a particular data member of const object to be modified. This i ...
- myeclipse用maven搭建web项目后tomcat启动报找不到jar包解决办法
因为maven项目jar包放在Maven Dependencies内,用tomcat启动web项目,会找WEB-INF下的lib目录,需要部署Maven Dependencies 选中项目-prope ...
- laravel5.5用户认证
目录 1. 命令 2. 快速认证 2.1 自定义路径 2.2 自定义用户名 2.3 自定义看守器 2.4 自定义验证/存储 2.5 Auth::xx() 2.6 保护路由 2.7 指定看守器 3 手动 ...
- python考点
Python考点 1.Python类继承,内存管理(阿里) 答:内存管理机制包括:引用计数机制,垃圾回收机制,内存池机制 a = 1,1就是对象,a就是引用,引用a指向对象1. 2.Python装饰器 ...
- javascript 数组的常用方法总结
前言 主要讨论一下数组的方法, 1.splice和slice的区别 2.pop和push 3.shift和unshift 4.join 5.forEach(es ...