• 【LIbreOJ】#6256. 「CodePlus 2017 12 月赛」可做题1


    【题意】定义一个n阶正方形矩阵为“巧妙的”当且仅当:任意选择其中n个不同行列的数字之和相同。

    给定n*m的矩阵,T次询问以(x,y)为左上角的k阶矩阵是否巧妙。n,m<=500,T<=10^5。

    【算法】数学

    【题解】

    可以证明每个矩阵是巧妙的当且仅当其每个2阶子矩阵均是巧妙的:

    必要性:若该矩阵有一个不巧妙的2阶子矩阵,则其他部分选择相同的情况下(不涉及此两行列),这两行列的和不同,所以该矩阵不是巧妙的。

    观察一个巧妙的2阶子矩阵

    a1 a2

    b1 b2

    由a1+b2=a2+b1,可得

    a2-a1=b2-b1(列间差分相等)

    b1-a1=b2-a2(行间差分相等)

    充分性:若该矩阵每个2阶子矩阵都是巧妙的,则其行差分的列差分均为0(行差分相等和列差分相等)。

    重定义每个数字为Mij=ai+bj,表示A(i,j)和A(i-1,j-1)的列差分和行差分分别为ai和bj,这样的矩阵不论如何选择排列,和均为Σai+Σbj,1<=i,j<=k,所以该矩阵是巧妙的。

    维护二维前缀和即可。

    #include<cstdio>
    #define rep(i,j,k) for(int i=j;i<=k;i++)
    int a[600][600],f[600][600],n,m,T,x,y,k;
    int main(){
        scanf("%d%d%d",&n,&m,&T);
        rep(i,1,n)rep(j,1,m)scanf("%d",&a[i][j]);
        rep(i,1,n-1)rep(j,1,m-1)f[i][j]=f[i][j-1]+(a[i][j]+a[i+1][j+1]!=a[i+1][j]+a[i][j+1]);
        rep(i,1,n-1)rep(j,1,m-1)f[i][j]+=f[i-1][j];
        while(T--){
            scanf("%d%d%d",&x,&y,&k);
            if(f[x+k-2][y+k-2]-f[x-1][y+k-2]-f[x+k-2][y-1]+f[x-1][y-1]>0)puts("N");else puts("Y");
        }
    }
    View Code
  • 相关阅读:
    drupal drush 在windows下的安装和配置
    Drupal 7 配置ckeditor和ckfinder编辑器实现图片上传--不用wysisyg
    阿里云Centos配置iptables防火墙
    25个最常用的iptables策略
    防简单攻击iptables策略
    iptables防DDOS攻击和CC攻击设置
    Linux Web服务器网站故障分析常用的命令
    Linux/CentOS防CC攻击脚本
    Map字符串类型去掉空格处理
    读文件字节流大小的动态设置
  • 原文地址:https://www.cnblogs.com/onioncyc/p/8110893.html
Copyright © 2020-2023  润新知