• 【BZOJ4972】小Q的方格纸 前缀和


    【BZOJ4972】小Q的方格纸

    Description

    方格纸与草稿纸一样,都是算法竞赛中不可或缺的重要工具。身经百战的小Q自然也会随身带着方格纸。小Q的方格纸有n行m列,一共n*m个方格,从上到下依次标记为第1,2,...,n行,从左到右依次标记为第1,2,...,m列,方便起见,小Q称第i行第j列的方格为(i,j)。小Q在方格纸中填满了数字,每个格子中都恰好有一个整数a_{i,j}。小Q不喜欢手算,因此每当他不想计算时,他就会让你帮忙计算。小Q一共会给出q个询问,每次给定一个方格(x,y)和一个整数k(1<=k<=min(x,y)),你需要回答由(x,y),(x-k+1,y),(x,y-k+1)三个格子构成的三角形边上以及内部的所有格子的a的和。

    Input

    第一行包含6个正整数n,m,q,A,B,C(1<=n,m<=3000,1<=q<=3000000,1<=A,B,C<=1000000)
    其中n,m表示方格纸的尺寸,q表示询问个数。
    为了防止输入数据过大,a和询问将由以下代码生成:
    unsigned int A,B,C;
    inline unsigned int rng61(){
        A ^= A << 16;
        A ^= A >> 5;
        A ^= A << 1;
        unsigned int t = A;
        A = B;
        B = C;
        C ^= t ^ A;
        return C;
    }
    int main(){
        scanf("%d%d%d%u%u%u", &n, &m, &q, &A, &B, &C);
        for(i = 1; i <= n; i++)
            for(j = 1; j <= m; j++)
                a[i][j] = rng61();
        for(i = 1; i <= q; i++){
            x = rng61() % n + 1;
            y = rng61() % m + 1;
            k = rng61() % min(x, y) + 1;
        }
    }

    Output

    为了防止输出数据过大,设f_i表示第i个询问的答案,则你需要输出一行一个整数,即:

    (sum_{i=1}^q 233^{q-i}*f_i) mod 2^{32}

    Sample Input

    3 4 5 2 3 7

    Sample Output

    3350931807

    题解:维护一个斜着的右上方前缀和,一个平着的右上方前缀和即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    typedef unsigned int ui;
    int n,m,q;
    ui A,B,C,ans,sum;
    ui a[3010][3010],s[3010][3010],h[3010][3010];
    inline unsigned int rng61(){
        A ^= A << 16;
        A ^= A >> 5;
        A ^= A << 1;
        unsigned int t = A;
        A = B;
        B = C;
        C ^= t ^ A;
        return C;
    }
    int main()
    {
    	int i,j,k,x,y;
    	scanf("%d%d%d%u%u%u", &n, &m, &q, &A, &B, &C);
        for(i = 1; i <= n; i++)
            for(j = 1; j <= m; j++)
                a[i][j] = rng61();
        for(i=1;i<=n;i++)
        {
        	for(j=m;j>=1;j--)
        	{
        		s[i][j]=s[i][j+1]+s[i-1][j+1]-s[i-1][j+2]+a[i][j];
        		h[i][j]=h[i][j+1]+h[i-1][j]-h[i-1][j+1]+a[i][j];
        	}
        }
        for(i = 1; i <= q; i++){
            x = rng61() % n + 1;
            y = rng61() % m + 1;
            k = rng61() % min(x, y) + 1;
            sum=s[x][y-k+1]-s[x-k][y+1]-h[x][y+1]+h[x-k][y+1];
            ans=ans*233+sum;
        }
        printf("%u",ans);
        return 0;
    
    }
  • 相关阅读:
    【译】常用网络端口号列表
    使用Simian进行重复代码检测
    使用GCOV进行代码覆盖率统计
    AFL Fuzz安装及完成一次简单的模糊测试
    数据可视化概述
    完成下方的 which_date() 函数,并返回某一起始时间后特定一段时间的日期
    linux用户不在sudoers文件中
    linux /lib64/libc.so.6: version `GLIBC_2.17′ not found
    web api 2.0 上传文件超过4M时,出现404错误
    Centos7 编译安装 Nginx Mariadb Asp.net Core2 (实测 笔记 Centos 7.7 + Openssl 1.1.1d + Mariadb 10.3.7 + Nginx 1.16.1 + Asp.net. Core 2 )
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7411408.html
Copyright © 2020-2023  润新知