标签:矩阵 判断 ret open span 算法 line getch 前缀和
2017-08-27 11:11:38
writer:pprp
二维前缀和主要用到了容斥定理,具体实现还是有点复杂的
详见代码:
/* @theme:二维前缀和 @writer:pprp @declare:用到容斥定理 @date:2017/8/27 */ #include <bits/stdc++.h> using namespace std; const int maxn = 1010; int n, m, a[maxn][maxn]; //输入优化 inline int read() { int X=0,w=1; char ch=0; while(ch<‘0‘ || ch>‘9‘) { if(ch==‘-‘) w=-1; ch=getchar(); } while(ch>=‘0‘ && ch<=‘9‘) X=(X<<3)+(X<<1)+ch-‘0‘,ch=getchar(); return X*w; } inline void write(int x) { if(x<0) putchar(‘-‘),x=-x; if(x>9) write(x/10); putchar(x%10+‘0‘); } int main() { freopen("in.txt","r",stdin); n = read(); m = read(); a[0][0] = read(); //前n向子矩阵和的求法 for(int i = 1; i < n ; i++) { a[0][i] = read(); a[0][i] += a[0][i-1]; } //这段的实现比较复杂 for(int i = 1; i < n ; i++) { a[i][0] = read(); a[i][0] += a[i-1][0]; for(int j = 1; j < n ; j++) { a[i][j] = read(); //容斥原理 a[i][j] = a[i][j] + a[i-1][j] + a[i][j-1] - a[i-1][j-1]; } } for(int i = 0 ; i < m ; i++) { int x, y, x1, y1; x = read(); y = read(); x1 = read(); y1 = read(); //write(a[x1-1][y1-1]-a[x-2][y1-1]-a[x1-1][y-2]+a[x-2][y-2]); //如果这样写就有问题了,因为如果考虑边界情况,在x = 1||y = 1的时候,会减去a[x1-1][-1],减去不存在的数 //所以需要判断四种情况 if(x==1 && y==1) { write(a[x1-1][y1-1]); } else if(x==1) { write(a[x1-1][y1-1]-a[x1-1][y-2]); } else if(y==1) { write(a[x1-1][y1-1]-a[x-2][y1-1]); } else { write(a[x1-1][y1-1]-a[x-2][y1-1]-a[x1-1][y-2]+a[x-2][y-2]);//输出结果,单次O(1),总共O(m) } putchar(‘\n‘); } return 0; }
标签:矩阵 判断 ret open span 算法 line getch 前缀和
原文地址:http://www.cnblogs.com/pprp/p/7439875.html