这题说的是给了一个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. shell中的环境变量:local,global,export

     1.local一般用于局部变量声明,多在在函数内部使用.实例如下:      echo_start() { local STR="$1" echo "...... ${ ...

  2. 【转】C内存管理

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  3. java读取写入oracle的blob字段工具类

    import com.hzunitech.fxgk.sys.model.UtFileData;import com.jfinal.kit.PathKit;import com.jfinal.plugi ...

  4. JIRA - 使用指南(项目跟踪管理工具)

    第一章.前言    JIRA 是澳大利亚 Atlassian 公司开发的一款优秀的问题跟踪管理软件工具,可以对各种类型的问题进行跟踪管理,包括缺陷.任务.需求.改进等.JIRA采用J2EE技术,能够跨 ...

  5. python获取windows所有com口

    import serial import serial.tools.list_ports port_list = list(serial.tools.list_ports.comports()) po ...

  6. xtrabackup安装部署(二)

    在官网中,复制相关链接下载最新版本(建议使用当前发布版本前6个月左右的稳定版本) https://www.percona.com/downloads/XtraBackup/LATEST/ 1.下载和安 ...

  7. html 在一个超链接上面,鼠标移动上去时,也显示一串文字,如何实现

    a标签的title属性,对title属性赋值即可.例如:<a href="http://www.baidu.com/" title="跳转到百度"> ...

  8. POJ-1458 Common Subsequence(线性动规,最长公共子序列问题)

    Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44464 Accepted: 18186 ...

  9. OpenCV学习笔记之课后习题练习3-3

    3.3 创建一个100*100的拥有三个通道的二维字节类型矩阵,将其元素全部置0.通过cvPtr2D函数将指针指向中间通道(绿色),以(20,5)和(40,20)为顶点间画一个绿色的长方形. cvPt ...

  10. linux:进程概念

    Linux进程概念 一.实验介绍1.1 实验内容Linux 中也难免遇到某个程序无响应的情况,可以通过一些命令来帮助我们让系统能够更流畅的运行. 而在此之前,我们需要对进程的基础知识有一定的了解,才能 ...