P3397 地毯
P3397 地毯
前缀和
最开始接触是在日照夏令营,lca的一段子树中加或减一个数
然后打标记,求前缀和
000+10000-100000
000111110000
二维也一样,比如对子矩阵都加1
0+100000-10
0+100000-10
0+100000-10
0+100000-10
0+100000-10
然后对整个矩阵求前缀和
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<cstring> #define inf 2147483647 #define For(i,a,b) for(register int i=a;i<=b;i++) #define p(a) putchar(a) #define g() getchar() //by war //2017.10.12 using namespace std; int n,m,sum; int t[1010][1010];//1M int flag[1010][1010];//1M int a,b,c,d; void in(int &x) { char c=g();x=0; while(c<'0'||c>'9')c=g(); while(c<='9'&&c>='0')x=x*10+c-'0',c=g(); } void o(int x) { if(x>9)o(x/10); p(x%10+'0'); } int main() { in(n),in(m); For(asd,1,m) { in(a),in(b),in(c),in(d); /*For(i,a,c) For(j,b,d) t[i][j]++;*/ For(i,a,c) flag[i][b]++,flag[i][d+1]--; } For(i,1,n+1) For(j,1,n+1) { sum+=flag[i][j],t[i][j]=sum; } For(i,1,n) { For(j,1,n) o(t[i][j]),p(' '); p('\n'); } return 0; }