HDU 5110 Alexandra and COS

比赛的时候看完就get到是dp,然后发现要开1000*1000*1000的数组,然后就跪那里起不来了。。。

赛后看题解学会了一种好机智的姿势啊,将第一维降为√1000,对于D小于√m的用dp做,D大于√m的暴力,这样两种做法都是n^2.5,太机智了。

psum是前缀和,xpsum[k][i][j]是D为k时,第i行前j列,i-k行前j+k列,i-2k行前j+2k列...的和,f是答案。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

char str[1010];
int psum[1010][1010],xpsum[40][1010][1010],f[40][1010][1010];

int main()
{
    int n,m,q;
    int x,y,d;
    int ans;
    while(scanf("%d%d%d",&n,&m,&q)==3) {
        for(int i=1;i<=n;++i) {
            scanf("%s",str+1);
            psum[i][0]=0;
            for(int j=1;j<=m;++j) {
                psum[i][j]=psum[i][j-1]+(str[j]==‘X‘);
            }
        }
        int B=sqrt(n+0.0);
        for(int k=1;k<=B;++k) {
            for(int i=1;i<=n;++i) {
                for(int j=1;j<=m;++j) {
                    f[k][i][j]=0;
                    xpsum[k][i][j]=psum[i][j];
                    if(i-k>0) {
                        if(j+k<=m) xpsum[k][i][j]+=xpsum[k][i-k][j+k];
                        else xpsum[k][i][j]+=xpsum[k][i-k][m];
                        if(j-k>0) {
                            f[k][i][j]=f[k][i-k][j-k];
                            f[k][i][j]-=xpsum[k][i-k][j-k];
                            if(j+k<=m) f[k][i][j]+=xpsum[k][i-k][j+k];
                            else f[k][i][j]+=xpsum[k][i-k][m];
                        }
                        else {
                            if(j+k<=m) f[k][i][j]=xpsum[k][i-k][j+k];
                            else f[k][i][j]=xpsum[k][i-k][m];
                        }
                    }
                    f[k][i][j]+=psum[i][j]-psum[i][j-1];
                }
            }
        }
        while(q--) {
            scanf("%d%d%d",&x,&y,&d);
            ans=0;
            if(d>B) {
                for(int i=x;i>0;i-=d) {
                    int l=max(1,y-x+i),r=min(m,y+x-i);
                    ans+=psum[i][r]-psum[i][l-1];
                }
            }
            else {
                ans=f[d][x][y];
            }
            printf("%d\n",ans);
        }
    }
}
时间: 2024-10-14 21:58:16

HDU 5110 Alexandra and COS的相关文章

hdu 5108 Alexandra and Prime Numbers

http://acm.hdu.edu.cn/showproblem.php?pid=5108 找出最大质因子就可以. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 #define N 100000 6 using namespace std; 7 8 ll n; 9 10 11 int main() 12 { 13 while(scanf(

hdu 5108 Alexandra and Prime Numbers (水题,暴力)

Problem Description Alexandra has a little brother. He is new to programming. One day he is solving the following problem: Given an positive integer N, judge whether N is prime. The problem above is quite easy, so Alexandra gave him a new task: Given

HDU 5109 Alexandra and A*B Problem

题意: 给出数字a(<=10^4)和字符串s(|s|<=8)  求最小的b  使得a*b=t  t的子串包含s 思路: 可以构造t为 XsY 假设 |Y|=ly |s|=ls 则 t = ( X * 10^ls + s ) * 10^ly +Y 这时t%a==0  这时未知数有 X Y ly  我们可以通过枚举两个计算一个的方式达到枚举所有解的目的 考虑X的范围  我们发现构造的基础是t%a==0  也就是说我们可以只关心"取模"!!  那么X一定在0~a-1之间(这里要特

BestCoder18 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5108 题目意思:给出一个数正整数 N,N <= 1e9,现在需要找出一个最少的正整数 M,使得 N/M 是素数.如果找不到就输出0. 一开始有想过将所有 <= 1e9 的素数求出来的,不过绝对超时就放弃了:然后就开始从题目中挖掘简便的处理方法.受到求素数的方法启发,枚举的因子 i 如果在 i * i <= N 之内都没有找到符合条件的素数,那么那些 > N 的因子就更不可能了.于是时间

HDU 2297 半平面交

Run Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 640    Accepted Submission(s): 181 Problem Description Since members of Wuhan University ACM Team are lack of exercise, they plan to particip

HDU 4311&amp;4312 Meeting point-1&amp;2 (曼哈顿距离&amp;&amp;切比雪夫距离)

HDU 4311 题意:平面上有n个点,一个点(x,y)只能到达(x-1,y), (x+1,y), (x, y-1), (x, y+1)4个点.从n个点中找到一点,使其他点到此点的距离之和最小. 思路: 可以发现,两个点间距离为 |x1-x2| + |y1-y2| ,这便是两点间的曼哈顿距离. 朴素的做法是遍历所有点,枚举该点与其他点间的曼哈顿距离之和,但是会TLE: 取巧的做法是将所有点与中心点的曼哈顿距离排序,枚举中间大概250个点左右的情况比较即可(不要欺负人家数据水! 正确姿势: 用结构

HDU 2438 Turn the corner (计算几何 + 三分)

Turn the corner Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2059    Accepted Submission(s): 785 Problem Description Mr. West bought a new car! So he is travelling around the city. One day h

HDU 4998 Rotate(计算几何 绕点旋转)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4998 Problem Description Noting is more interesting than rotation! Your little sister likes to rotate things. To put it easier to analyze, your sister makes n rotations. In the i-th time, she makes every

hdu 4609 3-idiots 【FFT快(gui)速傅立叶变换】

FFT实现起来挺复杂的,开始用vector,结果发现空间超了,换成数组还是超,删掉了几个后又超时了 sin cos 函数调用次数太多了,改成乘法,还是超时 最后把FFT里的除法运算和模运算优化了一下,终于过了,排的老后面 坑,3843MS,一看时间最少的只有671MS,我都怀疑这是不是同一个算法..为毛差距这么大 #pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include