题(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表示数据组数. 每组数据 ...
随机推荐
- 数据结构学习-AVL平衡树
环境:C++ 11 + win10 IDE:Clion 2018.3 AVL平衡树是在BST二叉查找树的基础上添加了平衡机制. 我们把平衡的BST认为是任一节点的左子树和右子树的高度差为-1,0,1中 ...
- linux基础命令3(man)
Type:显示指定的命令是那种类型. Linux下有两种模式的时间 date:用于系统时间管理.(软件操作的系统时 ...
- B1071 小赌怡情 (15分)
B1071 小赌怡情 (15分) 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计 ...
- Idea中maven依赖图查看
技术交流群: 233513714 使用Intellij idea,想看看它的maven依赖图,根据eclipse的经验,不是很容易能找到Intellij idea对应的功能.在打开的pom.xml文件 ...
- [网站公告]1月10日1:00-7:00阿里云RDS维护会造成30秒闪断
大家好! 阿里云将于1月10号1:00-7:00(今天夜里)对杭州机房部分RDS实例所在的物理主机做维护操作,维护期间部分RDS实例会有1-2次闪断,每次闪断时间在30秒以内. 我们使用的RDS实例将 ...
- 每天一个Linux命令(2):shutdown命令
shutdown命令是系统关机命令.shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作. 语法 shutdown(选项)(参数) 选项 -c:取消已经在进行的 shutdo ...
- Windows下如何解决git bash的默认home目录路径问题
转自:http://blog.csdn.net/lucien_zhou/article/details/62069246 为了解决这个问题,我在网上找了好久,尝试过按网上其他人所述,修改 git 安装 ...
- python-configparser模块,xml.etree模块
操作键值对文件 #文件db格式为 [section] a = 1 b = 2 [section1] d = 3 c = 4 import configparser #获取所有节点 config = c ...
- winform-实现类似QQ停靠桌面上边缘隐藏的效果
//实现类似QQ停靠桌面上边缘隐藏的效果! private void timer1_Tick(object sender, EventArgs e) { System.Drawing.Point pp ...
- Linq中Count()和Any()引发的效率问题
1.count和any 今天看了鹤冲天的文章:Linq:切勿使用 Count() > 0 来判断集合非空 有所收获,写下文章总结一下: 先看如下代码: static void Main(st ...