说是一个k的方块,里面的都可以变成点,问最大的联通块。
2A的原因是这个有意思的删点,联通块里的点不能有一个不在就直接删除,而是要标记一下,都出去了才能删除。机智。
大概思路就是,预处理每个联通快,完事把这个里面所有点加一遍,容斥+二维预处理前缀和求出块内有多少是变过来的点。最后直接一步步忘向右滑动即可。磨磨唧唧写了半个多小时。。。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>using namespace std;
char mp[510][510];
int vis[510][510];
int are_num[250050];
int sum[510][510];
int are_vis[250050];
int cnt=0,tmp=0;
int ans=0,ans_temp=0,k;
void dfs(int i,int j)
{
//    printf ("%d %d\n",i,j);if (mp[i][j]=='X'||vis[i][j]) return ;vis[i][j]=cnt;tmp++;dfs(i+1,j);dfs(i-1,j);dfs(i,j+1);dfs(i,j-1);
}
void add(int i,int j)
{if (!vis[i][j])return ;int t=vis[i][j];if (!are_vis[t]) ans_temp+=are_num[t];are_vis[t]++;
}
void pop(int i,int j)
{if (!vis[i][j])return ;int t=vis[i][j];are_vis[t]--;if (!are_vis[t]) ans_temp-=are_num[t];
}
int clac(int x,int y){return sum[x+k-1][y+k-1]-sum[x+k-1][y-1]-sum[x-1][y+k-1]+sum[x-1][y-1];
}
int main()
{int n;scanf ("%d%d",&n,&k);memset(mp,'X',sizeof(mp));for (int i=1;i<=n;i++){scanf ("%s",mp[i]+1),mp[i][n+1]='X';}for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){if (!vis[i][j]&&mp[i][j]=='.'){++cnt;tmp=0;dfs(i,j);are_num[cnt]=tmp;}}}for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];if (mp[i][j]=='.') sum[i][j]++;
//            printf ("%d ",sum[i][j]);
        }
//        printf ("\n");
    }for (int i=1;i<=n-k+1;i++){ans_temp=0;memset(are_vis,0,sizeof(are_vis));for (int x=i-1;x<=i+k;x++){for (int y=1;y<=k;y++){add(x,y);
//                printf ("加(%d %d)\n",x,y);
//                printf ("ans_temp==%d\n",ans_temp);
            }}for (int x=i;x<=i+k-1;x++)add(x,k+1);
//            printf ("加(%d %d)\n",x,k+1);
//        system("pause");
//printf ("%d\n",ans_temp);ans=max(ans,ans_temp+k*k-clac(i,1));
//        cout<<"start"<<ans_temp+k*k-(sum[k+i-1][k]-sum[i-1][k])<<endl;
//        cout<<"zhong"<<sum[k+i-1][k]<<'-'<<sum[i-1][k]<<endl;for (int j=2;j+k-1<=n;j++){for (int x=i;x<=i+k-1;x++)pop(x,j-2),add(x,j+k);
//                printf ("-(%d,%d)\n",x,j-2),printf ("+(%d,%d)\n",x,j+k);pop(i-1,j-1);pop(i+k,j-1);
//            printf ("-(%d,%d)\n",i-1,j-1);
//            printf ("-(%d,%d)\n",i+k,j-1);add(i-1,j+k-1);add(i+k,j+k-1);
//            printf ("+(%d,%d)\n",i-1,j+k-1);
//            printf ("+(%d,%d)\n",i+k,j+k-1);
//            printf ("%d\n",ans_temp);
//            system("pause");
//            cout<<"go"<<ans_temp+k*k-(sum[i+k-1][j+k-1]-sum[i+k-1][j-1]-sum[i-1][j+k-1]+sum[i-1][j-1])<<endl;ans=max(ans,ans_temp+k*k-clac(i,j));}}printf ("%d\n",ans);
//    for (int i=0;i<=n+1;i++)
//    {
//        for (int j=0;j<=n+1;j++)
//        {
//            printf ("%d",vis[i][j]);
//        }
//        printf ("\n");
//    }
//    for (int i=1;i<=cnt;i++) printf ("%d ",are_num[i]);return 0;
}

转载于:https://www.cnblogs.com/nj-czy/p/5608077.html

codeforces 356C Bear and Square Grid相关推荐

  1. codeforces679C Bear and Square Grid(dfs优化)

    题意: 给你n*n的矩阵(n<=500),矩阵内有x和.,然后给你一个k 你可以把一个k*k的矩阵内全部变成. 问你最多有多少个.可以联通 思路: n^2枚举炸的位置,先预处理联通块和区间.的和 ...

  2. 【CodeForces - 1A】Theatre Square(水题,几何)(CODEFORCES,梦的开始)

    题干: Theatre Square in the capital city of Berland has a rectangular shape with the size n × m meters ...

  3. Codeforces 711B- Chris and Magic Square

    B. Chris and Magic Square time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  4. CodeForces 658C Bear and Forgotten Tree 3(构造)

    题意:构造一棵树,有N个点,直径为d,深度为h 思路:首先构造一个长度为d的链,然后把其中一个距离边上为h的点变为根.然后我们就不停的在距离根为h上面的那一点不停的加点就好了,使得新加入的点的距离也为 ...

  5. 【模拟】Codeforces 710C Magic Odd Square

    题目链接: http://codeforces.com/problemset/problem/710/C 题目大意: 构造一个N*N的幻方.任意可行解. 幻方就是每一行,每一列,两条对角线的和都相等. ...

  6. Codeforces A - Bear and Prime 100(交互题)

    A - Bear and Prime 100 思路:任何一个合数都可以写成2个以上质数的乘积.在2-100中,除了4,9,25,49外都可以写成两个以上不同质数的乘积. 所以打一个质数加这四个数的表: ...

  7. Codeforces 658D Bear and Polynomials【数学】

    题目链接: http://codeforces.com/contest/658/problem/D 题意: 给定合法多项式,改变一项的系数,使得P(2)=0,问有多少种方法? 分析: 暴力求和然后依次 ...

  8. Codeforces 715A Plus and Square Root

    题目链接:http://codeforces.com/problemset/problem/715/A 参考博客:http://blog.csdn.net/aozil_yang/article/det ...

  9. Codeforces——791A Bear and Big Brother

    小声BB 又开始更新了,最近打游戏王DL,这个栏目会留一些上分的心得. 题干 time limit per test:1 second memory limit per test:256 megaby ...

最新文章

  1. ASM_POWER_LIMIT 参数
  2. iPhone 诈骗又出新招,别看见弹窗就输密码
  3. 各种机器学习任务的顶级结果(论文)汇总
  4. 4S店的大数据营销实战案例分析
  5. 如何把txt文本转换成epub文件
  6. Android 放大镜效果实现原理
  7. Linux下vsftpd服务的部署
  8. 5.2 node实现简单登录功能
  9. You are trying to add a non-nullable field 'code' to business without a default; we can't do that...
  10. CCRenderTexture画点出现十字架歪解
  11. Nginx配置端口转发
  12. insert into select语句与select into from语句
  13. 2022-1-17 Leetcode 206.反转链表
  14. 微软暗讽谷歌封杀Windows
  15. R语言在读取数据的时候自动加上X. 检查列名的有效性
  16. 社保、公积金查询方式
  17. 闲鱼采集及监控下单软件开发
  18. matlab在tic处出现解析错误,破除“解析包时出现错误”方法大全,全部都在这了!...
  19. 描述常见的计算机硬件系统的构成,用简单的语言描述计算机硬件系统构成
  20. folly库的安装-Ubuntu18.04

热门文章

  1. Linux中ELF格式 可执行文件+动态链接器 的加载
  2. Flask框架从入门到精通之路由(三)
  3. 数据库性能优化—全局优化思路
  4. 文件与文件夹课后作业
  5. Django中管理并发操作
  6. iOS开发中打电话发短信等功能的实现
  7. android MotionEvent中getX()和getRawX()的区别
  8. P1352 没有上司的舞会
  9. NPOI导出excel
  10. django models中批量导入数据