zoukankan      html  css  js  c++  java
  • P4514 上帝造题的七分钟 | 二维前缀和板子

    # include <bits/stdc++.h>
    using namespace std;
    
    const int N = 2050;
    
    int n,m;
    
    int lowbit(int x) {return x & -x;}
    
    struct _2wBIT
    {
        int a[N][N];
    
        void clear(void)
        {
            for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) a[i][j] = 0;
            return;
        }
    
        void add(int x,int y,int D)
        {
            int lst = y;
            while(x <= n)
            {
                y = lst;
                while(y <= m)
                {
                    a[x][y] += D;
                    y += lowbit(y);
                }
                x += lowbit(x);
            }
            return;
        }
        int query(int x,int y)
        {
            int ans = 0;
            int lst = y;
            while(x)
            {
                y = lst;
                while(y)
                {
                    ans += a[x][y];
                    y -= lowbit(y);
                }
                x -= lowbit(x);
            }
            return ans;
        }
    }c,d,e,f;
    
    void modify(int x,int y,int D)
    {
        c.add(x,y,D);
        d.add(x,y,D * x);
        e.add(x,y,D * y);
        f.add(x,y,D * x * y);
        return;
    }
    
    int Ans(int x,int y)
    {
        return c.query(x,y) * (x + 1) * (y + 1) - d.query(x,y) * (y + 1) - e.query(x,y) * (x + 1) + f.query(x,y);
    }
    
    int main(void)
    {
        scanf("X %d%d",&n,&m);
        char opt;
        c.clear(),d.clear(),e.clear(),f.clear();
        int k = 0;
        while(cin >> opt)
        {
            int X1,Y1,X2,Y2,D;
            if(opt == 'L') 
            {
                scanf("%d%d%d%d%d",&X1,&Y1,&X2,&Y2,&D);
                modify(X1,Y1,D);
                modify(X1,Y2 + 1,-D);
                modify(X2 + 1,Y1,-D);
                modify(X2 + 1,Y2 + 1,D);
            }
            else
            {
                scanf("%d%d%d%d",&X1,&Y1,&X2,&Y2);
                printf("%d
    ",Ans(X2,Y2) - Ans(X1 - 1,Y2) - Ans(X2,Y1 - 1) + Ans(X1 - 1,Y1 - 1));
            }
        }
        return 0;
    }
    
  • 相关阅读:
    shell脚本day06-sed
    shell脚本day05-交互式输入与for语句
    shell脚本day04-if语句
    shell脚本day04-grep与正则表达式
    shell脚本day03-编程原理
    shell脚本day02-重定向与管道符
    编程原理大致介绍
    进程管理
    Linux网络
    shell脚本--grep以及正则表达式
  • 原文地址:https://www.cnblogs.com/luyiming123blog/p/P4514.html
Copyright © 2011-2022 走看看