【模板】差分约束

#include<bits/stdc++.h>
using namespace std;
const int N = 100;
int a[N][N],n,m;
int main()
{
    scanf("%d%d",&n,&m);
    int q; 
    scanf("%d",&q);
    while(q--)
    {
        int x1, y1, x2, y2, p;
        scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &p);
        //二维差分点   左下:a[x1][y1]+=p  右上:a[x2+1][y2+1]+=p
                       //左上 a[x1][y2+1]-=p  右下a[x2+1][y1]-=p 
        a[x1][y1] += p; a[x2+1][y2+1] += p;
        a[x2+1][y1] -= p; a[x1][y2+1] -= p;
    } 

      for(int i=0;i<n;i++)
      {
          for(int j=0;j<m;j++)
          {
              a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1]; //第一次差分前缀和 每个点被覆盖过多少 
        }
    }
    
    
    //如果需要求前缀和  需要再求一次差分前缀和      
    for(int i=0;i<n;i++)
      {
          for(int j=0;j<m;j++)
          {
              a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1]; //每个点的前缀和 
        }
    }   
    //print -  (a[x2][y2] - a[x1-1][y2] - a[x2][y1-1] + a[x1-1][y1-1])  
    //范围内的和 
    return 0;
}
二维前缀和
#include <bits/stdc++.h>
using namespace std;
vector< vector<int> >a;
int main()
{
    int n,m,k,T;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int q; 
        scanf("%d",&q);
        n++,m++;
        a.resize(n+1);
        for(int i=0;i<=n;i++)
        {
            a[i].resize(m+1);
            for(int j=0;j<=m;j++) a[i][j]=0; 
        }
        while(q--)
        {
             int x1, y1, x2, y2;
             scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
             a[x1][y1]++;
             a[x2+1][y2+1]++;
             a[x2+1][y1]--; 
             a[x1][y2+1]--;
             
        }
        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1];
    
        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1];
        scanf("%d",&q);
        while(q--)
        {
            int x1, y1, x2, y2;
             scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            if(a[x2][y2] - a[x1-1][y2] - a[x2][y1-1] + a[x1-1][y1-1]==(x2-x1+1)*(y2-y1+1)) printf("YES\n");
            else printf("NO\n");
        }
    }
} 
vector

 

posted @ 2019-04-20 10:28  Dorom  阅读(108)  评论(0)    收藏  举报