uva 11992 Fast Matrix Operations
这道题很狗血啊 赋值的时候那个v是大于等于0来着,主要考察区间赋值和更新,pushdown同时要有两个操作。代码如下:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1000000+5; 6 const int INF=1000000009; 7 int sum[maxn<<2]; 8 int maxv[maxn<<2]; 9 int minv[maxn<<2]; 10 int add[maxn<<2]; 11 int setv[maxn<<2]; 12 int ansmin,ansmax; 13 int row,col; 14 void PushUp(int rt) 15 { 16 maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]); 17 minv[rt]=min(minv[rt<<1],minv[rt<<1|1]); 18 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 19 } 20 void PushDown(int rt,int len) 21 { 22 if(setv[rt]>=0) 23 { 24 add[rt<<1]=add[rt<<1|1]=0;//这一步没写好啊,要为下面的add做准备。 25 maxv[rt<<1]=minv[rt<<1]=maxv[rt<<1|1]=minv[rt<<1|1]=setv[rt]; 26 sum[rt<<1]=setv[rt]*(len-len/2); 27 sum[rt<<1|1]=setv[rt]*(len/2); 28 setv[rt<<1]=setv[rt<<1|1]=setv[rt]; 29 setv[rt]=-1; 30 } 31 if(add[rt]) 32 { 33 sum[rt<<1]+=add[rt]*(len-len/2); 34 maxv[rt<<1]+=add[rt]; 35 minv[rt<<1]+=add[rt]; 36 sum[rt<<1|1]+=add[rt]*(len/2); 37 maxv[rt<<1|1]+=add[rt]; 38 minv[rt<<1|1]+=add[rt]; 39 add[rt<<1]+=add[rt]; 40 add[rt<<1|1]+=add[rt]; 41 add[rt]=0; 42 } 43 } 44 void build(int l,int r,int rt) 45 { 46 if(l==r) 47 { 48 sum[rt]=maxv[rt]=minv[rt]=0; 49 return ; 50 } 51 int m=(l+r)>>1; 52 build(l,m,rt<<1); 53 build(m+1,r,rt<<1|1); 54 PushUp(rt); 55 } 56 void update(int L,int R,int inc,int l,int r,int rt) 57 { 58 if(L<=l&&r<=R) 59 { 60 sum[rt]+=inc*(r-l+1); 61 maxv[rt]+=inc; 62 minv[rt]+=inc; 63 add[rt]+=inc; 64 return ; 65 } 66 PushDown(rt,r-l+1); 67 int m=(l+r)>>1; 68 if(L<=m) update(L,R,inc,l,m,rt<<1); 69 if(R>m) update(L,R,inc,m+1,r,rt<<1|1); 70 PushUp(rt); 71 } 72 void set_val(int L,int R,int v,int l,int r,int rt) 73 { 74 if(L<=l&&r<=R) 75 { 76 add[rt]=0;//这一步很重要 77 maxv[rt]=minv[rt]=v; 78 sum[rt]=(r-l+1)*v; 79 setv[rt]=v; 80 return; 81 } 82 PushDown(rt,r-l+1); 83 int m=(l+r)>>1; 84 if(L<=m) set_val(L,R,v,l,m,rt<<1); 85 if(R>m) set_val(L,R,v,m+1,r,rt<<1|1); 86 PushUp(rt); 87 } 88 int query(int L,int R,int l,int r,int rt) 89 { 90 if(L<=l&&r<=R) 91 { 92 ansmin=min(ansmin,minv[rt]); 93 ansmax=max(ansmax,maxv[rt]); 94 return sum[rt]; 95 } 96 PushDown(rt,r-l+1); 97 int m=(l+r)>>1; 98 int ret=0; 99 if(L<=m) ret+=query(L,R,l,m,rt<<1); 100 if(R>m) ret+=query(L,R,m+1,r,rt<<1|1); 101 return ret; 102 } 103 int main() 104 { 105 int m; 106 while(scanf("%d%d%d",&row,&col,&m)!=EOF) 107 { 108 memset(add,0,sizeof(add)); 109 memset(setv,-1,sizeof(setv)); 110 build(1,col*row,1); 111 int com; 112 int x1,y1,x2,y2,v; 113 while(m--) 114 { 115 scanf("%d",&com); 116 if(com==1) 117 { 118 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v); 119 for(int i=x1;i<=x2;i++) 120 update((i-1)*col+y1,(i-1)*col+y2,v,1,col*row,1); 121 } 122 else if(com==2) 123 { 124 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v); 125 for(int i=x1;i<=x2;i++) 126 set_val((i-1)*col+y1,(i-1)*col+y2,v,1,col*row,1); 127 } 128 else 129 { 130 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 131 ansmax=-INF; ansmin=INF; 132 int ans=0; 133 for(int i=x1;i<=x2;i++) 134 ans+=query((i-1)*col+y1,(i-1)*col+y2,1,col*row,1); 135 printf("%d %d %d\n",ans,ansmin,ansmax); 136 } 137 } 138 } 139 return 0; 140 }