题目描述:

有一张的地图,其中的地方是墙,的地方是路。有两种操作:

  1. 给出个地点,询问这个地点中活动空间最大的编号。若询问的位置是墙,则活动空间为;否则活动空间为询问地点通过四联通能到达的点的个数。如果有多个位置均为最大,输出给出顺序较前的那个。编号为

  2. 给出个地点,按照读入的顺序翻转这个地点的地形。即若原位置是墙,则该位置变为路;若原位置是路,则该位置变为墙。保证在将路变为墙时不会将一个区域分割,也不会将一个只有一格的区域填满。

保证每次操作只会询问或修改同一个位置至多一次。

————————————————我是分割线————————————————

首先我们先将一块连通的区域变为一个点,便于处理

接着我们来看修改操作:

如果一个点本来不联通,变成了连通,我们就有可能遇到两个区域连通的情况,所以我们要用并查集处理合并操作,并且合并的点不能在原图之上,要新开一个点。

但如果一个点变成墙,我们先将这个点所属的区块的压缩点的值-1,然后将这个点所属的区块设为0即可

  1. #include<cstdio>
  2. #include<cstring>
  3. #define MN 1000005
  4. using namespace std;
  5. char ch;
  6. int n,m,cnt,q;
  7. bool map[MN];
  8. int d[MN],sm[MN*],f[MN*];
  9. void solve(int x,int y){
  10. if(!map[(x-)*m+y]||d[(x-)*m+y])return;
  11. ++sm[d[(x-)*m+y]=cnt];
  12. if(x>)solve(x-,y);
  13. if(x<n)solve(x+,y);
  14. if(y>)solve(x,y-);
  15. if(y<m)solve(x,y+);
  16. }
  17. int getfa(int x){return f[x]?f[x]=getfa(f[x]):x;}
  18. void merge(int x,int y,int xx,int yy){
  19. if(!map[(xx-)*m+yy]||getfa(d[(x-)*m+y])==getfa(d[(xx-)*m+yy]))return;
  20. sm[getfa(d[(xx-)*m+yy])]+=sm[getfa(d[(x-)*m+y])];
  21. sm[getfa(d[(x-)*m+y])]=;
  22. f[getfa(d[(x-)*m+y])]=getfa(d[(xx-)*m+yy]);
  23. }
  24. int main(){
  25. scanf("%d%d",&n,&m);
  26. for(int i=;i<=n;i++)
  27. {
  28. scanf("%c",&ch);
  29. for(int j=;j<=m;j++){
  30. scanf("%c",&ch);
  31. if(ch=='*')map[(i-)*m+j]=false;
  32. else map[(i-)*m+j]=true;
  33. }
  34. }
  35. for(int i=;i<=n;i++)
  36. for(int j=;j<=m;j++)
  37. if(map[(i-)*m+j]&&!d[(i-)*m+j])++cnt,solve(i,j);
  38. scanf("%d",&q);
  39. int opt,tt,x,y;
  40. for(int i=;i<=q;i++){
  41. scanf("%d%d",&opt,&tt);
  42. if(opt==){
  43. int maxn=,maxnum=;
  44. for(int j=;j<=tt;j++){
  45. scanf("%d%d",&x,&y);
  46. if(sm[getfa(d[(x-)*m+y])]>maxn)maxn=sm[getfa(d[(x-)*m+y])],maxnum=j;
  47. }
  48. printf("%d\n",maxnum);
  49. }
  50. else{
  51. for(int j=;j<=tt;j++){
  52. scanf("%d%d",&x,&y);
  53. if(map[(x-)*m+y]){
  54. sm[getfa(d[(x-)*m+y])]--;
  55. d[(x-)*m+y]=;
  56. map[(x-)*m+y]=false;
  57. }
  58. else {
  59. ++sm[d[(x-)*m+y]=++cnt];
  60. map[(x-)*m+y]=true;
  61. if(x>)merge(x,y,x-,y);
  62. if(x<n)merge(x,y,x+,y);
  63. if(y>)merge(x,y,x,y-);
  64. if(y<m)merge(x,y,x,y+);
  65. }
  66. }
  67. }
  68. }
  69. }

题(NOIP模拟赛Round #10)的更多相关文章

  1. 水(NOIP模拟赛Round #10)

    题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...

  2. 大(NOIP模拟赛Round #10)

    题目描述: 小Z有个n个点的高清大图,每个点有且只有一条单向边的出边.现在你可以翻转其中的一些边,使他从任何一个点都不能通过一些道路走回这个点.为了方便,你只需输出方案数对取模即可.当在两个方案中有任 ...

  3. NOIP模拟赛-2018.10.22

    模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...

  4. NOIP模拟赛 17.10.10

    初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...

  5. bananahill(NOIP模拟赛Round 8)

    题目描述 香蕉川由座香蕉山组成,第i座山有它的高度.小Z准备从左到右爬这里的恰好座香蕉山,但他不希望山的高度起伏太大,太过颠簸,会让本就体育不好的他过于劳累.所以他定义了爬山的劳累度是所有爬的相邻的两 ...

  6. 战斗机的祈雨仪式(NOIP模拟赛Round 7)

    [问题描述] 炎炎夏日,如果没有一场大雨怎么才能尽兴?秋之国的人民准备了一场祈雨仪式.战斗机由于拥有操纵雷电的能力,所以也加入了其中,为此,她进行了一番准备. 战斗机需要给自己的Spear of Lo ...

  7. 小红帽的画笔(NOIP模拟赛Round 7)

    又到了神奇的模拟赛时间~ 真是丧~ 好吧我们来看看题目 小红帽是Pop star上最著名的人类画家,她可以将任何画出的东西变成真实的物品.赋予她这样神奇能力的正是她手上的画笔. 小红帽每次作画时,都需 ...

  8. 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 ...

  9. noip模拟赛(10.4) 序列(sequence)

    序列(sequence) [题目描述] 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. [输入数据] 第一行一个整数t表示数据组数. 每组数据 ...

随机推荐

  1. HDU 3364 高斯消元

    Lanterns Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  2. C# 不同窗口传递参数

    form1: private void button1_Click(object sender, System.EventArgs e) { Form2 frm = new Form2(); frm. ...

  3. [CodeForces238E]Meeting Her(图论+记忆化搜索)

    Description 题目链接:Codeforces Solution 因为路线随机,所以找出各路线最短路必须经过的点,在这个点必定能上车 直接floyd暴力找割点 然后不断用k条公交车路线来更新D ...

  4. 笔记-scrapy-pipeline

    笔记-scrapy-pipeline 1.简介 scrapy抓取数据后,使用yield发送item对象至pipeline,pipeline顺序对item进行处理. 一般用于: 清洗,验证,检查数据: ...

  5. Dapper.Extension的基本使用

    前言    上一篇随笔写了Dapper的简单的使用,这次写一下Dapper.Extension的使用,它是Dapper的简单的封装扩展,可以通过实例化的对象赋值后进行增删改的操作以及分页,但是却不能进 ...

  6. [记读书笔]python3.5实现socket通讯(UDP)

    UDP连接: 无连接,从一个端向另一端发送独立的数据分组 使用UDP连接的客户-服务器程序: UDPServer.py import socket serverPort = 50009 serverS ...

  7. Android 导出traces.txt 遇到的坑

    我一直以为traces.txt 导出需要root .因为每当我 cd data ll 然后就会告诉我 Permission denied 后来我问同事,怎么导出traces.txt 文件.同事说很简单 ...

  8. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 's.areaname' in 'field list'错误

    在使用mybatis框架做查询的时候,出现了如下错误: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown colum ...

  9. 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

    因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本. 如果我们使用是 str ...

  10. 19、AngularJs知识点总结 part-1

    1.AngularJs AngularJs是一款JavaScript开源库,由Google维护,用来协助单一页面应用程序: AngularJs的目标是通过MVC模式增强基于浏览器的应用,使开发和测试变 ...