这题说的是给了一个n*m的网格,然后每个格子的点事黑色的或者是白色的然后每个点如图所示

   然后只能用白点和图中给出的边建立三角形然后询问三角形的个数有多少个,这样说每个三角形的边必须是图中有的边,然后三角形的边上的点必须全部为白色的点然后计算这样能组成多少个三角形,先对每个点处理好他8个方向所能到达最大的长度,这里花了n*m*4的时间然后去判断每个点所能到达的最多多少个三角形时间为400*400*400然后得解

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX_N = ;
int len[MAX_N][MAX_N][];
char map[MAX_N][MAX_N];
__int64 ans=;
int n,m;
void init(){
for(int i=; i<=n; i++){
for(int j= ; j<=m; ++j )
if(map[i][j]==''){
len[i][j][]=;
len[i][j][]=;
len[i][j][]=;
}else{
len[i][j][]=len[i-][j-][]+;
len[i][j][]=len[i-][j][]+;
len[i][j][]=len[i][j-][]+;
}
for(int j=m; j>; --j)
if(map[i][j]==''){
len[i][j][]=;
len[i][j][]=;
}else{
len[i][j][]=len[i-][j+][]+;
len[i][j][]=len[i][j+][]+;
}
}
for(int i=n; i>; i--){
for(int j = ; j<=m; ++j )
if(map[i][j]=='')
{
len[i][j][]=;
len[i][j][]=;
}else{
len[i][j][]=len[i+][j-][]+;
len[i][j][]=len[i+][j][]+;
}
for(int j=m; j>; --j)
if(map[i][j]==''){
len[i][j][]=;
}else{
len[i][j][]=len[i+][j+][]+;
}
} }
int pC(int a,int b,int c){ if(a>=b&&b>=c) return b;
if(a>=c&&c>=b) return c;
if(b>=a&&a>=c) return a;
if(b>=c&&c>=a) return c;
if(c>=a&&a>=b) return a;
if(c>=b&&b>=a) return b;
}
void solve1(int x,int y,int L){
for(int k= ; k< L; ++k)
{
if(x-k<) break;
if(len[x][y][]>k&&len[x][y][]>k&&len[x-k][y][]>k)
ans++;
if(len[x][y][]>k&&len[x][y][]>k&&len[x-k][y][]>k)
ans++;
if(len[x][y][]>k&&len[x][y][]>k&&len[x-k][y][]>k&&len[x-k][y][]>k)
ans++;
} }
void solve2(int x,int y,int L){
for(int k=; k<L; k++){
if(y+k>m) break;
if(len[x][y][]>k && len[x][y][]>k && len[x][y+k][]>k)
ans++;
if(len[x][y][]>k && len[x][y][]>k && len[x][y+k][]>k && len[x][y+k][]>k)
ans++;
}
}
void solve3(int x,int y,int L){
for(int k =; k<L ;k++){
if(x+k>n) break;
if(len[x][y][]>k && len[x][y][]>k && len[x+k][y][]>k)
ans++;
if(len[x][y][]>k&& len[x][y][]>k && len[x+k][y][]>k && len[x+k][y][]>k )
ans++;
}
}
void solve4(int x,int y,int L){
for(int k=; k<L ; ++k)
{
if(y-k<) break;
if(len[x][y][]>k&&len[x][y][]>k&&len[x][y-k][]>k&&len[x][y-k][]>k)
ans++;
}
}
int main()
{
while(scanf("%d%d",&n,&m)==){
ans=;
for(int i=; i<=n; ++i)
scanf("%s",map[i]+);
memset(len,,sizeof(len));
init();
for(int i=; i<=n; i++ ){
for(int j=; j<=m; ++j){
int L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve1(i,j,L);
L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve2(i,j,L);
L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve3(i,j,L);
L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve4(i,j,L);
}
}
printf("%I64d\n",ans);
} return ;
}

cf249D的更多相关文章

随机推荐

  1. 【C#】基础知识

    C#常用函数表1.DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=S ...

  2. Logstash自带正则表达式

    USERNAME [a-zA-Z0-._-]+ USER %{USERNAME} INT (?:[+-]?(?:[-]+)) BASE10NUM (?<![-.+-])(?>[+-]?(? ...

  3. APM飞控的使用心得

    硬件资源:APM,F450四轴机架,大疆电调和电机,富斯i6控和接收机. 刚开始的步骤都是大同小异,首先可以按照这个链接上面的步骤一步步的执行:http://tieba.baidu.com/p/297 ...

  4. 万事开头难 && 实践出真知

    实践出真知,真是千古不变的真理. 前几天在顺手做一个万年历项目,实现了用TFT屏显示实时时间,日期,温度,和按键设置时间,能在特定时间显示特定的话语在显示屏上面.其实这个项目现在想想还是挺简单的.我的 ...

  5. Centos7 安装hive

    安装hive 配置hive 在hdfs中新建目录/user/hive/warehouse 首先启动hadoop任务 hdfs dfs -mkdir /tmp hdfs dfs -mkdir /user ...

  6. poj3261 Milk Patterns【后缀数组】【二分】

    Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...

  7. hdu4513完美队形II manacher

    吉哥又想出了一个新的完美队形游戏!  假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要 ...

  8. 推荐系统之余弦相似度的Spark实现

    推荐系统之余弦相似度的Spark实现 (1)原理分析    余弦相似度度量是相似度度量中最常用的度量关系,从程序分析中, 第一步是数据的输入, 其次是使用相似性度量公式 最后是对不同用户的递归计算. ...

  9. 极大既然估计和高斯分布推导最小二乘、LASSO、Ridge回归

    最小二乘法可以从Cost/Loss function角度去想,这是统计(机器)学习里面一个重要概念,一般建立模型就是让loss function最小,而最小二乘法可以认为是 loss function ...

  10. PyQT5-QSlide滑块

    """ QSlider:是一个小滑块组件,这个小滑块能够被拖着一起滑动,用于通常修改具有一定范围的数据 Author: dengyexun DateTime: 2018. ...