HDU5110:Alexandra and COS(分块+容斥)
传送门
题意
给出\(n*m\)的矩阵,'X'代表treasure.\(q\)个询问,每次询问(x,y)且频率为d的潜艇能探索到多少财富。探索范围要求abs(x1-x)>=abs(y1-y),也就是左斜方/右斜方\(45°\),而且要求\(max(abs(x1-x),abs(y1-y))\)为d的倍数
分析
本题直接预处理每个点的复杂度为\(O(nmn)\),会TLE,考虑分块,将\(d<\sqrt{n}\)的点进行预处理,复杂度为\(O(nm\sqrt{n})\),其余点直接暴力算,复杂度为\(O(\sqrt{n})\),而预处理的方法我是从sio_five学到的,不同于复杂的状态转移,而,是采用右三角形-左三角形的方法,代码简短,十分精妙
trick
1.有一点需要注意,如果数组下标未与循环相对应,会TLE,与ac相差3+s,有claris的说法,未对应导致物理不连续,进而导致寻址慢,以后要注意
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 1010;
int n,m,q,x,y,d,B;
int sum[N][N],g[33][N][N],sa[N][33],gl[N][N],gr[N][N];
//sum[i][j]记录第i行的前j个和,sa[i][j]记录前i行间距为j的行和,比如sa[3][2]=sum[3][m]+sum[1][m]
//gl[i][j]记录以(i,j)为边界的左三角形,gr[i][j]记录以(i,j)为边界的右三角形
char s[N][N];
void init()
{
F(i,1,n)F(j,1,B)
{
if(i<j) sa[i][j]=sum[i][m];
else sa[i][j]=sa[i-j][j]+sum[i][m];
}
F(k,1,B)F(i,1,n)F(j,1,m)
{
//gl
if(i<=k||j<=k) gl[i][j]=sum[i][j];
else gl[i][j]=gl[i-k][j-k]+sum[i][j];
//gr
if(i<=k) gr[i][j]=sum[i][j];
else if(j+k>m) gr[i][j]=sa[i-k][k]+sum[i][j];
else gr[i][j]=gr[i-k][j+k]+sum[i][j];
//g
g[k][i][j]=gr[i][j]-gl[i][j-1];
}
}
void solve()
{
int ans=0;
for(int i=x;i>0;i-=d)
{
int l=max(1,y-x+i),r=min(m,y+x-i);
ans+=sum[i][r]-sum[i][l-1];
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%d %d %d",&n,&m,&q)!=EOF)
{
F(i,1,n)
{
scanf("%s",s[i]+1);
F(j,1,m) sum[i][j]=sum[i][j-1]+(s[i][j]=='X');
}
B=sqrt(n);
init();
while(q--)
{
scanf("%d %d %d",&x,&y,&d);
if(d<=B) printf("%d\n",g[d][x][y]);
else solve();
}
}
return 0;
}
HDU5110:Alexandra and COS(分块+容斥)的更多相关文章
- HDU 5213 分块 容斥
给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...
- JZYZOJ1518 [haoi2011]b 莫比乌斯反演 分块 容斥
http://172.20.6.3/Problem_Show.asp?id=1518最开始只想到了n^2的写法,肯定要超时的,所以要对求gcd的过程进行优化.首先是前缀和容斥,很好理解.第二个优化大致 ...
- 【NOI P模拟赛】华莱士CNHLS(容斥,数论分块)
题意 出题人吃华 莱 士拉肚子了,心情不好,于是出了一道题面简单的难题. 共 T T T 组数据,对正整数 n n n 求 F ( n ) = ∑ i = 1 n μ 2 ( i ) i F(n)=\ ...
- hdu6053(莫比乌斯+容斥+分块)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意: 给出一个含 n 个元素的 a 数组, 求 bi <= ai 且 gcd(b1, ...
- HDU 6053 ( TrickGCD ) 分块+容斥
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- UVa12633 Super Rooks on Chessboard(容斥 + FFT)
题目 Source http://acm.hust.edu.cn/vjudge/problem/42145 Description Let’s assume there is a new chess ...
- HDU 4609 3-idiots FFT+容斥
一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ...
- 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)
[GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...
- BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)
[Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...
随机推荐
- C#如何实现挂机锁
首先在主窗体中设置一个子窗体的实例,然后当点击挂机之后,隐藏当前窗体,同时显示子窗体. 把子窗体的背景窗体设置如下属性(主要是背景随便改成一个图片,然后FormBorderStyle改成None, ...
- 搭建企业内部DNS服务器,docker 部署内部 dnsmasq
获取镜像 docker pull jpillora/dnsmasq 配置域名 # http://oss.segetech.com/intra/srv/dnsmasq.conf #log all dns ...
- 一个简单演示样例来演示用PHP訪问表单变量
首先编写表单页面orderform.html,用post方法请求服务端脚本文件:processorder.php orderform.html: <!DOCTYPE html> <h ...
- cs6 mac 破解方法
Photoshop CS6 重点功能: 1.Photoshop CS6 包含Photoshop CS6和Photoshop CS6 Extended中所有功能,快去试一试3D图像编辑和Photosho ...
- openwrt mt7620 内存大小检测
单独编译内核: make V=s target/linux/install 相调函数调用流程: init/main.c : start_kernel() -> setup_arch(&c ...
- Tomcat配置,Myeclipse破解和各种设置
转自:http://www.cnblogs.com/tyjsjl/archive/2006/11/14/2156111.html 根据tomcat来配置eclipse和MyEclipse结合使用起来, ...
- 关于java赋值操作的原子性问题
17.7. Non-Atomic Treatment of double and long For the purposes of the Java programming language memo ...
- 【腾讯bugly干货分享】精神哥手把手教你怎样智斗ANR
上帝说要有ANR,于是Bugly就有了ANR上报.那么ANR究竟是什么? 近期非常多童鞋问起精神哥ANR的问题,那么这次就来聊一下,鸡爪怎么泡才好吃.噢不,是怎样高速定位ANR. ANR是什么 简单说 ...
- C++使用模板、函数指针、接口和lambda表达式这四种方法做回调函数的区别比较
在C++中,两个类之间存在一种关系,某个类需要另外一个类去完成某一个功能,完成了之后需要告知该类结果,这种最普通最常见的需求,往往使用回调函数来解决. 如题,我总结下来有这么四种方式可以完成这项功能, ...
- 今日头条上看到的js面试题和答案
用js判断字符中每个字符出现的次数, 答案是var info = arr.split('').reduce((a,b)=>(console.log(a,b),a[b]++ || (a[b]=1) ...