FZU 2225 小茗的魔法阵 扫描线+树状数组
这个题和一个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 ;
}
FZU 2225 小茗的魔法阵 扫描线+树状数组的更多相关文章
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- HDU 5862 Counting Intersections 扫描线+树状数组
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...
- 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组
题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- [BZOJ4822][CQOI2017]老C的任务(扫描线+树状数组)
4822: [Cqoi2017]老C的任务 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 379 Solved: 203[Submit][Statu ...
- 【BZOJ3488】[ONTAK2010]Highways 扫描线+树状数组
[BZOJ3488][ONTAK2010]Highways Description 给一棵n个点的树以及m条额外的双向边q次询问,统计满足以下条件的u到v的路径:恰经过一条额外的边不经过树上u到v的路 ...
- 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组
[BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...
- BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟 ...
- BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...
随机推荐
- 用Objective-C的foundation框架解决表达式求值问题
主要思想: 本程序分2个类 一个是ExpressionString类,主要用于存储表达式以及对它进行求值.以下是该类中的内容: (NSString *)expString//用于存储要计算的表达式: ...
- Python3 IO
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中 ...
- Winform窗口弹出位置控制
窗体的弹出位置可以由属性StartPosition来指定,默认值有: Manural 自定义,由属性Location指定: CenterScreen 屏幕中央: WindowsDefaultBound ...
- 算法之合并排序(mergeSort)
合并排序算法在结构上是递归的,采用分治策略:就是将原有的问题划分为 n 个规模较小但结构与原问题相似的子问题,递归地解决这些子问题,然后合并其结果,就得到原问题的解. 合并排序的模式一般如下: 1.分 ...
- 003.XE3包含了TPerlRegEx的单元
使用'|'替换所有的内容 代码: program Project1; {$APPTYPE CONSOLE} uses System.SysUtils, System.RegularExpression ...
- Django初体验
为什么使用Django 快速开发 使用python 数据库ORM系统 大量内置应用 后台管理系统 admin 用户认证系统 auth 会话系统 sessions 安全性高 表单验证 SQL注入 跨站点 ...
- qt 5 小练习 纯代码制作自定义按钮
大家都知道QT设计师中直接拖动的按钮是长方形带有圆角的图案,那我们如何来设置自定义按钮呢 要设计一个按钮,我们必须要知道按钮有什么属性,首先,按钮必须有一个位置 第二,按钮必须有一个名称.还有当我们点 ...
- AJAX技术的核心
//创建一个XMLHttpRequest对象 ,利用此对象与服务器进行通信 是AJAX技术的核心 /** * 获取XmlHttpRequest对象 */ function getXMLHttpRequ ...
- bp神经网络算法
对于BP神经网络算法,由于之前一直没有应用到项目中,今日偶然之时 进行了学习, 这个算法的基本思路是这样的:不断地迭代优化网络权值,使得输入与输出之间的映射关系与所期望的映射关系一致,利用梯度下降的方 ...
- 【NOIP 2012 疫情控制】***
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...