hdu_5110_Alexandra and COS(DP+分块思想)
题目连接:hdu_5110_Alexandra and COS
题意:
给你一个图,X代表宝藏,然后有一个船,它的声纳的频率为D,定船到宝藏的距离为Dis=max(abs(x1-x2),abs(y1-y2)),如果D是Dis的约数并且宝藏在船的上方开角45°,那么这个船就能探测到这个宝藏,现在给你q个询问,每一个询问有一个位置x,y和一个声纳的频率D,问这个船能探测到多少宝藏
题解:
因为是45°角,所以Dis实际就是abs(y1-y2),然后我们可以对每一个D,DP它45°开角满足条件的前缀和,不过对每一个D都这样做,那肯定超时,仔细想想,D越大,直接暴力搜肯定会比DP来的快,因为直接暴力我们可以每次跳D格来找,所以这里我们就要分块,一般分为sqr=sqrt(n),不过这里我亲测出数据好像当sqr=3时,跑的速度更快,然后我就直接分为D>3和D<=3来做
这里DP的方程为:设dp[i][j][k]为第i行,第j列,声纳频率为k的开角45°满足条件的前缀和,状态转移方程为dp[i][j][k]=dp[i-k][j-k][k]+dp[i-k][j+k][k]-dp[i-2*k][j][k]+第(i-k)行中[j-k,j+k]满足条件的点
(没装画图软件,画的有点丑,将就看)下面以D为2时举例,假设我们要查询x=5,y=3这个点,红色的代表满足条件的点,蓝色的线代表范围,我们可以看到粉圈内的点加了两次,所以要减掉,对应的范围就是dp[i-2*k][j][k]
#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std; const int N=;
int dp[N][N][],g[N][N],n,m,q;
char in[N][N]; int main(){
while(~scanf("%d%d%d",&n,&m,&q)){
F(i,,n)scanf("%s",in[i]+);
F(i,,n)F(j,,m)g[i][j]=g[i][j-]+(in[i][j]=='X');
for(int i=,*p,kk;i<=n;++i)F(j,,m)F(k,,){
p=&dp[i][j][k],*p=(in[i][j]=='X'),kk=k<<;
if(i>k){
if(j>k)*p+=dp[i-k][j-k][k]+g[i-k][j]-g[i-k][j-k];
else{
*p+=g[i-k][j];
if(i>kk)*p+=dp[i-kk][j][k]+g[i-kk][j-];
}
if(j+k<=m)*p+=dp[i-k][j+k][k]+g[i-k][j+k-]-g[i-k][j];
else{
*p+=g[i-k][m]-g[i-k][j];
if(i>kk)*p+=dp[i-kk][j][k]+g[i-kk][m]-g[i-kk][j];
}
if(i>kk)*p-=dp[i-kk][j][k];
}
}
for(int i=,c,r,w,ret;i<=q;i++){
scanf("%d%d%d",&r,&c,&w);
if(w>){
ret=;
for(int j=r,lf=c,rt=c;j>;j-=w,lf=max(lf-w,),rt=min(m,rt+w))
ret+=g[j][rt]-g[j][lf-];
printf("%d\n",ret);
}else printf("%d\n",dp[r][c][w]);
}
}
return ;
}
hdu_5110_Alexandra and COS(DP+分块思想)的更多相关文章
- LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想
题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...
- Codeforces Round #319 (Div. 1)C. Points on Plane 分块思想
C. Points on Plane On a pl ...
- POJ 1947 Rebuilding Roads (树dp + 背包思想)
题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...
- Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块
题目链接: http://codeforces.com/contest/677/problem/D 题意: 让你求最短的从start->...->1->...->2->. ...
- ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...
- UVA 10891 区间DP+博弈思想
很明显带有博弈的味道.让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大.而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j.结合博弈中的思想,表示初始状态 ...
- PAT1057 stack(分块思想)
1057 Stack (30分) Stack is one of the most fundamental data structures, which is based on the princ ...
- HDOJ 4858 项目管理 ( 只是有点 莫队的分块思想在里面而已啦 )
题目: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 题意: 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! ...
- 莫队算法 sqrt(n)分块思想
在此说一下本渣对莫队算法思想的一些浅薄理解 莫队算法的思想就是对真个区间的分块,然后按照每块来分别进行计算,这样最终的复杂度可以达到n*sqrt(n) 小Z的袜子是一道非常经典的题目.:题目链接htt ...
随机推荐
- Error establishing socket解决办法
jdbc配置语句为: jdbc:microsoft:sqlserver://server_name:1433 如运行程序时出现 "Error establishing socket" ...
- WCF证书创建方法
A.创建证书: (1)将创建证书工具makecert.exe放到任意地方.可以把该文档中的makecert.exe工具复制粘贴到任意目录. (2)doc命令去到makecert.exe的路径,然后输入 ...
- MySQL DATE_FORMAT
MySQL DATE_FORMAT(date,format) 根据format字符串格式化date值 (在format字符串中可用标志符: %M 月名字(January……December) %W ...
- javascript performence
1.将脚本放在底部 javascript是阻塞式的加载,如果先加载脚本,后面的dom都没有办法进行渲染,页面会是一片空白: 采用无阻塞下载javascript a.使用<script>标签 ...
- 查看Linux系统文本编码-方便修改ssh编码一致
首先,Linux系统发行的时候全世界都一样,系统是中文的还是英文的完全取决于你选择的语言包.不同国家的人在安装使用的时候选择属于自己国家的语言包,应用程序中的语言也不是写死的,它根据系统的设置来调用相 ...
- virtualbox+centos 7 实现宿主机器互通
1.centos7iso文件 2.安装教程地址,www.aiplaypc.com/102.html 3.修改ip地址 使用命令 vi /etc/sysconfig/network-scripts/if ...
- 学习笔记——解释器模式Interpreter
解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...
- Python Cookbook - 1 - 数据结构和算法
1 序列解压:通过*来通配 *a, b = somelist, first, *mid, last = somelist, a, *b = somelist 2 使用双向队列: from col ...
- Flask -- 会话
会话session 在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名.这意味着用户可以查看你 Cookie 的内容,但却不能修改它,除非用户 ...
- js cookie 记住用户名密码
function saveUserInfo(){ if($("#remember").attr('checked')=="checked"){ var user ...