zoukankan      html  css  js  c++  java
  • 51nod1210

    题解:

    二维树状数组,再矩阵推一下

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=210;
    int n,m,q;
    LL T[4][N][N];
    int TN,TM;
    void add(LL (*T)[N],int x,int y,LL v) 
    {
        if (!x||!y)return;
        for (int i=x;i<=TN;i+=i&-i)
         for (int j=y;j<=TM;j+=j&-j)T[i][j]+=v;
    }
    LL sum(LL (*T)[N],int x,int y) 
    {
        if (!x||!y)return 0LL;
        LL v=0;
        for (int i=x;i;i-=i&-i)
         for (int j=y;j;j-=j&-j)v+=T[i][j];
        return v;
    }
    void add(int x,int y,LL v) 
    {
        add(T[0],x,y,v);
        add(T[1],x,y,v*(-x));
        add(T[2],x,y,v*(-y));
        add(T[3],x,y,v*(-x)*(-y));
    }
    LL sum(int x, int y) 
    {
        return (x+1)*(y+1)*sum(T[0],x,y)+(y+1)*sum(T[1],x,y
        )+(x+1)*sum(T[2],x,y)+sum(T[3],x,y);
    }
    void add(int x1,int y1,int x2,int y2,LL v)
    {
        add(x1,y1,v);
        add(x2+1,y1,-v); 
        add(x1,y2+1,-v); 
        add(x2+1,y2+1,v);
    }
    LL sum(int x1, int y1, int x2, int y2) 
    {
        return sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1);
    }
    int main() 
    {
        scanf("%d%d%d",&n,&m,&q);
        TN=n;TM=m;
        for (int i=1;i<=m;i++)
         for (int j=1;j<=n;j++) 
          {
            int x;
            scanf("%d",&x);
            add(j,i,j,i,x);
          }
        for (int i=0;i<q;i++) 
         {
            int x1,y1,x2,y2,z,a;
            scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&z,&a);
            LL s = sum(x1, y1, x2, y2);
            if (s<(LL)z*(x2-x1+1)*(y2-y1+1))add(x1,y1,x2,y2,a);
         }
        for (int i=1;i<=m;i++)
         for (int j=1;j<=n;j++)
          printf("%lld%c",sum(j,i,j,i),j==n?'
    ':' ');    
    }
  • 相关阅读:
    第1章 数据结构绪论
    收集的名言警句
    Asp.net MVC知识积累
    我的书单
    ASP.NET Web API
    贱人语录
    正则表达式入门
    Lucene 3.0
    Solr之java操作
    Elasticsearch
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7612550.html
Copyright © 2011-2022 走看看