• 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
    ",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 }
  • 相关阅读:
    程序员这口饭职业规划解决方案
    Entity Framework 学习初级篇Entity SQL
    工厂方法模式与IoC/DI 4
    为NUnit制作Visual Studio模板
    Enterprise Architect 7.5(UML工具)集成到Visual Studio中(有下载)
    从事ASP.NET开发两年多,谈谈对两三年工作经验的ASP.NET程序员的基本见解
    模式讲解
    一位软件工程师的7年总结 [转]
    工厂方法模式2
    CodeDom系列1
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6347924.html
Copyright © 2020-2023  润新知