线段树例题
一

原题链接
线段树模板
1 #include <bits/stdc++.h> 2 const int maxn=4096+5; 3 typedef long long ll; 4 ll c1[maxn][maxn],c2[maxn][maxn],c3[maxn][maxn],c4[maxn][maxn]; 5 int n,m; 6 int lowbit(int x){return x & -x;} 7 void modify(ll x,ll y,ll z){//点(x,y)增加z 8 for(int i=x;i<=n;i+=lowbit(i)) 9 for(int j=y;j<=m;j+=lowbit(j)){ 10 c1[i][j]+=z; 11 c2[i][j]+=x*z; 12 c3[i][j]+=y*z; 13 c4[i][j]+=x*y*z; 14 } 15 } 16 ll getsum(ll x,ll y){ 17 ll tot=0; 18 for(int i=x;i;i-=lowbit(i)) 19 for(int j=y;j;j-=lowbit(j)) 20 tot+=(x+1)*(y+1)*c1[i][j]-(y+1)*c2[i][j]-(x+1)*c3[i][j]+c4[i][j]; 21 return tot; 22 } 23 void Solve(){ 24 scanf("%d%d",&n,&m); 25 int ch; 26 int q; 27 scanf("%d",&q); 28 while(q--){ 29 scanf("%d",&ch); 30 if(ch==1){ 31 int x1,x2,y1,y2; 32 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 33 modify(x1,y1,1); 34 modify(x2+1,y2+1,1); 35 modify(x2+1,y1,-1); 36 modify(x1,y2+1,-1); 37 } 38 else{ 39 int x1,y1,x2,y2; 40 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 41 printf("%lld\n",(getsum(x2,y2)+getsum(x1-1,y1-1)-getsum(x2,y1-1)-getsum(x1-1,y2)) & 1); 42 } 43 } 44 } 45 int main(){ 46 Solve(); 47 return 0; 48 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}

浙公网安备 33010602011771号