ZOJ

来源:互联网 发布:Linux修改进程名字 编辑:程序博客网 时间:2024/06/08 09:55

标记做法

这应该是正解吧,对整行整列的需要更新的用另外的两个数组标记,最后查询


#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 10000 + 7, maxd = (1<<18)-1, mod = 1e9 + 7;const int INF = 0x7f7f7f7f;int n, m;int mp[111][111];int r[111], c[111];void init() {    for(int i = 1; i <= n; ++i) {        for(int j = 1; j <= m; ++j) {            scanf("%d", &mp[i][j]);        }    }    memset(r, 0, sizeof r);    memset(c, 0, sizeof c);}void solve() {    int q, d, r1, c1, r2, c2, v;    scanf("%d", &q);    while(q--) {        scanf("%d", &d);        if(d == 0) {            scanf("%d %d %d %d %d", &r1, &c1, &r2, &c2, &v);            if(r1 != r2) {                for(int i = c1; i <= m; ++i) mp[r1][i] += v;                for(int i = 1; i <= c2; ++i) mp[r2][i] += v;            }            else for(int i = c1; i <= c2; ++i) mp[r1][i] += v;            for(int i = r1+1; i < r2; ++i) r[i] += v;        }        else if(d == 1) {            scanf("%d %d %d %d %d", &r1, &c1, &r2, &c2, &v);            if(c1 != c2) {                for(int i = r1; i <= n; ++i) mp[i][c1] += v;                for(int i = 1; i <= r2; ++i) mp[i][c2] += v;            }            else for(int i = r1; i <= r2; ++i) mp[i][c1] += v;            for(int i = c1+1; i < c2; ++i) c[i] += v;        }        else {            scanf("%d %d", &r1, &c1);            printf("%d\n", mp[r1][c1] + r[r1] + c[c1]);        }    }}int main() {    int kase = 1;    while(~scanf("%d %d", &n, &m) && n+m) {        init();        printf("Case %d\n", kase++);        solve();    }    return 0;}


原创粉丝点击