码迷,mamicode.com
首页 > 其他好文 > 详细

CF1015E2 Solution

时间:2021-01-28 12:12:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ons   problems   sum   continue   code   scanf   targe   set   就是   

题目链接

题解

\(n^3\)暴力,就是最暴力的那种( ?? ▽ ?? )?,枚举中心点和星星大小。咳咳,不是数据水,原题作者卡了好久这个方法,但是没能卡掉(辛苦了)。解释原因:可以发现,临近边缘的星星大小非常小,经过计算实际枚举次数\(=4(n-1)\cdot\sum\limits_{i=1}^{\frac{n}{2}}\frac{i}{2^i}(+\frac{n}{2},n为奇时)\)。因为当\(i\)很大时,\(\frac{i}{2^i}\)是很小的,因此实际复杂度远达不到\(O(n^3)\)

AC 代码

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
struct node {int x,y,s;} ans[N*N];
char a[N][N];
bool vis[N][N];
int main()
{
	int n,m,cnt=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
	for(int i=2;i<n;i++)
	{
		for(int j=2;j<m;j++)
		{
			if(a[i][j]==‘.‘) continue;
			int t=1; 
			while(i>=t && j>=t && a[i+t][j]==‘*‘ && a[i-t][j]==‘*‘ && a[i][j+t]==‘*‘ && a[i][j-t]==‘*‘)
				{vis[i+t][j]=vis[i-t][j]=vis[i][j+t]=vis[i][j-t]=1; t++;}
			if(t<=1) continue;
			ans[++cnt].x=i; ans[cnt].y=j;
			ans[cnt].s=--t; vis[i][j]=1;
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) 
			if(a[i][j]==‘*‘ && !vis[i][j]) {printf("-1"); return 0;	}
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;i++) printf("%d %d %d\n",ans[i].x,ans[i].y,ans[i].s);
	return 0;
}

CF1015E2 Solution

标签:ons   problems   sum   continue   code   scanf   targe   set   就是   

原文地址:https://www.cnblogs.com/violetholmes/p/14337405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!