HDU 1823 二维线段树

二维线段树入门题

分别以身高和活泼度开两维

以身高-100,活泼度*10,为两个区间

所谓的二维就是在第一维查找到正确位置时,进入第二维再查找

#include "stdio.h"
#include "string.h"
double ans;
double Max(double a,double b)
{
    if (a<b) return b;else return a;
}

struct Mark
{
    int l,r;
    double x;
};
struct Data
{
    int l,r; // 身高维
    Mark mark[4010]; // 活泼度维
}data[410];

void build_sec(int l,int r,int k,int kk)
{
    int mid;
    data[k].mark[kk].l=l;
    data[k].mark[kk].r=r;
    data[k].mark[kk].x=-1;
    if (l==r) return ;
    mid=(l+r)/2;
    build_sec(l,mid,k,kk*2);
    build_sec(mid+1,r,k,kk*2+1);
}

void build_main(int l,int r,int ll,int rr,int k)
{
    int mid;
    data[k].l=l;
    data[k].r=r;
    build_sec(ll,rr,k,1);
    if (l==r) return ;

    mid=(l+r)/2;
    build_main(l,mid,ll,rr,k*2);
    build_main(mid+1,r,ll,rr,k*2+1);
}

void updata_sec(int w2,double z,int k,int kk)
{
    int mid;
    if (z>data[k].mark[kk].x) data[k].mark[kk].x=z;

    if (data[k].mark[kk].l==data[k].mark[kk].r) return ;
    mid=(data[k].mark[kk].l+data[k].mark[kk].r)/2;

    if (w2<=mid) updata_sec(w2,z,k,kk*2);
    else updata_sec(w2,z,k,kk*2+1);
}

void updata_main(int w1,int w2,double z,int k)
{
    int mid;
    updata_sec(w2,z,k,1);

    if (data[k].l==data[k].r) return ;
    mid=(data[k].l+data[k].r)/2;
    if (w1<=mid) updata_main(w1,w2,z,k*2);
    else updata_main(w1,w2,z,k*2+1);
}

double query_sec(int l,int r,int k,int kk)
{
    int mid;
    if (data[k].mark[kk].l==l && data[k].mark[kk].r==r)
        return data[k].mark[kk].x;

    mid=(data[k].mark[kk].l+data[k].mark[kk].r)/2;
    if (r<=mid) return query_sec(l,r,k,kk*2);
    else
        if (l>mid) return query_sec(l,r,k,kk*2+1);
    else
        return Max(query_sec(l,mid,k,kk*2),query_sec(mid+1,r,k,kk*2+1));
}
void query_main(int l,int r,int ll,int rr,int k)
{
    int mid;
    if (data[k].l==l && data[k].r==r)
    {
        ans=Max(ans,query_sec(ll,rr,k,1));
        return ;
    }
    mid=(data[k].l+data[k].r)/2;
    if (r<=mid) query_main(l,r,ll,rr,k*2);
    else
        if (l>mid) query_main(l,r,ll,rr,k*2+1);
    else
    {
        query_main(l,mid,ll,rr,k*2);
        query_main(mid+1,r,ll,rr,k*2+1);
    }
}
int main()
{
    int n,x,w1,w2,l1,l2,r1,r2;
    double y,z;
    char ch[10];
    while (scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        build_main(0,100,0,1000,1);
        while (n--)
        {
            scanf("%s",ch);
            if (ch[0]=='I')
            {
                scanf("%d%lf%lf",&x,&y,&z);
                w1=x-100;
                w2=y*10;
                updata_main(w1,w2,z,1);
            }
            else
            {
                scanf("%d%d%lf%lf",&l1,&r1,&y,&z);
                l1-=100;
                r1-=100;
                l2=y*10;
                r2=z*10;
                if (l1>r1) {x=l1; l1=r1; r1=x;}
                if (l2>r2) {x=l2; l2=r2; r2=x;}
                ans=-1.0;
                query_main(l1,r1,l2,r2,1);
                if (ans+1<=0.000000001)
                    printf("-1\n");
                else
                    printf("%.1lf\n",ans);
            }
        }
    }
    return 0;
}
时间: 2024-08-21 22:41:01

HDU 1823 二维线段树的相关文章

HDU 1823 二维线段树(区间max)

Luck and Love Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5262    Accepted Submission(s): 1317 Problem Description 世界上上最远的距离不是相隔天涯海角而是我在你面前可你却不知道我爱你                ―― 张小娴 前段日子,枫冰叶子给Wiskey做了

hdu 4819 二维线段树模板

/* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1010; int N, Q; struct Nodey { int l, r; int Max, Min; }; int locx[MAXN], l

二维线段树模版

HDU 4819 二维线段树模版题 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 999999999; const int maxn = 810; int a[maxn][maxn]; int st_min[maxn<<2][maxn<<2]; int st_max[maxn<<2][maxn

HDU 1823 Luck and Love 二维线段树

Problem Description 世界上上最远的距离不是相隔天涯海角 而是我在你面前 可你却不知道我爱你 ―― 张小娴 前段日子,枫冰叶子给Wiskey做了个征婚启事,聘礼达到500万哦,天哪,可是天文数字了啊,不知多少MM蜂拥而至,顿时万人空巷,连扫地的大妈都来凑热闹来了.―_―||| 由于人数太多,Wiskey实在忙不过来,就把统计的事情全交给了枫冰叶子,自己跑回家休息去了.这可够枫冰叶子忙的了,他要处理的有两类事情,一是得接受MM的报名,二是要帮Wiskey查找符合要求的MM中缘分最

hdu 1823 Luck and Love ,二维线段树

Luck and Love Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5282    Accepted Submission(s): 1324 Input 本题有多个测试数据,第一个数字M,表示接下来有连续的M个操作,当M=0时处理中止. 接下来是一个操作符C. 当操作符为'I'时,表示有一个MM报名,后面接着一个整数,H表示身

HDU 1823 Luck and Love 二维线段树(树套树)

点击打开链接 Luck and Love Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5460    Accepted Submission(s): 1364 Problem Description 世界上上最远的距离不是相隔天涯海角 而是我在你面前 可你却不知道我爱你 ―― 张小娴 前段日子,枫冰叶子给Wiskey做了个征婚启事

HDU 4819 Mosaic --二维线段树(树套树)

题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的线段树,所以没跳出来.后来熟悉了一下,原来很多细节地方都没有考虑到. 这里build,update,query都分为两个函数,第一个为Y轴的(sub_update),第二个为X轴的(update),不仅每个sub_update或sub_build后面要加Y轴的pushup函数,而且每个update或

HDU 1832 Luck and Love (二维线段树)

Problem Description 世界上上最远的距离不是相隔天涯海角 而是我在你面前 可你却不知道我爱你 ―― 张小娴 前段日子,枫冰叶子给Wiskey做了个征婚启事,聘礼达到500万哦,天哪,可是天文数字了啊,不知多少MM蜂拥而至,顿时万人空巷,连扫地的大妈都来凑热闹来了.―_―||| 由于人数太多,Wiskey实在忙不过来,就把统计的事情全交给了枫冰叶子,自己跑回家休息去了.这可够枫冰叶子忙的了,他要处理的有两类事情,一是得接受MM的报名,二是要帮Wiskey查找符合要求的MM中缘分最

HDU 4819 Mosaic (二维线段树)

Problem Description The God of sheep decides to pixelate some pictures (i.e., change them into pictures with mosaic). Here's how he is gonna make it: for each picture, he divides the picture into n x n cells, where each cell is assigned a color value