这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组

从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了

时间复杂度O(n^2logn)

#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
typedef long long LL;
const LL mod=1e8+;
const int N=1e3+;
int c[][N],n,m;
char s[N][N];
int r[N][N],xl[N][N],xr[N][N];
struct Point
{
int x,y;
};
vector<Point>g[];
void add(int pos,int x)
{
for(int i=x; i<=m; i+=i&(-i))
++c[pos][i];
}
int sum(int pos,int x)
{
int ans=;
if(x==)return ;
for(int i=x; i>; i-=i&(-i))
ans+=c[pos][i];
return ans;
}
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n+m; ++i)g[i].clear();
for(int i=; i<=n; ++i)scanf("%s",s[i]+);
memset(xl,,sizeof(xl));
memset(xr,,sizeof(xr));
memset(r,,sizeof(r));
memset(c,,sizeof(c));
for(int j=m; j>; --j)
for(int i=; i<=n; ++i)
if(s[i][j]=='x')r[i][j]=r[i][j+]+;
for(int i=n; i>; --i)
for(int j=; j<=m; ++j)
if(s[i][j]=='x')xl[i][j]=xl[i+][j-]+,xr[i][j]=xr[i+][j+]+;
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j)
if(s[i][j]=='x')
{
int x=i,y=j+r[i][j]-;
if(x<y)y-=(x-),x=;
else x-=(y-),y=;
Point tmp;
tmp.x=i,tmp.y=j;
int id;
if(x==)id=y;
else id=m+x;
g[id].push_back(tmp);
}
int res=;
for(int i=m; i>=; --i)
{
for(int j=; j<g[i].size(); ++j)
{
int pos=g[i][j].x+g[i][j].y;
add(pos,g[i][j].y);
}
for(int x=,y=i; x<=n&&y<=m; ++x,++y)
{
if(s[x][y]!='x')continue;
int l=min(xl[x][y],xr[x][y]);
res+=sum(x+y,y)-sum(x+y,y-l);
}
}
for(int i=; i<=n; ++i)
{
for(int j=; j<g[m+i].size(); ++j)
{
int pos=g[i+m][j].x+g[i+m][j].y;
add(pos,g[i+m][j].y);
}
for(int x=i,y=; x<=n&&y<=m; ++x,++y)
{
if(s[x][y]!='x')continue;
int l=min(xl[x][y],xr[x][y]);
res+=sum(x+y,y)-sum(x+y,y-l);
}
}
printf("Case #%d: %d\n",++cas,res);
}
return ;
}

最新文章

  1. linux 查找文件与进程常用命令
  2. clean之后R文件消失
  3. 斯坦福第十八课:应用实例:图片文字识别(Application Example: Photo OCR)
  4. Controlling Site Provisioning Process with a Custom Provider
  5. 安装universal-ctags
  6. String类的split方法以及StringTokenizer
  7. jQuery获取鼠标事件源(万能)
  8. zf-中间库(xzfw_xzjc_jianshi)
  9. LPC1768的iic通讯
  10. Hadoop-2.x启动HDFS和YARN的方式
  11. SVN上传项目步骤
  12. 分布式缓存技术之Redis_03分布式redis
  13. New Journey Prepare
  14. 深入理解Java虚拟机03--垃圾收集器与内存分配策略
  15. ZIP压缩包加密破解
  16. Expm 3_2 寻找最邻近的点对
  17. Opencv配套的辅助工具Image Watch
  18. 20、资源与本地化 System.Resources
  19. IOS中的XML解析之DOM和SAX
  20. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} (转)

热门文章

  1. Linux下的ntp时钟同步问题
  2. ado.net中的几个对象
  3. php开学之环境搭建
  4. 虚拟机添加磁盘LVM分区
  5. linux编译相关知识
  6. OFBiz进阶之HelloWorld(一)创建热部署模块
  7. Windows store app Settings 的 应用 ( viewmodel + windows.storage)
  8. IgnoreRoute——注册路由
  9. 《php和mysql web开发》读书笔记
  10. [状压dp]HDU5045 Contest