UVa11297 Census
二维线段树
单点修改,区间查询最值。
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #define ls l,mid,rt<<1 8 #define rs mid+1,r,rt<<1|1 9 using namespace std; 10 const int mxn=510; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 struct node{ 18 int mx,mini; 19 }t[mxn<<2][mxn<<2]; 20 int ansmx,ansmi; 21 int n,m; 22 void updateY(int y,int w,int l,int r,int rt,int px){ 23 if(l==r){ 24 if(w!=1e9+7){ 25 t[px][rt].mini=t[px][rt].mx=w; 26 } 27 else{ 28 t[px][rt].mini=min(t[px<<1][rt].mini,t[px<<1|1][rt].mini); 29 t[px][rt].mx=max(t[px<<1][rt].mx,t[px<<1|1][rt].mx); 30 } 31 return; 32 } 33 int mid=(l+r)>>1; 34 if(y<=mid)updateY(y,w,ls,px); 35 else updateY(y,w,rs,px); 36 t[px][rt].mini=min(t[px][rt<<1].mini,t[px][rt<<1|1].mini); 37 t[px][rt].mx=max(t[px][rt<<1].mx,t[px][rt<<1|1].mx); 38 return; 39 } 40 void updateX(int x,int y,int w,int l,int r,int rt){ 41 if(l==r){ 42 updateY(y,w,1,n,1,rt); 43 return; 44 } 45 int mid=(l+r)>>1; 46 if(x<=mid)updateX(x,y,w,ls); 47 else updateX(x,y,w,rs); 48 updateY(y,1e9+7,1,n,1,rt); 49 return; 50 } 51 void queryY(int L,int R,int l,int r,int rt,int px){ 52 if(L<=l && r<=R){ 53 ansmi=min(ansmi,t[px][rt].mini); 54 ansmx=max(ansmx,t[px][rt].mx); 55 return; 56 } 57 int mid=(l+r)>>1; 58 if(L<=mid)queryY(L,R,ls,px); 59 if(R>mid)queryY(L,R,rs,px); 60 return; 61 } 62 void queryX(int L,int yy1,int R,int yy2,int l,int r,int rt){ 63 if(L<=l && r<=R){ 64 queryY(yy1,yy2,1,n,1,rt); 65 return; 66 } 67 int mid=(l+r)>>1; 68 if(L<=mid)queryX(L,yy1,R,yy2,ls); 69 if(R>mid)queryX(L,yy1,R,yy2,rs); 70 return; 71 } 72 int main(){ 73 int i,j,x,y,l,r,w; 74 n=read(); 75 for(i=1;i<=n;i++){ 76 for(j=1;j<=n;j++){ 77 x=read(); 78 updateX(i,j,x,1,n,1); 79 } 80 } 81 m=read(); 82 char op[5]; 83 while(m--){ 84 scanf("%s",&op); 85 if(op[0]=='q'){ 86 x=read();l=read();y=read();r=read(); 87 ansmx=-1e9;ansmi=1e9; 88 queryX(x,l,y,r,1,n,1); 89 printf("%d %d\n",ansmx,ansmi); 90 } 91 else{ 92 x=read();y=read();w=read(); 93 updateX(x,y,w,1,n,1); 94 } 95 } 96 return 0; 97 }
本文为博主原创文章,转载请注明出处。