二维前缀和好题hdu6514

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int n,m,a[20000007];
void add(int i,int j,int val){a[(i-1)*m+j]+=val;}
int q(int i,int j)
{
    if(i==0||j==0) return 0;
    return a[(i-1)*m+j];
}
int main(){
    int p,Q;
    while(cin>>n>>m){
        cin>>p;
        int x1,y1,x2,y2;
        rep(i,1,n*m)a[i]=0;
        while(p--){
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            add(x1,y1,1);add(x1,y2+1,-1);
            add(x2+1,y1,-1);add(x2+1,y2+1,1);
        }
         rep(i,1,n)//把差分数组转化成计数数组
          rep(j,1,m){
            a[(i-1)*m+j]=q(i,j-1)+q(i-1,j)-q(i-1,j-1)+a[(i-1)*m+j];
        }
        rep(i,1,n)//大于1的当成1
          rep(j,1,m){
            if(a[(i-1)*m+j]!=0) a[(i-1)*m+j]=1;
        }
        rep(i,1,n)//把计数数组转换成二维前缀和
          rep(j,1,m){
            a[(i-1)*m+j]=q(i,j-1)+q(i-1,j)-q(i-1,j-1)+a[(i-1)*m+j];
        }
        cin>>Q;
        rep(i,1,Q){
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            int res=q(x2,y2)+q(x1-1,y1-1)-q(x1-1,y2)-q(x2,y1-1);
            if(res==(x2-x1+1)*(y2-y1+1)) printf("YES\n");
            else printf("NO\n");
        }
    }

}

原文地址:https://www.cnblogs.com/zsben991126/p/10739688.html

时间: 2024-10-02 12:27:25

二维前缀和好题hdu6514的相关文章

HDU-6514 Monitor(二维前缀和+差分)

http://acm.hdu.edu.cn/showproblem.php?pid=6514 Problem Description Xiaoteng has a large area of land for growing crops, and the land can be seen as a rectangle of n×m. But recently Xiaoteng found that his crops were often stolen by a group of people,

二维前缀和

一维前缀和 : 这个优化 , 可以在 O (1) 的时间内计算出一个序列的和 , 二维前缀和 : 对于一个矩阵 , 也可以在 O (1) 的时间内计算出矩阵 (x1~x2)( y1 ~ y2 ) 的和 . sum[ i ] [ j ] 表示矩阵 1 ~ i , 1 ~ j 的和 , 那么由容斥原理知 sum[ 0 ] [ j ] 和 sum [ i ] [ 0 ] 均为 0 . 则  s[ x1 ~ x2 ] [ y1 ~ y2 ] = sum[ x2 , y2 ] + sum [ x1 - 1

前缀和,二维前缀和!

前缀和 定义 用空间换取效率,做一个预处理,然后可以\(O(1)\)的查询某个区间的值的和. 实现 设\(s_i\)为第\(i\)个数\(a_i\)的前缀和,则\(s_i=s_i-1+a_i\) 当要查找区间的和时只要把对应的起点终点的元素相减即可. 例题 Educational Codeforces Round 30B Balanced Substring 翻译 给你一个长度至多为\(100000\)的\(01\)串,其中含有相同\(0\),\(1\)个数的子串被称为"平衡串",问你

【luogu2038】【noip2014】无线网络发射器选址 [模拟][二维前缀和]

P2038 无线网络发射器选址 这个题有很多种做法 然后就可以练很多小的算法 技巧啥的嘿嘿 首先是模拟 要开一个为128+40为边长的数组 然后枚举在20~148内以(i,j)为中心的正方形 然后再挨个挨个计算sum 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define rg register 4 #define ll long long 5 const int N=200; 6 int n,d,mp[N][N]; 7 templ

二维前缀和之激光炸弹

原题链接:https://www.acwing.com/problem/content/description/101/ 一种新型的激光炸弹,可以摧毁一个边长为 RR 的正方形内的所有的目标. 现在地图上有 NN 个目标,用整数Xi,YiXi,Yi 表示目标在地图上的位置,每个目标都有一个价值WiWi . 激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个边长为 RR 的正方形的边必须和x,yx,y 轴平行. 若目标位于爆破正方形的边上,该目标不会被摧毁. 求一颗炸弹最多能炸

openjudge1768 最大子矩阵[二维前缀和or递推|DP]

总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 的最大子矩阵是 9 2-4 1-1 8 这个子矩阵的大小是15. 输入 输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给

Good Bye 2015 C. New Year and Domino 二维前缀

C. New Year and Domino They say "years are like dominoes, tumbling one after the other". But would a year fit into a grid? I don't think so. Limak is a little polar bear who loves to play. He has recently got a rectangular grid with h rows and w

hdu 1267 下沙的沙子有几粒?(二维递推题)

题意:就是给你m个H和n个D,然后从左开始数H的累积个数总是不比D的累计数少的排列有多少种举一个测试案例吧:3个H和1个D总共有3种排列,依次是:H D H H,H H D H,H H  H D三种排列,亲~意思应该懂了吧?!呵呵... 思路:递推公式为:a[m][n]=a[m-1][n]+a[m][n-1];然后当n=0的时候无论m取何值都是1,递推公式怎么推来的呢?我现在说下我的思路吧!假设3个H和2个D是由2个H和2个D还有3个H一个D推来的,2个H和2个D总共有H D H D,H H D

计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和

题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将原矩阵顺时针旋转45°,二维前缀和预处理,然后枚举每一个可能砸到的正方形之和并取最大. 注:枚举的正方形的四个顶点必须是从原矩阵璇转过来的点,代码中用vis数组判断. #include <iostream> #include <stdio.h> #include <string.