Luck and Love 二维树状数组

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43880084/article/details/102652838

HDU

Luck and Love
Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8904 Accepted Submission(s): 2320

Problem Description
世界上上最远的距离不是相隔天涯海角
而是我在你面前
可你却不知道我爱你
―― 张小娴

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

Input
本题有多个测试数据,第一个数字M,表示接下来有连续的M个操作,当M=0时处理中止。
接下来是一个操作符C。
当操作符为‘I’时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值。 (100<=H<=200, 0.0<=A,L<=100.0)
当操作符为‘Q’时,后面接着四个浮点数,H1,H2表示身高区间,A1,A2表示活泼度区间,输出符合身高和活泼度要求的MM中的缘分最高值。 (100<=H1,H2<=200, 0.0<=A1,A2<=100.0)
所有输入的浮点数,均只有一位小数。

Output
对于每一次询问操作,在一行里面输出缘分最高值,保留一位小数。
对查找不到的询问,输出-1。

Sample Input

8
I 160 50.5 60.0
I 165 30.0 80.5
I 166 10.0 50.0
I 170 80.5 77.5
Q 150 166 10.0 60.0
Q 166 177 10.0 50.0
I 166 40.0 99.9
Q 166 177 10.0 50.0
0

Sample Output

80.5
50.0
99.9

Author
威士忌

Source
HDOJ 2007 Summer Exercise(3)- Hold by Wiskey

玄学MLE 拿着别人的AC代码调 怒怼两个小时欸 到最后也不知道为什么MLE 最下面是我最开始的码(求路过的大佬指点迷津QAQ)

AC代码

#include<cstdio>
#include<algorithm>
#include<cstring> 
using namespace std;
const double EXP = 1e-9;
const int N=1001,M=201;char s[3];
struct tree
{
    double t[N<<2];
    void up(int rt)
    {
        t[rt]=max(t[rt<<1],t[rt<<1|1]);
    }
    void build(int l,int r,int rt)
    {
        t[rt]=-1;
        if(l==r) return ;
        int mid=(l+r)>>1;
        build(l,mid,rt<<1);
        build(mid+1,r,rt<<1|1);
    }
    void update(double v,int ac,int l,int r,int rt)
    {
        if(l==r)
        {
            t[rt]=max(v,t[rt]);return ;
        }
        int mid=(l+r)>>1;
        if(ac<=mid) update(v,ac,l,mid,rt<<1);
        else update(v,ac,mid+1,r,rt<<1|1);
        up(rt);
    }
    double  query(int a1,int a2,int l,int r,int rt)
    {
        if(l>=a1&&r<=a2) return t[rt];
        int mid=(l+r)>>1;
        double s=-1;
        if(a1<=mid) s=max(s,query(a1,a2,l,mid,rt<<1));
        if(a2>mid) s=max(s,query(a1,a2,mid+1,r,rt<<1|1));
        return s;
    }
}T[M<<2];
void build(int l,int r,int rt)
{
    T[rt].build(1,1000,1);
    if(l==r)
    {
        return;
    }int mid=(l+r)>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
}
void update(int f1,int h,double v,int l,int r,int rt)
{   
    T[rt].update(v,f1,1,1000,1);
    if(l==r)
    {
        return ;
    }
    int mid=(l+r)>>1;
    if(mid>=h) update(f1,h,v,l,mid,rt<<1);
    else update(f1,h,v,mid+1,r,rt<<1|1); 
}
double query(int L,int R,int a1,int a2,int l,int r,int rt)
{
    if(l>=L&&r<=R)
    {
        return T[rt].query(a1,a2,1,1000,1);
    }
    int mid=(l+r)>>1;
    double s=-1;
    if(L<=mid) s=max(s,query(L,R,a1,a2,l,mid,rt<<1));
    if(R>mid) s=max(s,query(L,R,a1,a2,mid+1,r,rt<<1|1));
    return s;
}
int main()
{   int h,n,c,d,f1,f2;double a,b,ans;
    while(~scanf("%d",&n)&&n)
    {
        build(1,200,1);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            if(s[0]=='I'){
                scanf("%d%lf%lf",&h,&a,&b);
                 f1=int(a*10.0+EXP) ;
                update(f1,h,b,1,200,1);
            } else 
            {
                scanf("%d%d%lf%lf",&c,&d,&a,&b);
                f1=int(a*10.0+EXP);f2=int(b*10.0+EXP);
                if(f1>f2) swap(f1,f2);
                if(c>d)swap(c,d);
                 ans=query(c,d,f1,f2,1,200,1);
                if(ans==-1.0) puts("-1");
                else printf("%.1f\n",ans);
            }
        }
    }
    return 0;
}

以下MLE

include<bits/stdc++.h>
using namespace std;
int n;
struct tree
{
    double t[4010];
    void up(int rt)
    {
        t[rt]=max(t[rt<<1],t[rt<<1|1]);
    }
    void build(int rt,int l,int r)
    {
        t[rt]=-1.0;
        if(l==r) return ;
        int mid=(l+r)>>1;
        build(rt<<1,l,mid);
        build(rt<<1|1,mid+1,r);
    }
    void update(int rt,int l,int r,double v,int ac)
    {
        if(l==r)
        {
            t[rt]=v;return ;
        }
        int mid=(l+r)>>1;
        if(ac<=mid) update(rt<<1,l,mid,v,ac);
        else update(rt<<1|1,mid+1,r,v,ac);
        up(rt);
    }
    double  query(int rt,int l,int r,int a1,int a2)
    {
        if(l>=a1&&r<=a2) return t[rt];
        int mid=(l+r)>>1;
        double s=-1.0;
        if(a1<=mid) s=max(s,query(rt<<1,l,mid,a1,a2));
        if(a2>mid) s=max(s,query(rt<<1|1,mid+1,r,a1,a2));
        return s;
    }
}T[810];
void build(int rt,int l,int r)
{
    T[rt].build(1,1,1000);
    if(l==r)
    {
        return;
    }int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
}
void update(int rt,int f1,int h,double v,int l,int r)
{   
    T[rt].update(1,1,1000,v,f1);
    if(l==r)
    {
        return ;
    }
    int mid=(l+r)>>1;
    if(mid>=h) update(rt<<1,f1,h,v,l,mid);
    else update(rt<<1|1,f1,h,v,mid+1,r); 
}
double query(int rt,int L,int R,int a1,int a2,int l,int r)
{
    if(l>=L&&r<=R)
    {
        return T[rt].query(1,1,1000,a1,a2);
    }
    int mid=(l+r)>>1;
    double s=-1.0;
    if(L<=mid) s=max(s,query(rt<<1,L,R,a1,a2,l,mid));
    if(R>mid) s=max(s,query(rt<<1|1,L,R,a1,a2,mid+1,r));
    return s;
}
int main()
{
    while(~scanf("%d",&n),n)
    {
        build(1,1,200);
        char s[10];
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);int h,c,d;double a,b; 
            if(s[0]=='I'){
                scanf("%d%lf%lf",&h,&a,&b);
                int f1=(int) a*10;
                update(1,f1,h,b,1,200);
            } else 
            {
                scanf("%d%d%lf%lf",&c,&d,&a,&b);
                int f1=(int)a*10;int f2=(int )b*10;
                double ans=query(1,c,d,f1,f2,1,200);
                if(ans==-1.0) puts("-1");
                else printf("%.1lf\n",ans);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43880084/article/details/102652838