这题说的是给了一个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. 不同.NET Framework版本下ASP.NET FormsAuthentication的兼容性

    假设站点A加密使用.NET Framework 2.0,站点B解密使用.NET Framework 4.0,除了保持MachineKey相同外还需要进行如下设置: 1.Web.config的<a ...

  2. hiredis安装及测试

      (1) redis环境搭建    (2) hiredis下载地址及C API  github   (3) hiredis安装 我是把libhiredis.so放到/usr/local/lib/中, ...

  3. Accelerated Failure Time Models加速失效时间模型AFT

    Weibull distribution 或者 σ是未知的scale参数,独立于X的常量, σ>0 是服从某一分布的随机变量 残差(residuals)=

  4. eclipse+gnuarm+使用报错

    Description Resource Path Location TypeProgram "echo" not found in PATH stm32 Project Prop ...

  5. java基础解析系列(一)---String、StringBuffer、StringBuilder

    java基础解析系列(一)---String.StringBuffer.StringBuilder 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bu ...

  6. socket 中午吃的啥 socket 并发服务器 fork

    http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html zh.wikipedia.org/wiki/網路插座 在作業系統中,通 ...

  7. Assign the task---hdu3974(线段树优化+dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974 题意就是:公司有n个员工,关系有n-1个,T x y 代表把工作y交给员工x: 员工可以把工作交 ...

  8. 钱币兑换问题--hdu1284(完全背包)

    Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于32768.   ...

  9. CentOS7.2配置vsftpd

    环境 CentOS7.2 (安装镜像CentOS-7-x86_64-DVD-1611) 本文默认使用root用户操作 目标 实现CentOS7.2上安装vsftpd,使用新创建的ftpuser用户便可 ...

  10. HTTP 协议详解(转载)

    原文: http://kb.cnblogs.com/page/130970/#httpmeessagestructe HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...