这题说的是给了一个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. github使用密钥登录

    注册github之后 初次使用git的用户要使用git协议大概需要三个步骤: 一.生成密钥对 二.设置远程仓库(本文以github为例)上的公钥     一.生成密钥对 再window系统中可以通过x ...

  2. PHPStorm 注册码&主题皮肤

    JetBrains PhpStorm 注册方法: 用浏览器打开 http://idea.lanyus.com/ 点击页面中的“获得注册码” 然后打开PhpStorm,在注册时切换至Activation ...

  3. humid vs wet vs moist

    想表达天气很潮湿该用哪个词呢? 跟一个美国人聊天,我说wet他没听清,然后我说moist,然后他反应过来了:"oh,humid" 那~还是用humid吧

  4. java字符串的替换

    split也是用到了正则表达式 replace 是没有用正则表达式,全部替换 replaceAll 和replaceFirst是用了正则表达式 replaceAll替换所有,replaceFirst是 ...

  5. Ubuntu16.04下安装配置numpy,scipy,matplotlibm,pandas 以及sklearn+深度学习tensorflow配置+Keras2.0.6(非Anaconda环境)

    1.ubuntu镜像源准备(防止下载过慢): 参考博文:http://www.cnblogs.com/top5/archive/2009/10/07/1578815.html 步骤如下: 首先,备份一 ...

  6. python2和python3的不同

    1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%.Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可 以取得很好的优化结果. Py3.1性能比Py2 ...

  7. CSS水平导航栏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. free详解

    用法: [oracle@server36 ~]$ free -help free: invalid option -- h usage: free [-b|-k|-m|-g] [-l] [-o] [- ...

  9. linux Service start

    1. crontab的方式 2. 服务的方式.该服务能够持续监测minerd是否在运行,如果没有在运行就会运行minerd:服务也可以做成开机自启动.该服务执行的内容如下,该服务是判断目标服务器的pa ...

  10. Tensorflow(一)

    一.安装Ubantu环境 下载ios 网址:http://cn.ubuntu.com/download/ 2.配合虚拟机进行安装环境 虚拟机直接百度下载即可 虚拟机采用 3.配置 4.安装中 5.安装 ...