hdu_5110_Alexandra and COS(DP+分块思想)
来源:互联网 发布:dnf数据异常会封号吗 编辑:程序博客网 时间:2024/05/17 08:15
题目连接: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=1007;int dp[N][N][4],g[N][N],n,m,q;char in[N][N]; int main(){ while(~scanf("%d%d%d",&n,&m,&q)){ F(i,1,n)scanf("%s",in[i]+1); F(i,1,n)F(j,1,m)g[i][j]=g[i][j-1]+(in[i][j]=='X'); for(int i=1,*p,kk;i<=n;++i)F(j,1,m)F(k,1,3){ p=&dp[i][j][k],*p=(in[i][j]=='X'),kk=k<<1; 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-1]; } if(j+k<=m)*p+=dp[i-k][j+k][k]+g[i-k][j+k-1]-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=1,c,r,w,ret;i<=q;i++){ scanf("%d%d%d",&r,&c,&w); if(w>3){ ret=0; for(int j=r,lf=c,rt=c;j>0;j-=w,lf=max(lf-w,1),rt=min(m,rt+w)) ret+=g[j][rt]-g[j][lf-1]; printf("%d\n",ret); }else printf("%d\n",dp[r][c][w]); } } return 0;}
0 0
- hdu_5110_Alexandra and COS(DP+分块思想)
- hdu 5110 Alexandra and COS(分块,DP,预处理)
- 【HDU】5110 Alexandra and COS 分块处理
- Hdu 5110 Alexandra and COS(对距离进行分块)
- [分块 + DP] Candies and Stones
- hdu 5110 Alexandra and COS(dp)
- 分块思想
- FatMouse and Cheese 【dp思想的dfs】
- 初次接触分块思想
- 数列区间询问中的分块思想CF86D,BC#22-1004-NPY and girls
- HDU FatMouse and Cheese (记忆化搜索+dp思想)
- 【HDU 1069 】Monkey and Banana 【 求LIS的思想 DP 】
- Codeforces 611D:New Year and Ancient Prophecy DP 分块记录最后一个
- COS
- cos
- cos
- 分块(一) 分块的思想与基础功能实现
- hdu 5110 (DP+分块)
- 夏令营第一题
- NPM 使用介绍
- POJ1703-Find them, Catch them
- android隐藏虚拟键盘的代码参考
- Node.js REPL(交互式解释器)
- hdu_5110_Alexandra and COS(DP+分块思想)
- 火爆的口袋妖怪是如何开发出来的?我们带你去了解下它的开发商
- Node.js 回调函数
- Android-androidstudio懒惰开发-必备插件
- 红黑树(附完整C代码)
- 如何在安装Linux之后修改Swap分区大小
- 验证码倒计时
- Node.js 事件循环
- Android 复习6 fragment argument