侦察兵(特长生准备)

题目大意:

给你一个n*n的矩阵,求(x,y)左上角和右下角的值得和。n<1000 有t个(x,y),t<1000;

思路:

不可以直接暴力,因为要枚举三个变量,就是n^3,一定会超时,然后就想到二维的前缀和,在搞个后缀和。
去一个点相加就好了,时间O(n^2+n);

程序:

const
        maxn=1000;
var
        a,f,f1:array [0..maxn+1,0..maxn+1] of longint;
        i,j,n,m,t,x,y:longint;
begin
        assign(input,'scout.in'); reset(input);
        assign(output,'scout.out'); rewrite(output);
        readln(n,m);
        for i:=1 to n do
        begin
         for j:=1 to n do
          read(a[i,j]);
         readln;
        end;
        for i:=1 to n do
         for j:=1 to n do
          f[i,j]:=f[i-1,j]+f[i,j-1]-f[i-1,j-1]+a[i,j];
        for i:=n downto 1 do
         for j:=n downto 1 do
          f1[i,j]:=f1[i+1,j]+f1[i,j+1]-f1[i+1,j+1]+a[i,j];
        for i:=1 to m do
        begin
                readln(x,y);
                writeln(f[x-1,y-1]+f1[x+1,y+1]);
        end;
        close(input); close(output);
end.

你可能感兴趣的:(前缀和优化,听说瞎搞)