codeforces 356C Bear and Square Grid
说是一个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相关推荐
- codeforces679C Bear and Square Grid(dfs优化)
题意: 给你n*n的矩阵(n<=500),矩阵内有x和.,然后给你一个k 你可以把一个k*k的矩阵内全部变成. 问你最多有多少个.可以联通 思路: n^2枚举炸的位置,先预处理联通块和区间.的和 ...
- 【CodeForces - 1A】Theatre Square(水题,几何)(CODEFORCES,梦的开始)
题干: Theatre Square in the capital city of Berland has a rectangular shape with the size n × m meters ...
- 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 ...
- CodeForces 658C Bear and Forgotten Tree 3(构造)
题意:构造一棵树,有N个点,直径为d,深度为h 思路:首先构造一个长度为d的链,然后把其中一个距离边上为h的点变为根.然后我们就不停的在距离根为h上面的那一点不停的加点就好了,使得新加入的点的距离也为 ...
- 【模拟】Codeforces 710C Magic Odd Square
题目链接: http://codeforces.com/problemset/problem/710/C 题目大意: 构造一个N*N的幻方.任意可行解. 幻方就是每一行,每一列,两条对角线的和都相等. ...
- Codeforces A - Bear and Prime 100(交互题)
A - Bear and Prime 100 思路:任何一个合数都可以写成2个以上质数的乘积.在2-100中,除了4,9,25,49外都可以写成两个以上不同质数的乘积. 所以打一个质数加这四个数的表: ...
- Codeforces 658D Bear and Polynomials【数学】
题目链接: http://codeforces.com/contest/658/problem/D 题意: 给定合法多项式,改变一项的系数,使得P(2)=0,问有多少种方法? 分析: 暴力求和然后依次 ...
- Codeforces 715A Plus and Square Root
题目链接:http://codeforces.com/problemset/problem/715/A 参考博客:http://blog.csdn.net/aozil_yang/article/det ...
- Codeforces——791A Bear and Big Brother
小声BB 又开始更新了,最近打游戏王DL,这个栏目会留一些上分的心得. 题干 time limit per test:1 second memory limit per test:256 megaby ...
最新文章
- ASM_POWER_LIMIT 参数
- iPhone 诈骗又出新招,别看见弹窗就输密码
- 各种机器学习任务的顶级结果(论文)汇总
- 4S店的大数据营销实战案例分析
- 如何把txt文本转换成epub文件
- Android 放大镜效果实现原理
- Linux下vsftpd服务的部署
- 5.2 node实现简单登录功能
- You are trying to add a non-nullable field 'code' to business without a default; we can't do that...
- CCRenderTexture画点出现十字架歪解
- Nginx配置端口转发
- insert into select语句与select into from语句
- 2022-1-17 Leetcode 206.反转链表
- 微软暗讽谷歌封杀Windows
- R语言在读取数据的时候自动加上X. 检查列名的有效性
- 社保、公积金查询方式
- 闲鱼采集及监控下单软件开发
- matlab在tic处出现解析错误,破除“解析包时出现错误”方法大全,全部都在这了!...
- 描述常见的计算机硬件系统的构成,用简单的语言描述计算机硬件系统构成
- folly库的安装-Ubuntu18.04