UVA11297 Census

题目

UVA11297 Census

做法

二维线段树,单点修改,矩阵查询,树套树(\(x,y\)),维护最大值最小值废话

有一点要注意的是:\(x\)树传到\(y\)树里面修改的时候,如果\(x\)树中是叶子节点之间修改,否则在y树中还得拿\(x\)树中的左右儿子来修改

My complete code

#include<bits/stdc++.h>
using namespace std;
typedef int LL;
const LL inf=0x3f3f3f3f,maxn=2009;
LL n,xo,tmx,tmi,q;
LL Mx[maxn][maxn],Mi[maxn][maxn];
bool leaf;
void Modify1(LL now,LL l,LL r,LL c,LL val){
    if(l==r){
        if(leaf){
            Mx[xo][now]=Mi[xo][now]=val; return;
        }
        Mx[xo][now]=max(Mx[xo<<1][now],Mx[xo<<1|1][now]),
        Mi[xo][now]=min(Mi[xo<<1][now],Mi[xo<<1|1][now]);
        return;
    }
    LL mid(l+r>>1);
    if(c<=mid) Modify1(now<<1,l,mid,c,val);
    else Modify1(now<<1|1,mid+1,r,c,val);
    Mx[xo][now]=max(Mx[xo][now<<1],Mx[xo][now<<1|1]),
    Mi[xo][now]=min(Mi[xo][now<<1],Mi[xo][now<<1|1]);
}
void Modify2(LL now,LL l,LL r,LL x,LL y,LL val){
    if(l==r){
        xo=now,leaf=true; Modify1(1,1,n,y,val);
        return;
    }
    LL mid(l+r>>1);
    if(x<=mid) Modify2(now<<1,l,mid,x,y,val);
    else Modify2(now<<1|1,mid+1,r,x,y,val);
    xo=now,leaf=false; Modify1(1,1,n,y,val);
}
void Query1(LL now,LL l,LL r,LL y1,LL y2){
    if(y1<=l&&y2>=r){
        tmx=max(tmx,Mx[xo][now]),tmi=min(tmi,Mi[xo][now]);
        return;
    }
    LL mid(l+r>>1);
    if(y1<=mid) Query1(now<<1,l,mid,y1,y2);
    if(y2>mid) Query1(now<<1|1,mid+1,r,y1,y2);
}
void Query2(LL now,LL l,LL r,LL x1,LL x2,LL y1,LL y2){
    if(x1<=l&&x2>=r){
        xo=now,Query1(1,1,n,y1,y2);
        return;
    }
    LL mid(l+r>>1);
    if(x1<=mid) Query2(now<<1,l,mid,x1,x2,y1,y2);
    if(x2>mid) Query2(now<<1|1,mid+1,r,x1,x2,y1,y2);
}
int main(){
    cin>>n;
    for(LL i=1;i<=n;++i)
        for(LL j=1;j<=n;++j){
            LL val;
            cin>>val;
            Modify2(1,1,n,i,j,val);
        }
    cin>>q;
    while(q--){
        char c;scanf(" %c ",&c);
        if(c=='q'){
            LL x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2;
            tmx=-inf,tmi=inf;
            Query2(1,1,n,x1,x2,y1,y2);
            cout<<tmx<<' '<<tmi<<endl;
        }else{
            LL x,y,val; cin>>x>>y>>val;
            Modify2(1,1,n,x,y,val);
        }
    }return 0;
}

原文地址:https://www.cnblogs.com/y2823774827y/p/10348758.html

时间: 2024-11-02 20:13:16

UVA11297 Census的相关文章

UVA-11297 Census(线段树套线段树)

题目大意:二维空间点修改,询问矩形区域最值. 题目分析:还是比较简单的. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; # define LL long long # define mid (l+(r-l)/2) const int N=500; const int INF=0x7fffffff;

图像变换之Census变换

图像的Census变换 Census变换属于非参数图像变换的一种,它能够较好地检测出图像中的局部结构特征,如边缘.角点特征等.传统Census变换的基本思想是:在图像区域定义一个矩形窗口,用这个矩形窗口遍历整幅图像.选取中心像素作为参考像素,将矩形窗口中每个像素的灰度值与参考像素的灰度值进行比较,灰度值小于或等于参考值的像素标记为0,大于参考值的像素标记为1,最后再将它们按位连接,得到变换后的结果,变换后的结果是由0和1组成的二进制码流.Census变换的实质是将图像像素的灰度值编码成二进制码流

Uva 11297 Census,二维线段树,板子

维护二维矩阵. q  x1, y1, x2, y2 :   查询x1<=x<=x2, y1<=y<=y2的格子(x,y)的最大值和最小值. c    x, y, v:    修改(x,y) = v. 矩阵大小(n,m<=500). 查询次数q<=40000. #include<algorithm> using namespace std; const int INF = 1<<30; const int maxn = 2000 + 10; int

Cancer genes census

CGC,简单理解癌症基因调查.最早由sanger研究所发表于<Nature Reviews Cancers>,doi:10.1038/nrc1299 文章Summary: We have conducted a census from the literature of genes that are mutated and causally implicated in cancer development ('cancer genes'). ? So far, 291 cancer genes

UVA 11297 Census ——二维线段树

[题目分析] 二维线段树模板题目. 简直就是无比的暴力.时间复杂度为两个log. 标记的更新方式比较奇特,空间复杂度为N^2. 模板题目. [代码] #include <cstdio> #include <cstring> //#include <cmath> #include <cstdlib> #include <map> #include <set> #include <queue> #include <str

Uva 11297 Census 二维线段树

题目链接:点击打开链接 好久没发题解了, 第一维的线段树更新到底,叶子节点建一棵线段树. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #include<vector> #include<set> #include<string> #include<algorithm> usin

Uva 11297.Census——二维线段树

http://www.bnuoj.com/v3/problem_show.php?pid=19715 二维线段树模板 #include <cstring> #include <cstdio> #include <algorithm> #include <iostream> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define rep(i,n) for(int i=0

利用MATLAB进行曲线拟合

软件环境:MATLAB2013a 一.多项式拟合 多项式拟合是利用多项式最佳地拟合观测数据,使得在观测数据点处的误差平方和最小. 在MATLAB中,利用函数ployfit和ployval进行多项式拟合. 函数ployfit根据观测数据及用户指定的多项式阶数得到光滑曲线的多项式表示,polyfit的一般调用格式为:P = polyfit(x,y,n).其中x为自变量,y为因变量,n为多项式阶数. polyval的输入可以是标量或矩阵,调用格式为 pv = polyval(p,a) pv = pol

geoserver 添加图层数据

1.添加shapefile文件 首先到http://www2.census.gov/geo/tiger/TIGER2011/CONCITY/上下载名称为tl_2011_47_concity的shapefile文件,并解压到本地.解压后文件列表如下: 如果不清楚shp文件对应的地理编码,可打开prj文件查看.部分内容如下: GCS_North_American_1983对应的项目编码为4269,这个编码后边会用到.在geoserver上打开"数据"-"数据存储",点击