比赛 EYOI暨SBOI暑假快乐赛3rd 评测结果 AWWWTTTTTT
题目名称 移动电话 最终得分 10
用户昵称 湖岸与夜与咸鱼 运行时间 6.831 s
代码语言 C++ 内存使用 13.38 MiB
提交时间 2022-06-27 09:26:40
显示代码纯文本
// 河南省实验中学 2021级高中 关天泽

#include<bits/stdc++.h>
#define ll long long;
#define ull unsigned long long;

using namespace std;

int s[1200][1200] = {0} , minx = 1 , miny = 1 , S , q[1200][1200] = {0};

bool qzh(int x , int y){
    q[x][y] = q[x - 1][y] + q[x][y - 1] - q[x - 1][y - 1] + s[x][y];
}

bool step_2(){
    if(minx == 1 && miny == 1){
        q[1][1] = s[1][1];
        for(int i = 2;i <= S;i++){
            q[1][i] = q[1][i - 1] + s[1][i];
            q[i][1] = q[i - 1][1] + s[1][i];
        }
        for(int i = 2;i <= S;i++){
            for(int j = 2;j <= S;j++){
                qzh(i , j);
            }
        }
    }
    if(minx == 1 && miny != 1){
        q[1][1] = s[1][1];
        for(int i = 2;i <= S;i++){
            q[1][i] = q[1][i - 1] + s[1][i];
        }
        for(int i = 2;i <= S;i++){
            for(int j = miny;j <= S;j++){
                qzh(i , j);
            }
        }
    }
    if(minx != 1 && miny == 1){
        q[1][1] = s[1][1];
        for(int i = 2;i <= S;i++){
            q[i][1] = q[i - 1][1] + s[1][i];
        }
        for(int i = minx;i <= S;i++){
            for(int j = 2;j <= S;j++){
                qzh(i , j);
            }
        }
    }
    if(minx != 1 && miny != 1){
        for(int i = minx;i <= S;i++){
            for(int j = miny;j <= S;j++){
                qzh(i , j);
            }
        }
    }
}

int out_2(int L , int B , int R , int T){
    if(L == 1 && B == 1){
        return q[R][T];
    }
    if(L == 1 && B != 1){
        return q[R][T] - q[R][B - 1];
    }
    if(L != 1 && B == 1){
        return q[R][T] - q[L - 1][T];
    }
    if(L != 1 && R != 1){
        return q[R][T] - q[L - 1][T] - q[R][B - 1] + q[L - 1][B - 1]; 
    }
}

int main(){
	freopen("mobilephones.in","r",stdin);
	freopen("mobilephones.out","w",stdout);
    cin >> S >> S;
    for(;;){
        int lins;
        cin >> lins;
        if(lins == 1){
            int X , Y , A;
            cin >> X >> Y >> A;
            X++;
            Y++;
            s[X][Y] += A;
            minx = min(X , minx);
            miny = min(Y , miny);
        }
        if(lins == 2){
            int pig , L , B , R , T;
            step_2();
            cin >> L >> B >> R >> T;
            L++;B++;R++;T++;
            pig = out_2(L , B , R , T);
            cout << pig << endl;
        }
        if(lins == 3){
            break;
        }
    }
	return 0;
}