• UVA 11297 Census ——二维线段树


    【题目分析】

        二维线段树模板题目。

        简直就是无比的暴力。时间复杂度为两个log。

        标记的更新方式比较奇特,空间复杂度为N^2。

        模板题目。

    【代码】

    #include <cstdio>
    #include <cstring>
    //#include <cmath>
    #include <cstdlib>
     
    #include <map>
    #include <set>
    #include <queue>
    #include <string>
    #include <iostream>
    #include <algorithm>
     
    using namespace std;
    
    #define maxn 505
    #define inf 0x3f3f3f3f
    #define F(i,j,k) for (int i=j;i<=k;++i)
    #define D(i,j,k) for (int i=j;i>=k;--i)
     
    void Finout()
    {
        #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    //    freopen("out.txt","w",stdout);
        #endif
    }
     
    int Getint()
    {
        int x=0,f=1; char ch=getchar();
        while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
        while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    
    int mx[maxn<<2][maxn<<2],mn[maxn<<2][maxn<<2],rt[maxn<<2],ma[maxn][maxn],n;
    int x,y,c,tot=0,x1,x2,y1,y2;
    
    void pushup(int rt,int o)
    {
    	mx[rt][o]=max(mx[rt][o<<1],mx[rt][o<<1|1]);
    	mn[rt][o]=min(mn[rt][o<<1],mn[rt][o<<1|1]);
    }
    
    void update(int rt,int o,int l,int r)
    {
    //	printf("update %d %d %d %d
    ",rt,o,l,r);
    	if (l==r)
    	{
    		mx[rt][o]=max(mx[rt<<1][o],mx[rt<<1|1][o]);
    		mn[rt][o]=min(mn[rt<<1][o],mn[rt<<1|1][o]);
    		return;
    	}
    	int mid=l+r>>1;
    	if (y<=mid) update(rt,o<<1,l,mid);
    	else update(rt,o<<1|1,mid+1,r);
    	pushup(rt,o);
    }
    
    void push(int rt,int o,int l,int r)
    {
    	if (l==r)
    	{
    		mx[rt][o]=mn[rt][o]=c;
    		return ;
    	}
    	int mid=l+r>>1;
    	if (y<=mid) push(rt,o<<1,l,mid);
    	else push(rt,o<<1|1,mid+1,r);
    	pushup(rt,o);
    }
    
    void modi(int o,int l,int r)
    {
    	if (l==r){push(o,1,1,n);return;}
    	int mid=l+r>>1;
    	if (x<=mid) modi(o<<1,l,mid);
    	else modi(o<<1|1,mid+1,r);
    	update(o,1,1,n);
    }
    
    char opt[11];int amx,amn,q;
    
    void queryy(int rt,int o,int l,int r)
    {
    //	printf("queryy %d %d %d %d
    ",rt,o,l,r);
    	if (y1<=l&&r<=y2)
    	{
    		amx=max(amx,mx[rt][o]);
    		amn=min(amn,mn[rt][o]);
    		return ;
    	}
    	int mid=l+r>>1;
    	if (y1<=mid) queryy(rt,o<<1,l,mid);
    	if (y2>mid) queryy(rt,o<<1|1,mid+1,r);
    }
    
    void queryx(int o,int l,int r)
    {
    //	printf("query x %d %d %d
    ",o,l,r);
    	if (x1<=l&&r<=x2){ return queryy(o,1,1,n); }
    	int mid=l+r>>1;
    	if (x1<=mid) queryx(o<<1,l,mid);
    	if (x2>mid)  queryx(o<<1|1,mid+1,r);
    }
    
    int main()
    {
    	memset(mx,-0x3f,sizeof mx);
    	memset(mn, 0x3f,sizeof mn);
    	Finout();
    	n=Getint();
    	F(i,1,n) F(j,1,n)
    	{
    		x=i;y=j;
    		c=ma[i][j]=Getint();
    		modi(1,1,n);
    	}
    //	cout<<mx[1][1]<<" "<<mn[1][1]<<endl;
    	q=Getint();
    	F(i,1,q)
    	{
    		scanf("%s",opt);
    		if (opt[0]=='c')
    		{
    			x=Getint(); y=Getint(); c=Getint();
    			modi(1,1,n);
    		}
    		else
    		{
    			x1=Getint(); y1=Getint(); x2=Getint(); y2=Getint();
    			amx=-inf,amn=inf;
    			queryx(1,1,n);
    			printf("%d %d
    ",amx,amn);
    		}
    	}
    }
    

      

  • 相关阅读:
    SQLServer性能诊断与调优
    (转).NET面试题整理之基础篇
    (转)[茗洋芳竹]程序员常用不常见很难得的地址大全,博主很辛苦
    (转)页面过度动画效果大集合
    (转)软件开发和团队”最小模式”初探2-6人模型(下)
    silverlight 乐动魔方 实战九 .
    (转)js+flash实现手写输入功能特效
    (转)软件开发和团队”最小模式”初探2-6人模型(上)
    (转)我眼中的PM
    silverlight 乐动魔方 实战十 .
  • 原文地址:https://www.cnblogs.com/SfailSth/p/6344765.html
Copyright © 2020-2023  润新知