zoukankan      html  css  js  c++  java
  • HDU1823-Luck and Love-二维线段树(模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?

    pid=1823

    好吧,给这题跪了。

    。。orz....

    一道非常基础的二维线段树的模板题;

    可是细节非常多;尤其注意了;

    swap函数会丢失精度,用double就等着WA到死吧。

    orz...

    还有就是给你的区间不一定是按顺序的。得加一个推断;真的是坑。。。orz....

    #include<iostream>
    #include<string>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<map>
    #include<cmath>
    #include<stack>
    #include<set>
    #include<vector>
    #include<algorithm>
    #define LL long long
    #define inf 1<<30
    #define s(a) scanf("%d",&a)
    #define CL(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int N=5005;
    int n,a,b;
    float seg[N][N<<2];     //  表示X轴Y轴。
    void Build_2(int l,int r,int deep,int rt)       //  建y轴方向线段树(二维);
    {
        seg[deep][rt]=-1.0;
        if(l==r) return;
        int mid=(l+r)>>1;
        Build_2(l,mid,deep,rt<<1);
        Build_2(mid+1,r,deep,rt<<1|1);
    }
    void Build(int l,int r,int rt)      //  建x轴方向线段树(一维)。
    {
        Build_2(0,1000,rt,1);
        if(l==r) return;
        int mid=(l+r)>>1;
        Build(l,mid,rt<<1);
        Build(mid+1,r,rt<<1|1);
    }
    void Insert_2(int act,float love,int l,int r,int deep,int rt)  //  y轴方向更新数据;(二维)
    {
        seg[deep][rt]=max(love,seg[deep][rt]);
        if(l==r) return;
        int mid=(l+r)>>1;
        if(act<=mid) Insert_2(act,love,l,mid,deep,rt<<1);
        else Insert_2(act,love,mid+1,r,deep,rt<<1|1);
        seg[deep][rt]=max(seg[deep][rt<<1],seg[deep][rt<<1|1]);
    }
    void Insert(int h,int act,float love,int l,int r,int rt)       //  x轴,一维;
    {
        Insert_2(act,love,0,1000,rt,1);
        if(l==r) return;
        int mid=(l+r)>>1;
        if(h<=mid) Insert(h,act,love,l,mid,rt<<1);
        else Insert(h,act,love,mid+1,r,rt<<1|1);
    }
    float Query_2(int L,int R,int l,int r,int rt,int deep)     //  查询,y轴,二维;
    {
        if(L<=l&&R>=r) return seg[deep][rt];
        int mid=(l+r)>>1;
        if(R<=mid) return Query_2(L,R,l,mid,rt<<1,deep);
        else if(L>mid) return Query_2(L,R,mid+1,r,rt<<1|1,deep);
        else return max(Query_2(L,R,l,mid,rt<<1,deep),Query_2(L,R,mid+1,r,rt<<1|1,deep));
    }
    float Query(int h1,int h2,int L,int R,int l,int r,int rt)      //  x轴。一维。
    {
        if(h1<=l&&h2>=r) return Query_2(L,R,0,1000,1,rt);
        int mid=(l+r)>>1;
        if(h2<=mid) return Query(h1,h2,L,R,l,mid,rt<<1);
        else if(h1>mid) return Query(h1,h2,L,R,mid+1,r,rt<<1|1);
        else return max(Query(h1,h2,L,R,l,mid,rt<<1),Query(h1,h2,L,R,mid+1,r,rt<<1|1));
    }
    int main()
    {
        int n;
        while(~scanf("%d",&n)&&n){
            Build(100,200,1);
            char ch[5];
            while(n--){
                scanf("%s",&ch);
                if(ch[0]=='I'){
                    int h;
                    float x,y;
                    scanf("%d%f%f",&h,&x,&y);
                    Insert(h,(int)(x*10),y,100,200,1);
                }else{
                    int h1,h2;
                    float x1,x2;
                    scanf("%d%d%f%f",&h1,&h2,&x1,&x2);
                    //if(h1>h2) swap(h1,h2);          //    swap函数的使用丢失精度非常严重,得用float才干AC;
                    //if(x1>x2) swap(x1,x2);
                    if(h1>h2){ int temp=h1; h1=h2;h2=temp; }
                    if(x1>x2){ float temp=x1;x1=x2;x2=temp; }
                    float ans=Query(h1,h2,(int)(x1*10),(int)(x2*10),100,200,1);
                    if(ans==-1.0) printf("-1
    ");
                    else printf("%.1lf
    ",ans);
                }
            }
        }
        return 0;
    }
    
    


     

  • 相关阅读:
    ASP.NET MVC案例——————拦截器
    Windows Azure Virtual Network (10) 使用Azure Access Control List(ACL)设置客户端访问权限
    Windows Azure Storage (20) 使用Azure File实现共享文件夹
    Windows Azure HandBook (5) Azure混合云解决方案
    Windows Azure Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On
    Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP
    Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
    Azure China (9) 在Azure China配置CDN服务
    Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
    Windows Azure HandBook (4) 分析Windows Azure如何处理Session
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6770378.html
Copyright © 2011-2022 走看看